- 查看網站詳細信息
首先進入網站
https://www.lagou.com/jobs/list_java?labelWords=&fromSearch=true&suginput=
注意其帶有參數,並且翻頁的時候網址並沒有發生變化
此時就只能使用F12查看其請求的接口
發現在翻頁的時候,其使用了post方式請求了如下網址
(post需要帶參數data進行訪問,data為一個字典,指定了提交的參數)

該網址返回了職位,薪酬等信息
查看其請求參數

first表示其不是第一頁
pn表示page number,即頁數
kd表示請求職位的關鍵字
- 使用requests模塊進行測試
def get_data(): ''' 輸入頁數,返回一個網頁的響應對象 ''' url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false' # 請求頭 headers = { "referer": "https://www.lagou.com/jobs/list_java?labelWords=&fromSearch=true&suginput=", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36" } data = { 'first': 'false', 'pn': '3', 'kd': 'java' } res = requests.post(url=url, headers=headers, data=data) print(res.text) return res
其返回了如下
{"status":false,"msg":"您操作太頻繁,請稍后再訪問","clientIp":"222.178.10.172","state":2402}
其可能需要在post的時候傳入cookie參數,也就是動態cookie
- 獲取cookie
通過訪問之前的網址可以獲得一個返回對象
(雖然其text屬性不可用,但是cookies屬性可以使用)
通過response.cookies可以獲得返回對象對應cookies
- 使用動態cookiess進行爬取
re_1 = requests.get(url=url_1, headers=headers) re_2 = requests.post(url=url_2, headers=headers, data=data, cookies=re_1.cookies) print(re_2.text)
第一個請求是用於獲得cookies
第二個請求使用第一個請求的cookies,這樣在每次請求接口的時候都是用的訪問主頁時獲得的cookies
- 解析返回結果
直接爬取時獲得數據是html文件
可以在瀏覽器和lxml模塊中使用xpath定位到代碼塊
然后使用正則匹配所需要的內容
此時使用返回的結果是json文件
可以使用json美化在線工具(也可以直接使用vscode來查看)來進行匹配獲得結構
然后使用json模塊將其轉換為字典進行匹配
results = json.loads(re_2.text)
- 導出文件
for i in range(15): results.loc[i,'職位'] = data['content']['positionResult']['result'][i]['positionName'] results.loc[i,'公司簡稱'] = data['content']['positionResult']['result'][i]['companyShortName'] results.loc[i,'公司全稱'] = data['content']['positionResult']['result'][i]['companyFullName'] results.loc[i,'公司規模'] = data['content']['positionResult']['result'][i]['companySize'] results.loc[i,'業務范圍'] = data['content']['positionResult']['result'][i]['industryField'] results.loc[i,'城市'] = data['content']['positionResult']['result'][i]['city'] results.loc[i,'地區'] = data['content']['positionResult']['result'][i]['district'] results.loc[i,'薪酬'] = data['content']['positionResult']['result'][i]['salary'] results.loc[i,'創建時間'] = data['content']['positionResult']['result'][i]['createTime']
匹配字典,然后導出為dataframe即可
- 編碼錯誤的解決
在使用pandas保存文件時,encoding使用utf-8時出現了亂碼,改用gbk編碼
出現了編碼錯誤
'gbk' codec can't encode character '\xae' in position 10: illegal multibyte sequence
常用的編碼,出現問題可以逐個嘗試
使用了gb18030編碼問題得到了解決
| 編碼名稱 | 用途 |
| utf8 | 所有語言 |
| gbk | 簡體中文 |
| gb2312 | 簡體中文 |
| gb18030 | 簡體中文 |
| big5 | 繁體中文 |
| big5hkscs | 繁體中文 |
