爬取51job職位資訊

2021-09-08 11:33:40 字數 4273 閱讀 7116

首先獲取一下所有城市對應的key值,找到所有城市所在的json字串,向json所在的js頁面傳送請求,獲取資訊,然後從第一頁獲取總的頁數,然後遍歷所有頁數,每到新的一頁,找到所有職位資訊的詳情頁url,遍歷詳情頁,獲取所要的職位資訊。

請求並解析城市編碼函式

:return: 返回乙個字典

"""# decode()函式預設使用utf8轉化位元組,但是51job網頁採用的是gbk編碼() charset屬性就是用來設定網頁的編碼方式的,所以需要使用decode('gbk')將bytes轉化成str,與網頁編碼方式同步!

js_connect=urlopen(

'').read(

).decode(

'gbk'

) str_list = js_connect.split(

'=')

str_dict = str_list[1]

.replace(

';','')

dic = json.loads(str_dict)

# 把json字串轉化為字典

new_dict =

for key, value in dic.items():

new_dict[value]

= key

return new_dict

class

crawler

(object):

def__init__

(self,city,keys,city_dict)

:# 該引數是用於獲取使用者輸入的查詢城市

# 查詢職位關鍵字資訊

# 鄭州:170200 北京:010000 上海:020000

# city_code=

''for key in city:

city_code+=city_dict[key]

if key!=city[-1

]:city_code+=

'%252c'

self.url=

''+ city_code +

',000000,0000,00,9,99,'

+ keys +

',2,{}.html'

defget_html

(self,page_num)

:"""

請求列表頁url,獲取網頁源**

:param page_num: 當前頁碼

:return: 返回網頁源**,交給下乙個函式 進行解析

獲取搜尋結果的總頁數

:return:

"""list_url = urlopen(self.url.

format(1

)).read(

).decode(

'gbk'

) total_pattern=re.

compile

(r'共(.*?)頁'

,re.s)

total_num=

int(re.findall(total_pattern,list_url)[0

])return total_num

defprase_html

(self,html)

:"""

解析列表頁源**,提供每乙個職位的詳情頁位址

:param html: 列表頁源**

:return:

"""if html:

detail_url_pattern = re.

compile

(r'.*?.*?'

, re.s)

#獲得詳情頁url

detail_url = re.findall(detail_url_pattern, html)

return detail_url

else

:print

('none'

)def

get_detail_html

(self,detail_url)

:"""

請求詳情頁函式

:param detail_url:

:return: 返回詳情頁源**,交給下乙個函式提取詳情頁的資料

("詳情頁請求異常:url={},error={}"

.format

(detail_url,e)

)return

none

else

:return response

defparse_detail

(self,detail_html,detail_url)

:"""

提取詳情頁資料

:return:

"""if'jobs.51job.com'

in detail_url:

# 大眾化的頁面結構

pattern=re.

compile

(r'.*?.*?(.*?).*?.*?.*?.*?(.*?)

',re.s)

result=re.findall(pattern,detail_html)[0

]print

(result)

elif

'51rz.51job.com'

in detail_url:

print

('51rz.51job.com'

,detail_url)

else

:print

('其他'

,detail_url)

if __name__==

'__main__'

: city_dict = crawler_city_num(

) city=

input

('請輸入查詢城市名稱(城市間用逗號隔開):'

)# 類似三位運算子,if條件成立就選前邊的情況,否則就是後邊的情況

city_list=city.split(

',')

if','

in city else

[city]

kw=input

('請輸入職位關鍵字:'

) obj = crawler(city=city_list,keys=kw,city_dict=city_dict)

total_num=obj.get_page_num(

)# 獲取總頁數

for number in

range(1

,total_num)

:print

('開始獲取第{}頁資料。。'

.format

(number)

) list_html=obj.get_html(number)

detail_urls=obj.prase_html(list_html)

print

(detail_urls)

for detail_url in detail_urls:

# 將detail_url交給下乙個函式去請求

detail_html= obj.get_detail_html(detail_url)

obj.parse_detail(detail_html,detail_url)

爬取51job的資訊

coding utf 8 import scrapy from items import jobspideritem class jobspider scrapy.spider name job allowed domains 51job.com start urls def parse self,...

簡易爬蟲爬取51job招聘資訊

目標 上的python相關招聘資訊 入門級別 import re import urllib.request class grab object 定義類屬性 num 0 def init self 請求的 self.url 請求頭 self.headers defopenurl self 建立請求物...

爬取51job職位資訊並且進行資料分析 製作詞云

從這個 可以發現,010000代表的就是北京的id,所以我們如果想要獲取到所有一線城市的python職位資訊,那麼就必須獲取到該城市的id.我們需要將所有的職位資訊爬取下來,所以就需要挨個進入頁面,這時候我們就要考慮幾個問題a 如何獲取到這個頁面的url b 那麼多頁,而且每個城市的頁數不一致,如何...