0 需求
爬取拉勾網(https://www.lagou.com/)上與“嵌入式軟件”關鍵字有關的職位信息。
1 分析
在網頁的源代碼中搜索我們所要的信息(公司名稱等),無匹配,說明是數據動態獲取的
打開檢查工具,重新刷新網頁,從Network下抓取到的包中找到返回數據的包。(可以使用XHR和JS標簽過濾)
到這里基本上是成功了一半了,剩下的就要看網站的反爬機制有多給力了
我們切換到Headers標簽看這個數據包的頭部信息:
請求的URL:https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false
請求的方式:POST(與GET相比,請求數據是在FormData中,可能有加密)
(這里比較良心,類似沒有加密的數據)
請求頭:有可能需要加上,cookies有可能會制造麻煩/(ㄒoㄒ)/~~
分析到這,就可以開始寫代碼了,遇到問題解決問題(ง •_•)ง
2 爬取
一開始肯定要假設它沒有設置什么反爬機制,寫好URL、Headers和FormData,直接調用requests.post()
過程我就不多敘述了,直接說遇到的問題:我們如上操作后會發現返回的數據是“您訪問太頻繁了”
但事實上我們根本就沒有訪問很頻繁,這便是網站設置的反爬機制,這種現象的專業名詞叫——投毒
FormData既然沒有加密數據,那么可以判定問題基本上是出在cookie上了
既然用固定的cookie不行,通過http請求和cookie的交互過程,我們就必須找到set-cookie的過程
(圖片來源:https://www.cnblogs.com/fanying/p/11650034.html)
重新回到拉勾網的頁面,清除掉現有的cookie(我是chrome,方法如下)
這時我們再刷新一下頁面,分析抓到的包(找set-cookie的包啊(๑•̀ㅂ•́)و✧)
你得找到這個包啊,注意名字不一定是這個,但是一定是有Set-Cookie參數的啊
得到了cookie了,剩下的簡單了,可以封裝一個函數執行一個get請求獲取cookie,將返回的cookie加入post請求的參數,就能獲取到你想要的數據了
3 數據的處理
得到了數據,按理說我們要對數據進行篩選-提取,這里我沒有特別的需求,僅僅是為了學習,就直接存一些關鍵信息到csv文件吧。
需要的可以用pandas、pycharts等工具進行可視化處理。
4 代碼
# -*- encoding: utf-8 -*- ''' @File : lagou.py @Time : 2020/03/30 22:12:38 @Author : bAdblocks @Version : 1.0 @Contact : betterWL@hotmail.com ''' # here put the import lib import json import requests import pprint # 格式化打印 url = "https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E6%B7%B1%E5%9C%B3&needAddtionalResult=false" headers = { # "Cookie": getCookie(), "Host": "www.lagou.com", "Origin": "https://www.lagou.com", "Referer": "https://www.lagou.com/jobs/list_%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6/p-city_215?px=default", # 防盜鏈 "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36", "X-Anit-Forge-Code": "0", "X-Anit-Forge-Token": "None", "X-Requested-With": "XMLHttpRequest" } form_data = { "first": "false", "pn": "1",# 頁碼 "kd": "嵌入式軟件" } def getCookie(): cookie_url = "https://www.lagou.com/jobs/list_%E5%B5%8C%E5%85%A5%E5%BC%8F%E8%BD%AF%E4%BB%B6/p-city_215?px=default" cookie_headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400" } cookie_r = requests.get(cookie_url,headers=cookie_headers) return cookie_r.cookies cookies = getCookie() r = requests.post(url=url, data=form_data, headers=headers,cookies=cookies) print(r.text)
data = r.json() with open('職位信息.csv',mode="w+",encoding="utf-8") as f: header = ['職位名稱', '公司全稱', '公司規模', '薪資'] f.write(','.join(header)) f.write('\n') for item in position_data: d = [item['positionName'], item['companyFullName'],item['companySize'], item['salary']] f.write(','.join(d)) f.write('\n')