一、前言
利用selenium+requests訪問頁面爬取拉勾網招聘信息
二、分析url
觀察頁面可知,頁面數據屬于動態加載 所以現在我們通過抓包工具,獲取數據包
觀察其url和參數
1
2
3
4
5
6
|
url = "https://www.lagou.com/jobs/positionajax.json?px=default&needaddtionalresult=false" 參數: city = % e5 % 8c % 97 % e4 % ba % ac = = 》城市 first = true = = 》無用 pn = 1 = = 》頁數 kd = % e6 % 95 % b0 % e6 % 8d % ae % e5 % 88 % 86 % e6 % 9e % 90 = = 》商品關鍵詞 |
所以我們要想實現全站爬取,需要有city和頁數
三、獲取所有城市和頁數
我們打開拉勾網,觀察后發現,他的數據并不是完全展示的,比如說 在城市篩選選擇全國 僅僅只顯示30頁 但總頁數是遠遠大于30頁的;我又選擇北京發現是30頁又選擇北京下的海淀區又是30頁,可能我們無法把數據全部的爬取,但我們可以盡可能的將數據多的爬取
我們為了獲取全站數據,必然離不開的有兩個參數 一個是城市一個是頁數,所以我們利用selenium自動化去獲取所有城市和對應頁數
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
def city_page( self ): city_page = {} url = "https://www.lagou.com/jobs/allcity.html?keyword=%s&px=default&companynum=0&iscompanyselected=false&labelwords=" % ( self .keyword) self .bro.get(url = url) sleep( 30 ) print ( "開始獲取城市及其最大頁數" ) if "驗證系統" in self .bro.page_source: sleep( 40 ) html = etree.html( self .bro.page_source) city_urls = html.xpath( '//table[@class="word_list"]//li/input/@value' ) for city_url in city_urls: try : self .bro.get(city_url) if "驗證系統" in self .bro.page_source: sleep( 40 ) city = self .bro.find_element_by_xpath( '//a[@class="current_city current"]' ).text page = self .bro.find_element_by_xpath( '//span[@class="span totalnum"]' ).text city_page[city] = page sleep( 0.5 ) except : pass self .bro.quit() data = json.dumps(city_page) with open ( "city_page.json" , 'w' , encoding = "utf-8" )as f: f.write(data) return city_page |
四、生成params參數
我們有了每個城市對應的最大頁數,就可以生成訪問頁面所需的參數
1
2
3
4
5
6
7
8
9
10
11
12
13
|
def params_list( self ): with open ( "city_page.json" , "r" )as f: data = json.loads(f.read()) params_list = [] for a, b in zip (data.keys(), data.values()): for i in range ( 1 , int (b) + 1 ): params = { 'city' : a, 'pn' : i, 'kd' : self .keyword } params_list.append(params) return params_list |
五、獲取數據
最后我們可以通過添加請求頭和使用params url來訪問頁面獲取數據
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
def parse_data( self ,params): url = "https://www.lagou.com/jobs/positionajax.json?needaddtionalresult=false" header = { 'referer' : 'https://www.lagou.com/jobs/list_%e6%95%b0%e6%8d%ae%e5%88%86%e6%9e%90?labelwords=&fromsearch=true&suginput=' , 'user-agent' : 'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/89.0.4389.114 safari/537.36' , 'cookie' :'' } try : text = requests.get(url = url, headers = header, params = params).text if "頻繁" in text: print ( "操作頻繁,已被發現 當前為第%d個params" % (i)) data = json.loads(text) result = data[ "content" ][ "positionresult" ][ "result" ] for res in result: with open ( ".//lagou1.csv" , "a" ,encoding = "utf-8" ) as f: writer = csv.dictwriter(f, res.keys()) writer.writerow(res) sleep( 1 ) except exception as e: print (e) pass |
六、總結
盡管數據只顯示前30頁,但數據還是未完全獲取
在利用selenium獲取城市最大頁數時 應手動登錄拉勾網,并且其在訪問過程中可能會出現驗證系統需要驗證
利用requests訪問頁面獲取數據時 盡量sleep時間長一點,操作頻繁會封ip
到此這篇關于python爬蟲之利用selenium+requests爬取拉勾網的文章就介紹到這了,更多相關selenium+requests爬取拉勾網內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/weixin_47163937/article/details/115494265