準(zhǔn)備
安裝Mongodb數(shù)據(jù)庫
其實不是一定要使用MongoDB,大家完全可以使用MySQL或者Redis颜及,全看大家喜好辨液。這篇文章我們的例子是Mongodb,所以大家需要下載它比庄。
在Windows中求妹。由于MongoDB默認(rèn)的數(shù)據(jù)目錄為C:\data\db,建議大家直接在安裝的時候更改默認(rèn)路徑為C:\MongoDB.
然后創(chuàng)建如下目錄文件:
C:\data\log\mongod.log? //用于存儲數(shù)據(jù)庫的日志
C:\data\db??? //用于存儲數(shù)據(jù)庫數(shù)據(jù)
然后在C:\MongoDB文件夾下(安裝 Mongodb 路徑)創(chuàng)建配置文件mongod.cfg佳窑。并且在配置文件里寫入以下配置:
大家記住要打開文件后綴名制恍,不然我們可能創(chuàng)建了一個mongod.cfg.txt文件。
最后我們需要打開管理員權(quán)限的 CMD 窗口神凑,執(zhí)行如下命令净神,安裝數(shù)據(jù)庫成服務(wù):
"C:\mongodb\bin\mongod.exe"--config "C:\mongodb\mongod.cfg"--install
設(shè)置為服務(wù)后,需要在管理員權(quán)限打開的windows cmd窗口用服務(wù)的方式啟動或停止MongoDB溉委。
net start mongodb??? //啟動mongodb服務(wù)
net stop mongodb???? //關(guān)閉mongodb服務(wù)
好了鹃唯,安裝好Mongodb數(shù)據(jù)庫后,我們需要安裝PyMongo瓣喊,它是MongoDB的Python接口開發(fā)包坡慌。
pip install pymongo
推薦下我自己創(chuàng)建的Python學(xué)習(xí)交流群960410445,這是Python學(xué)習(xí)交流的地方藻三,不管你是小白還是大牛洪橘,小編都?xì)g迎,不定期分享干貨棵帽,包括我整理的一份適合零基礎(chǔ)學(xué)習(xí)Python的資料和入門教程熄求。
開始
準(zhǔn)備完成后,我們就開始瀏覽拉勾網(wǎng)逗概。我們可以發(fā)現(xiàn)拉勾網(wǎng)所有的招聘職位都在左側(cè)分類里弟晚。如圖:
我們先獲取首頁HTML文件:
然后我們打開開發(fā)者工具,找到招聘職業(yè)的位置仗谆。
大家還記得BeautifulSoup的CSS選擇器吧指巡,我們直接使用.select()方法獲取標(biāo)簽信息淑履。
輸出結(jié)果:
[<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/" data-lg-tj-cid="idnull" data-lg-tj-id="4U00" data-lg-tj-no="0404">風(fēng)控總監(jiān), https://www.lagou.com/zhaopin/zongcaifuzongcai/" data-lg-tj-cid="idnull" data-lg-tj-id="4U00" data-lg-tj-no="0405">副總裁]
260
獲取到所有職位標(biāo)簽的a標(biāo)簽后隶垮,我們只需要提取標(biāo)簽的href屬性和標(biāo)簽內(nèi)內(nèi)容,就可以獲得到職位的招聘鏈接和招聘職位的名稱了秘噪。我們準(zhǔn)備信息生成一個字典狸吞。方便我們后續(xù)程序的調(diào)用。
這里我們用zip函數(shù)指煎,同時迭代兩個list蹋偏。生成一個鍵值對。
接下來我們可以隨意點擊一個職位分類至壤,分析招聘頁面的信息威始。
分頁
我們首先來分析下網(wǎng)站頁數(shù)信息。經(jīng)過我的觀察像街,每個職位的招聘信息最多不超過 30 頁黎棠。也就是說晋渺,我們只要從第 1 頁循環(huán)到第 30 頁,就可以得到所有招聘信息了脓斩。但是也可以看到有的職位招聘信息木西,頁數(shù)并不到 30 頁。以下圖為例:
如果我們訪問頁面:https://www.lagou.com/zhaopin/Java/31/
也就是第 31 頁随静。我們會得到 404 頁面八千。所以我們需要在訪問到404頁面時進(jìn)行過濾。
ifresp.status_code ==404:
????pass
這樣我們就可以放心的 30 頁循環(huán)獲得每一頁招聘信息了燎猛。
我們的每一頁url使用format拼接出來:
link ='{}{}/'.format(url, str(pages))
獲取信息
獲取到全部信息后恋捆,我們同樣的把他們組成鍵值對字典。
組成字典的目的是方便我們將全部信息保存到數(shù)據(jù)庫扛门。
保存數(shù)據(jù)
保存數(shù)據(jù)庫前我們需要配置數(shù)據(jù)庫信息:
這里我們導(dǎo)入了pymongo庫鸠信,并且與MongoDB建立連接,這里是默認(rèn)連接本地的MongoDB數(shù)據(jù)论寨。創(chuàng)建并選擇一個數(shù)據(jù)庫lagou星立,并在這個數(shù)據(jù)庫中,創(chuàng)建一個table葬凳,即url_list绰垂。然后,我們進(jìn)行數(shù)據(jù)的保存:
ifurl_list.insert_one(data):
????print('保存數(shù)據(jù)庫成功', data)
如果保存成功火焰,打印出成功信息劲装。
多線程爬取
十萬多條數(shù)據(jù)是不是抓取的有點慢,有辦法昌简,我們使用多進(jìn)程同時抓取占业。由于Python的歷史遺留問題,多線程在Python中始終是個美麗的夢纯赎。
我們把之前提取職位招聘信息的代碼谦疾,寫成一個函數(shù),方便我們調(diào)用犬金。這里的parse_link()就是這個函數(shù)念恍,他就收職位的 url 和所有頁數(shù)為參數(shù)。我們get_alllink_data()函數(shù)里面使用for循環(huán) 30 頁的數(shù)據(jù)晚顷。然后這個作為主函數(shù)傳給多進(jìn)程內(nèi)部調(diào)用峰伙。
這里是一個pool進(jìn)程池,我們調(diào)用進(jìn)程池的map方法.
map(func, iterable[,chunksize=None])
多進(jìn)程Pool類中的map方法该默,與Python內(nèi)置的map函數(shù)用法行為基本一致瞳氓。它會使進(jìn)程阻塞,直到返回結(jié)果栓袖。需要注意匣摘,雖然第二個參數(shù)是一個迭代器锅锨,但在實際使用中,必須在整個隊列都就緒后恋沃,程序才會運(yùn)行子進(jìn)程必搞。join()
方法等待子進(jìn)程結(jié)束后再繼續(xù)往下運(yùn)行,通常用于進(jìn)程間的同步.
反爬蟲處理
如果大家就這樣整理完代碼囊咏,直接就開始抓取的話恕洲。相信在抓取的不久后就會出現(xiàn)程序中止不走了。我剛剛第一次中止后,我以為是網(wǎng)站限制了我的 ip。于是我做了如下改動丐怯。