1. 程式人生 > >[Python] [爬蟲] 1.批量政府網站的招投標、中標資訊爬取和推送的自動化爬蟲概要——脫離Scrapy框架

[Python] [爬蟲] 1.批量政府網站的招投標、中標資訊爬取和推送的自動化爬蟲概要——脫離Scrapy框架

 

目錄

1.Intro

2.Details

3.Theory

4.Environment and Configuration

5.Automation

6.Conclusion


1.Intro

作為Python的擁蹩,開源支持者,深信Python大法好,每天不寫點整個人就會萎靡不振,雖是GIS專業出身,除了乾地信開發的老本行,也會用些奇技淫巧做點偷懶的活計。

通常以前用Python,都只是在ArcGIS中處理一些空間分析和地圖操作的自動化任務,這回頭一次寫爬蟲,也算是做過的一個比較完整的新型專案,編碼耗時1個多月,維護耗時5個月,目前穩定在5.1版本,做過幾次較大的更新,現在回頭去看,就引發了一個問題:“這誰寫的程式碼這麼狗屎!哦好像是我自己寫的.....”。


2.Details

本來打算採用Scrapy作為爬蟲的主要框架,但考慮到每個模組需要定製個性化操作,而且自己也想對其他爬蟲庫有更深入學習等原因(其實就是不會T-T),所以脫離了Scrapy框架,而採用了很多其他的爬蟲庫,比如urllib2、lxml(這個是真滴好用,雖然沒正則強大,好用就對了)。

由於之前沒有做爬蟲的經驗,所以這個專案的架構算是借鑑了幾個比較成熟的爬蟲專案,然後意淫出來的...

專案具體分為11個模組,其中包含了9個主要模組和2個擴充套件模組:

Id Module Name Remark
1 驗證模組 主要模組
2 代理池 主要模組
3 配置管理器 主要模組
4 網頁下載器 主要模組
5 網頁解析器 主要模組
6 資料處理器 主要模組
7 資料推送模組 主要模組
8 爬蟲日誌 主要模組
9 排程引擎 主要模組
10 日誌監控 擴充套件模組
11 代理池更新 擴充套件模組

其中引用了20個庫(不包含自己寫的):

Id Library Name Remark
1 urllib2 網頁抓取
2 requests HTTP庫
3 scrapy(就用到一處,打臉..) 都懂的
4 lxml 網頁定位元素提取資料
5 pymongo MongoDB操作
6 selenium 瀏覽器自動化測試框架
7 pyExcelerator(舊方法) excel檔案處理
8 multiprocessing 多程序
9 smtplib 發郵件的(支援SMTP服務)
10 email 構造郵件的(支援SMTP服務)
11 re 正則表示式
12 socket 套接字
13 gc 垃圾回收
14 retry 重試功能庫
15 datetime 時間處理
16 time 時間模組
17 sys 作業系統互動
18 random 隨機庫
19 os 作業系統互動
20 logging 日誌庫

使用Selenium時需要注意,一般推薦PhantomJS無頭瀏覽器配合使用,也可以安裝Chrome、FireFox等。

自己實現了一個庫Console_Color,用於控制列印文字的顏色,本來想配合tqdm(進度條庫)一起使用,非常驚豔,可是一想到是自動化的,沒人看...

3.Theory

受到Agile模式(敏捷開發)的影響,列了11個小週期來做Scrum,每個小週期就相當於一個模組,會根據任務量的大小逐一完成並通過測試,然後實現迭代,完成一次Sprint,而每個模組都會對外提供實現特殊功能的方法,最後通過排程引擎統一調配和管理。

Id Module Name File Name Describe
1 驗證模組 authentication

驗證資料庫連線狀態

驗證網站連通性

驗證代理有效性

2 代理池 proxyPool

代理爬取

從資料獲取隨機代理

3 配置管理器 configManager 儲存爬蟲相關配置資訊,如資料庫配置、網站URL、報頭等
4 網頁下載器 pageDownloader 獲取網頁原始碼
5 網頁解析器 pageResolver 解析網頁原始碼
6 資料處理器 dataDisposer

資料儲存

資料刪除

資料更新

資料清洗

獲得資料庫物件

7 資料推送模組 dataPusher_HTML、dataPusher

 HTML引擎,可以生成HTML檔案

從資料庫獲取資料,更新推送標識

格式化郵件地址

郵件推送

8 爬蟲日誌 spiderLog 日誌寫入到文字,包含普通訊息、警告、錯誤、異常等
9 排程引擎 scheduleEngine 構造代理引擎、獨立代理引擎、驗證引擎、網頁爬取引擎、資料推送引擎,然後統一排程,完成推送
10 日誌監控 log_record 爬蟲執行結果寫入到資料庫的日誌表中
11 代理池更新 rebuild_proxy 清空代理池,重新爬取代理

 

在爬蟲專案下有兩個資料夾(可自己修改),用於儲存推送檔案和關鍵詞庫,分別為:

推送檔案:..\history_file

關鍵詞庫:..\keyword_file\keyword.txt

其中,關鍵詞庫儲存了需要提取的關鍵詞,用於篩選爬取的資料。

4.Environment and Configuration

Environment:Windows 7 及之後版本 or Windows Server 2008 及之後版本(Linux不推薦,會出現各種問題,未解決)

Language:Python 2.7.14

IDE:Pycharm 2018.2.2、Robo 3T 1.2.1

DataBase:MongoDB 3.6.5

5.Automation

Linux自動化方式:crontab(不推薦,測試了很多次,會出現各種問題,未解決)

Windows自動化方式:任務計劃程式(從執行中開啟,快捷鍵為 win + R,輸入 taskschd.msc),推薦在爬蟲專案下生成兩個bat檔案,分別用於控制排程引擎和代理池重建,填入引數分別為:

python scheduleEngine.py
python rebuild_proxy.py

然後在任務計劃程式中,輸入對應的引數,並且在觸發器裡可以設定啟動條件,即可實現自動化。

6.Conclusion

爬蟲原始碼之後會放在GitHub上,具體的配置和操作會在之後的模組詳解中說到,不定期更新爬蟲,有些程式碼塊比較冗餘需要優化,最近有想做成分散式,然後搞點資料探勘方法,但資料量並不是很大,作罷。最後說一句,Python大法好。