Python多程序抓取拉鉤網十萬資料
準備
安裝Mongodb資料庫
其實不是一定要使用MongoDB,大家完全可以使用MySQL或者Redis,全看大家喜好。這篇文章我們的例子是Mongodb,所以大家需要下載它。
在Windows中。由於MongoDB預設的資料目錄為C:\data\db,建議大家直接在安裝的時候更改預設路徑為C:\MongoDB.
然後建立如下目錄檔案:
C:\data\log\mongod.log //用於儲存資料庫的日誌
C:\data\db //用於儲存資料庫資料
然後在C:\MongoDB資料夾下(安裝 Mongodb 路徑)建立配置檔案mongod.cfg。並且在配置檔案裡寫入以下配置:
大家記住要開啟檔案字尾名,不然我們可能建立了一個mongod.cfg.txt檔案。
最後我們需要開啟管理員許可權的 CMD 視窗,執行如下命令,安裝資料庫成服務:
"C:\mongodb\bin\mongod.exe"--config "C:\mongodb\mongod.cfg"--install
設定為服務後,需要在管理員許可權開啟的windows cmd視窗用服務的方式啟動或停止MongoDB。
net start mongodb //啟動mongodb服務
net stop mongodb //關閉mongodb服務
好了,安裝好Mongodb資料庫後,我們需要安裝PyMongo,它是MongoDB的Python介面開發包。
pip install pymongo
推薦下我自己建立的Python學習交流群960410445,這是Python學習交流的地方,不管你是小白還是大牛,小編都歡迎,不定期分享乾貨,包括我整理的一份適合零基礎學習Python的資料和入門教程。
開始
準備完成後,我們就開始瀏覽拉勾網。我們可以發現拉勾網所有的招聘職位都在左側分類裡。如圖:
我們先獲取首頁HTML檔案:
然後我們開啟開發者工具,找到招聘職業的位置。
大家還記得BeautifulSoup的CSS選擇器吧,我們直接使用.select()方法獲取標籤資訊。
輸出結果:
[<a class="curr"href="https://www.lagou.com/zhaopin/Java/"data-lg-tj-cid="idnull"data-lg-tj-id="4O00"data-lg-tj-no="0101">Java</a>, <a class="curr"href="https://www.lagou.com/zhaopin/C%2B%2B/"data-lg-tj-cid="idnull"data-lg-tj-id="4O00"data-lg-tj-no="0102">C++</a>, # ... 省略部分 https://www.lagou.com/zhaopin/fengxiankongzhizongjian/" rel="nofollow" data-lg-tj-cid="idnull" data-lg-tj-id="4U00" data-lg-tj-no="0404">風控總監, https://www.lagou.com/zhaopin/zongcaifuzongcai/" rel="nofollow" data-lg-tj-cid="idnull" data-lg-tj-id="4U00" data-lg-tj-no="0405">副總裁]
260
獲取到所有職位標籤的a標籤後,我們只需要提取標籤的href屬性和標籤內內容,就可以獲得到職位的招聘連結和招聘職位的名稱了。我們準備資訊生成一個字典。方便我們後續程式的呼叫。
這裡我們用zip函式,同時迭代兩個list。生成一個鍵值對。
接下來我們可以隨意點選一個職位分類,分析招聘頁面的資訊。
分頁
我們首先來分析下網站頁數資訊。經過我的觀察,每個職位的招聘資訊最多不超過 30 頁。也就是說,我們只要從第 1 頁迴圈到第 30 頁,就可以得到所有招聘資訊了。但是也可以看到有的職位招聘資訊,頁數並不到 30 頁。以下圖為例:
如果我們訪問頁面:https://www.lagou.com/zhaopin/Java/31/
也就是第 31 頁。我們會得到 404 頁面。所以我們需要在訪問到404頁面時進行過濾。
ifresp.status_code ==404:
pass
這樣我們就可以放心的 30 頁迴圈獲得每一頁招聘資訊了。
我們的每一頁url使用format拼接出來:
link ='{}{}/'.format(url, str(pages))
獲取資訊
獲取到全部資訊後,我們同樣的把他們組成鍵值對字典。
組成字典的目的是方便我們將全部資訊儲存到資料庫。
儲存資料
儲存資料庫前我們需要配置資料庫資訊:
這裡我們匯入了pymongo庫,並且與MongoDB建立連線,這裡是預設連線本地的MongoDB資料。建立並選擇一個數據庫lagou,並在這個資料庫中,建立一個table,即url_list。然後,我們進行資料的儲存:
ifurl_list.insert_one(data):
print('儲存資料庫成功', data)
如果儲存成功,打印出成功資訊。
多執行緒爬取
十萬多條資料是不是抓取的有點慢,有辦法,我們使用多程序同時抓取。由於Python的歷史遺留問題,多執行緒在Python中始終是個美麗的夢。
我們把之前提取職位招聘資訊的程式碼,寫成一個函式,方便我們呼叫。這裡的parse_link()就是這個函式,他就收職位的 url 和所有頁數為引數。我們get_alllink_data()函式裡面使用for迴圈 30 頁的資料。然後這個作為主函式傳給多程序內部呼叫。
這裡是一個pool程序池,我們呼叫程序池的map方法.
map(func, iterable[,chunksize=None])
多程序Pool類中的map方法,與Python內建的map函式用法行為基本一致。它會使程序阻塞,直到返回結果。需要注意,雖然第二個引數是一個迭代器,但在實際使用中,必須在整個佇列都就緒後,程式才會執行子程序。join()
方法等待子程序結束後再繼續往下執行,通常用於程序間的同步.
反爬蟲處理
如果大家就這樣整理完程式碼,直接就開始抓取的話。相信在抓取的不久後就會出現程式中止不走了。我剛剛第一次中止後,我以為是網站限制了我的 ip。於是我做了如下改動。