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