拉勾網數據爬取


  • 查看網站詳細信息

首先進入網站

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 繁體中文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM