1. 程式人生 > >Python多程序抓取拉鉤網十萬資料

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。於是我做了如下改動。