最近泡在各大房源網(wǎng)站收集房源信息,突發(fā)奇想利用PYTHON爬蟲(chóng)技術(shù)收集房源信息,直接在本地文件夾實(shí)現(xiàn)快速游覽房源的戶型、價(jià)格、小區(qū)信息。本來(lái)可以使用python開(kāi)源的爬蟲(chóng)框架scrapy、pyspider,但是本著學(xué)習(xí)練手的目的,決定自己動(dòng)手豐衣足食。 python內(nèi)置了兩個(gè)網(wǎng)絡(luò)庫(kù)urllib和urllib2,但是這兩個(gè)庫(kù)使用起來(lái)不是特別方便,所以在這里我們使用一個(gè)廣受好評(píng)的第三方庫(kù)requests。使用requests只用很少的幾行代碼就可以實(shí)現(xiàn)設(shè)置代理,模擬登陸等比較復(fù)雜的爬蟲(chóng)工作。基本的思路就是使用requests獲取頁(yè)面信息,強(qiáng)大的BeautifulSoup解析頁(yè)面,為了更加迅速的爬取數(shù)據(jù),使用multiprocessing實(shí)現(xiàn)多進(jìn)程抓取。再加之一些小技巧搞定反爬蟲(chóng)機(jī)制,開(kāi)始動(dòng)手。 一、封裝底層使用得比較多的方法: 1. 每次去獲取網(wǎng)頁(yè)信息都需要調(diào)用一個(gè)方法: get 為了爬蟲(chóng)程序持續(xù)工作,一定要捕捉異常。當(dāng)此方法運(yùn)行過(guò)程中requests.get一個(gè)url時(shí)報(bào)錯(cuò),就是目標(biāo)網(wǎng)站的反爬蟲(chóng)機(jī)制生效了,這時(shí)候就要利用一些手段去克服反爬蟲(chóng)。后面詳。 2.下載圖片的方法:down_pic 3.創(chuàng)建文件夾的方法:make_dir 二、獲取城區(qū)每個(gè)區(qū)域內(nèi)所有樓盤的信息: 此頁(yè)面可以獲取到樓盤平均價(jià)格,樓盤所在地址,以及下一步需要的樓盤頁(yè)面url。 比如獲取每個(gè)樓盤頁(yè)面的url: 三、獲取每個(gè)樓盤的戶型圖: 樓盤頁(yè)面的url可以拼湊出每個(gè)樓盤的戶型頁(yè)面,但是在游覽器界面會(huì)發(fā)現(xiàn)每張戶型圖切換是調(diào)用的javascript函數(shù): 經(jīng)過(guò)研究發(fā)現(xiàn),由Javascript生成,基本會(huì)有Ajax請(qǐng)求,那就直接打開(kāi)瀏覽器,然后F12.找到Network,切換到XHR會(huì)發(fā)現(xiàn)這么一個(gè)請(qǐng)求可以獲取所有信息: 代碼: 將戶型的部分信息寫入到戶型圖片的名稱中,比如:2棟標(biāo)準(zhǔn)層1號(hào)房戶型(2室2廳1衛(wèi)1廚)(85.34平)(售完).jpg。 調(diào)用底層下載圖片的方法保存圖片到指定路徑 四、搞定反爬蟲(chóng): 還記得在底層方法get中,捕捉到requests.get異常后,大概率是目標(biāo)網(wǎng)站的反爬蟲(chóng)機(jī)制生效了,而我選擇的是以下幾招。 1.第一招: 更換請(qǐng)求頭部headers中的'User-Agent',定義n個(gè)可使用的'User-Agent',每次請(qǐng)求隨機(jī)選擇一個(gè): headers = self.random_headers() 2.第二招: 使用代理ip,去免費(fèi)代理ip網(wǎng)站爬取可以使用的代理ip,并使用代理IP繼續(xù)工作。 3.第三招: 此次爬蟲(chóng)反爬蟲(chóng)機(jī)制的殺招,那就是更換運(yùn)營(yíng)商賬號(hào)撥號(hào)獲取不同的IP繼續(xù)爬取。具體做法是:在開(kāi)始爬取之后,再啟動(dòng)一個(gè)進(jìn)程檢查網(wǎng)絡(luò)情況,在爬蟲(chóng)代碼捕捉到異常后,馬上斷開(kāi)網(wǎng)絡(luò),另外的進(jìn)程在檢測(cè)到網(wǎng)絡(luò)異常后,馬上開(kāi)始更換賬號(hào)撥號(hào)。 捕捉異常,隨機(jī)斷開(kāi)網(wǎng)絡(luò)(因?yàn)閱?dòng)10個(gè)進(jìn)程,基本上可以保證馬上斷開(kāi)網(wǎng)絡(luò)) 檢查網(wǎng)絡(luò)情況,一旦網(wǎng)絡(luò)斷開(kāi),調(diào)用撥號(hào)程序撥號(hào): 撥號(hào)程序 因?yàn)橹辽?0個(gè)運(yùn)營(yíng)商賬號(hào)可以使用,這個(gè)辦法非常有用,比代理IP更快比更換請(qǐng)求頭部更有效。(別問(wèn)我賬號(hào)怎么來(lái)的,哈哈) 五、開(kāi)始爬?。?/span> 代碼測(cè)試完成過(guò)后就可以開(kāi)始爬取工作了。 調(diào)用multiprocessing,在本地文件I/O處加Lock防止阻塞,使用log文件記錄的方式實(shí)現(xiàn)中斷續(xù)爬。當(dāng)然在爬取過(guò)程中需要保存當(dāng)前工作的上下文,以便在一些原因下爬蟲(chóng)中斷了可以繼續(xù)爬取。 結(jié)語(yǔ): 各大房源網(wǎng)站的數(shù)據(jù)信息過(guò)于龐雜,收集戶型信息對(duì)比都不方便,花上幾個(gè)小時(shí)寫個(gè)爬蟲(chóng)和抓取需要的信息的確很是方便。最后的效果如下: 恩,就醬,謝謝。 本文作者:楊陽(yáng)(點(diǎn)融黑幫),python愛(ài)好者,最近喜歡踢足球、玩狼人殺。目前就職于點(diǎn)融成都分公司,IT技術(shù)工程師。 |
|