Python拉勾爬蟲 以深圳地區資料分析師為例

2022-07-05 17:36:12 字數 3013 閱讀 7810

拉勾因其結構化的資料比較多因此過去常常被爬,所以在其多次改版之下變得難爬。不過只要清楚它的原理,依然比較好爬。其機制主要就是ajax非同步載入json資料,所以至少在搜尋頁面裡翻頁url不會變化,而且資料也不會出現在源**裡。

這是深圳地區的資料分析師頁面,用chrome檢查開啟。在xhr中可以看到乙個以postionajax.json開頭的指令碼,開啟preview看一下,可以看到:

可以發現這些資料與前端的資料一致,此時我們已經找到了資料入口,就可以開始爬了。

在headers裡可以檢視請求方式:

request header:

request url:深圳&needaddtionalresult=false

request method:post

status code:200 ok

remote address:106.75.72.62:443

從request header中可以看到,是用post提交表單方式查詢的(所以如果你直接點開request url你會發現資料不對,因為沒有提交表單資料)。

那麼我們就可以在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迴圈啊,過於菜了 其次,在程式設計時候沒有形成框架,沒頭沒腦的開...