拉勾因其結構化的資料比較多因此過去常常被爬,所以在其多次改版之下變得難爬。不過只要清楚它的原理,依然比較好爬。其機制主要就是ajax非同步載入json資料,所以至少在搜尋頁面裡翻頁url不會變化,而且資料也不會出現在源**裡。
這是深圳地區的資料分析師頁面,用chrome檢查開啟。在xhr中可以看到乙個以postionajax.json開頭的指令碼,開啟preview看一下,可以看到:
可以發現這些資料與前端的資料一致,此時我們已經找到了資料入口,就可以開始爬了。
在headers裡可以檢視請求方式:
request header:從request header中可以看到,是用post提交表單方式查詢的(所以如果你直接點開request url你會發現資料不對,因為沒有提交表單資料)。request url:深圳&needaddtionalresult=false
request method:post
status code:200 ok
remote address:106.75.72.62:443
那麼我們就可以在python中構造請求頭以及提交表單資料來訪問:
import requests
import time
from sqlalchemy import create_engine
import pandas as pd
from random import choice
import json
import numpy
engine=create_engine(#這裡填你自己資料庫的引數#) # 連線資料庫
dl = pd.read_sql("proxys",engine)
def get_proxy(dl):
n = choice(range(1, len(dl.index)))
proxy =
return(proxy)
def get_header():
headers =
return(headers)
def get_form(i):
data=
return(data)
districts = ["南山區","福田區","寶安區","龍崗區","龍華新區","羅湖區","鹽田區","大鵬新區"]
pagenos = [22,10,1,4,1,2,1,1]
url_lists = ["深圳&district=%s&needaddtionalresult=false"%area for area in districts]
s = requests.session()
s.keep_alive = false
s.adapters.default_retries = 10
def get_jobinfo(i,j): # i表區號,j表頁數
if i >= 8 or j > pagenos[i]:
return("索引超標!")
resp=s.post(url_lists[i], data=get_form(j), headers=get_header())
resp.encoding="utf-8"
max_num = len(json.loads(resp.text)["content"]["positionresult"]["result"])
for k in range(max_num):
try:
json_data=json.loads(resp.text)["content"]["positionresult"]["result"][k]
df = pd.dataframe(dict(
# businesszones=json_data["businesszones"],
companyid=json_data["companyid"],
# companylabellist=json_data["companylabellist"],
companyshortname=json_data["companyshortname"],
companysize=json_data["companysize"],
createtime=json_data["createtime"],
education=json_data["education"],
financestage=json_data["financestage"],
firsttype=json_data["firsttype"],
industryfield=json_data["industryfield"],
jobnature=json_data["jobnature"],
positionadvantage=json_data["positionadvantage"],
positionid=json_data["positionid"],
positionname=json_data["positionname"],
salary=json_data["salary"],
secondtype=json_data["secondtype"],
workyear=json_data["workyear"],
scrapy_time=time.strftime('%y-%m-%d %h:%m:%s', time.localtime(time.time()))),index=[0])
except:
print("第%d區,第%d頁,第%d個出錯了!"%(i,j,k))
以上這個函式就可以通過提交區和頁數,返回當前頁的職位數。
其實ajax返回json資料的方式也有好處,資料都是規整的,不必花太多時間精力在資料清洗上。
不過注意要加延時,拉勾的反爬蟲措施還是比較嚴的,不加延時爬一小會兒就會被封ip。
Python爬蟲拉勾網 以北京地區資料分析為例
拉勾作為典型的網際網路公司,其資料內容或其形式的所需性,常常成為很多爬蟲新手或資料分析職位的人練習爬蟲的目標 也是由於其目標靶向性太強,拉勾經過重重改版變的愈加難爬。對於新手的我,真的是踩過了所有的坑,才能上岸啊。回頭看看,其實也不過是反爬機制太強,我們只要做好反反爬就好了。目標 資料原理 拉勾網 ...
資料分析師之如何學好Python(二)
我們既然提到的python的哲學,那麼我們就給大家講一講python 的哲學,其內容就是用一種方法,最好是只有一種方法來做一件事。學習也是一樣,雖然學習的資料有很多,但實際學習的時候,最好只選擇其中的乙個,堅持看完。當然必要的時候,我們需要閱讀講解資料結構和演算法的書,這些知識對於理解和使用 pyt...
python 超菜der資料分析師筆試
今天透小菜參加了xx的資料分析實習生的筆試,五道程式設計題目,還有兩道都沒來得及讀,前面三道通過率也沒達到百分之百。別問我為什麼這麼菜,我也不知道自己為啥子這麼菜,現在來反思一下下,首先,當然 練得不夠多是乙個原因,我發現我只會用for迴圈啊,過於菜了 其次,在程式設計時候沒有形成框架,沒頭沒腦的開...