1.準備環境
- python環境:3.10
2.常用庫
1.請求庫:實現 HTTP 請求操作
- requests:基于 urllib 編寫的,阻塞式 HTTP 請求庫,發出一個請求,一直等待服務器響應后,程序才能進行下一步處理。
- selenium:自動化測試工具。一個調用瀏覽器的 driver,通過這個庫你可以直接調用瀏覽器完成某些操作,比如輸入驗證碼。
2.解析庫:從網頁中提取信息
- Beautifulsoup:html 和 XML 的解析,從網頁中提取信息,同時擁有強大的API和多樣解析方式。
- lxml:支持HTML和XML的解析,支持XPath解析方式,而且解析效率非常高。
- json:可以將數據格式轉化為json格式更便于解析讀取。
- re:利用正則表達式提取數據。
3.其他常用庫
- fake_useragent庫
引入:from fake_useragent import UserAgent
用法:實現請求頭偽裝
# 請求頭偽裝
ua = UserAgent()
header = {
'User-Agent':ua.chrome}
3.安裝方式
添加庫的方法:
1.Windows+R打開運行,然后輸入CMD進入命令提示符。
2.輸入:where python 。就會反饋出python安裝地址。
3.cd C:\Program Files\Python39\Scripts(cd+安裝目錄下的Scripts文件夾,可以先找到文件夾,以防找錯地址)
4.輸入各種更新語句
更新pip:python -m pip install --upgrade pip
更新某庫(如requests庫):pip install requests
更新某庫指定版本:pip install bert4keras==0.5.9
pip換源
通過pip install添加庫時會因為從國外地址下載,連接速度特別慢。國內一些有擔當的高校和公司會通過建立鏡像源,來幫助國內用戶從其服務器下載,更方便去學習python。
換源語句
換源如:換阿里源語句
pip config set global.index-url http://mirrors.aliyun.com/pypi/simple/
pip config set global.trusted-host mirrors.aliyun.com
一些其他源
國內源:
清華:Simple Index
阿里云:Simple Index
中國科技大學 Verifying - USTC Mirrors
華中理工大學:http://pypi.hustunique.com/
山東理工大學:Loading...
豆瓣:http://pypi.douban.com/simple/
庫的查詢方法
pip list
我們可以通過命令查看python安裝了哪些庫,cmd直接輸入pip list,可以看到所有庫和版本。
4.發送請求
1.請求準備
- url請求鏈接,首先是寫入準備要請求的url
- header請求頭,有些網站會對user-agent進行校驗來區分爬蟲和瀏覽器請求,這里我們可以利用fake_useragent庫里的ua.chrome方法來偽裝我們的user-agent
url = 'http://www.baidu.com'
header = {'User-Agent': ua.chrome
}
2.請求方式
這里我們主要介紹兩種最主要的請求方式
1.get請求
url = 'https://www.baidu.com'
header = {'User-Agent':ua.chrome
}
response = requests.get(url=url,headers=header,params=None)
這里requests.get()后面包含了多個參數,params是攜帶的參數,這里可能涉及到分頁或者其他屬性等等。
查看響應狀態碼和響應文本
print(response.status_code)
print(response.text)
- 常見的響應狀態碼:
200 ok:請求成功
301 Move Permanently:永久重定向,以前的url已經過期
302 found:臨時重定向
403 Forbidden:服務器拒絕訪問
404 not found:資源未找到
500 Internal Server Error:服務器內部錯誤
這里我們請求百度,響應狀態碼200,請求成功,獲得的文本就是網頁的內容。
2.post請求
這里我們以請求廣州市政府政策為例:
url = 'http://search.gd.gov.cn/api/search/all'
header = {'User-Agent': ua.chrome
}
d = {'gdbsDivision': "440100",'keywords': "人才",'page': 1,'position': "title",'range': "site",'recommand': 1,'service_area': 200,'site_id': "200001",'sort': "time"
}
response = requests.post(url=url, headers=header, data=d)
這里的data是post請求必須攜帶的請求參數,服務器會進行校驗,根據你請求的數據來返回你想要的數據。
3.selenium模擬瀏覽器請求
作用:常用于一些數據屬于懶加載,請求不到完整數據。或者是存在反爬,cookie,wordtoken校驗時無法獲取數據時,模擬真實瀏覽器向服務器發出請求,獲取網頁源代碼再進行解析
a.前置環境
chrome瀏覽器和對應的chromedriver版本(117對應117版本 不能高也不能低)
Chromedriver下載地址:國內鏡像網站CNPM Binaries Mirror
b.發送請求
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.shanghai.gov.cn/'
browser.get(url)
依靠上述代碼,就已經對瀏覽器發出了請求,我們可以通過xpath對頁面上的各種輸入框,按鈕等各種組件進行定位,操控瀏覽器進行數據請求的操作。常常配合time.sleep()來等待服務器數據加載。
path = 'chromedriver.exe'
browser = webdriver.Chrome(path)
url = 'https://www.shanghai.gov.cn/'
browser.get(url)
time.sleep(1)
# 通過xpath定位輸入框
input_area = browser.find_element_by_xpath('//*[@id="search-input"]')
# 定位按鈕
button = browser.find_element_by_xpath('//*[@id="searchBtn"]')
# 往輸入框內輸入內容
input_area.send_keys('人才政策')
# 點擊按鈕
button.click()
time.sleep(1)
# 切換瀏覽器頁面
browser.switch_to_window(browser.window_handles[1])
print(browser.title)
print('finish')
# 關閉瀏覽器
browser.quit()
這時我們進入了頁面,頁面上的數據都可以通過xpath或則bs來進行提取。
5.解析響應數據
1.解析json格式數據
json_data = json.loads(response.text)
直接調用json庫的loads方法,將響應數據解析成json格式數據之后,json_data對象的類型變成了一個dict字典類型,更方便索引讀取響應數據。
2.etree的xpath解析
etree可以解析文本也可以解析HTML超文本標記
tree = etree.HTML(response.text)
# /html/body/div/div[1]/table/tbody/tr[16]/td[2]/a 2-16
# /html/body/div/div[1]/table/tbody/tr[16]/td[4]
for i in range(2,17):title = tree.xpath('/html/body/div/div[1]/table/tbody/tr['+str(i)+']/td[2]/a/text()')[0]href = tree.xpath('/html/body/div/div[1]/table/tbody/tr['+str(i)+']/td[2]/a/@href')[0]ts = tree.xpath('/html/body/div/div[1]/table/tbody/tr['+str(i)+']/td[4]/text()')[0].strip()
這里我們解析HTML通過xpath路徑直接獲取對應的web元素,可以進行多次解析,返回的對象是一個list列表。
可以通過/text()來獲取文本內容,通過/@href來獲取對應的屬性值。
6.數據存儲
1.寫文件
f = open('文件名.txt', mode='w', encoding="utf-8")
f.write('寫入文件的內容')
# 關閉文件 自動刷新寫入內容
f.close()
2.寫入excel表格
# 引入相關庫
import xlwt
import xlrd# 創建workbook對象 工作簿
workbook = xlwt.Workbook(encoding='utf-8')
# 工作表
worksheet = workbook.add_sheet("sheet1", cell_overwrite_ok=True) # 默認是不可覆蓋 改為可以覆蓋內容 這樣可以實時更新表單
# 設置單元格寬度
worksheet.col(5).width = 256 * 40
worksheet.col(1).width = 256 * 40
# worksheet.col(4).width = 256 * 12
# 寫入標題
# 第0列 0行 寫入'內容'
worksheet.write(0,0,'內容')
# 保存并命名工作簿
workbook.save('gz.xls')