全部的**見我的github
這裡改進了一下之前文章-拉勾網職位資料爬取,由於拉勾網最多隻會顯示30頁的職位資訊,為了獲取更多的職位資訊,就要分類爬取。
由於北京的python職位很多,超過了30頁的部分就不顯示了,我為了能夠比較全的爬取資料,就進行了分類爬取。這裡我選擇公司規模這個類別:
小於15人 15-50人 50-150人 150-500人 500-2000人 2000人以上
這個類別不會重複,而且每個小類下的資料也不會超過30頁。
這個類別不同體現在url上,下面是小於15人
的url:
%b0%91
%e4%ba
%8e15
%e4%ba
%ba&city=%e5
%8c%97
%e4%ba
%ac&needaddtionalresult=false&isschooljob=1
其中gm=%e5%b0%91%e4%ba%8e15%e4%ba%ba
就是小於15人
。
下面是全部類別的公司規模部分的**:
小於15人 gm=%e5
%b0%91
%e4%ba
%8e15
%e4%ba
%ba15-15人 gm=15-50
%e4%ba
%ba50-150人 gm=50-150
%e4%ba
%ba150-500人 gm=150-500
%e4%ba
%ba500-2000人 gm=500-2000
%e4%ba
%ba2000人以上 gm=2000
%e4%ba
%ba%e4
%bb%a5
%e4%b8
%8a
總頁面數其實在post請求後發回來的json資料中。
result['content']['positionresult']['totalcount']
迴圈公司規模這個類別,然後在每個分類下找到頁面數,然後用之前寫好的方法進行爬取。
import requests
from fake_useragent import useragent
from lxml import etree
import csv
import json
import time
import pandas as pd
請求頭是為了反反爬蟲的,表單是用來post請求時提交的。
host = "www.lagou.com"
origin = ""
referer = "/jobs/list_python?px=default&gx=&isschooljob=1&city=%e6%9d%ad%e5%b7%9e"
ua = useragent()
headers =
data=
下面的url中的gm部分被替換為{}
,後面根據類別來補全。
url = "/jobs/positionajax.json?px=default&gm={}&city=%e5%8c%97%e4%ba%ac&needaddtionalresult=false&isschooljob=1"
下面是公司規模的類別字典列表。這是用來補全到url的gm引數中的。
gm_list = [,,,
,,
]
def
getposition
(url,headers,data,page):
data['pn'] = str(page)
response = requests.post(url,headers = headers,data = data)
print(response.status_code)
result = response.json()
if result['success']:
print("正常獲取")
position = result['content']['positionresult']['result']
totalcount = result['content']['positionresult']['totalcount'] #返回的職位總數(用來計算頁數)
pagecount = int(totalcount)//15 + 1
#每頁15條職位,這裡向下整除15
time.sleep(1) # 獲取正常的情況下延時1s請求一次
return position,pagecount
else:
print("您操作太頻繁,請稍後再訪問")
time.sleep(10) # 出現異常時,間隔10s後再獲取
position,pagecount = getposition(url,headers,data,page) #遞迴獲取
return position,pagecount
這裡通過迴圈整個類別字典來依次爬取對應類別的全部職位資訊。主要就是:
for gm in gm_list:
gm_url = url.format(gm['url'])
...#對應類別的職位資訊爬取過程
...#下面是儲存到csv檔案
total_df.to_csv('python-school-beijing-{}.csv'.format(gm['class']), sep = ',', header = true, index = false)
for gm in gm_list:
gm_url = url.format(gm['url'])
#下面是尋找「總頁面」(pagecount)的過程
position,pagecount = getposition(gm_url,headers,data,page = 1)
#下面是初始化total_df過程
df = pd.dataframe(position)
total_df = df
#如果只有一頁,那麼直接得到了所有的職位資料total_df
if pagecount > 1:
for page in range(2,pagecount+1): #注意:第一頁的資料已經儲存起來了,這裡從第二頁開始
position,_ = getposition(gm_url,headers,data,page)
df = pd.dataframe(position)
total_df = pd.concat([total_df,df],axis = 0)
#下面輸出一定資訊到控制台
print("{}".format(gm['class']) + '\n' + '總頁數為:' + str(pagecount))
total_df.info()
#下面是儲存到csv檔案
total_df.to_csv('python-school-beijing-{}.csv'.format(gm['class']), sep = ',', header = true, index = false)
全部的**見我的github 初級爬蟲 爬取拉勾網職位資訊
主要用到的庫 requests 1.原始url位址,我們檢視網頁源 發現裡面並沒有我們想要的職位資訊,這是因為拉勾網有反爬蟲機制,它的職位資訊是通過ajax動態載入的。2.我們按下f12,找到network 在左側name中找到 positionajax.json?needaddtionalresu...
scrapy爬蟲之爬取拉勾網職位資訊
import scrapy class lagouitem scrapy.item define the fields for your item here like name scrapy.field positionid scrapy.field 職位id,作為辨識字段插入資料庫 city sc...
爬取拉勾網職位資訊並存為json檔案
from bs4 import beautifulsoup import requests import re import pymongo import json client pymongo.mongoclient localhost 27017 lagou client lagou sheet...