[Python] [爬蟲] 1.批量政府網站的招投標、中標資訊爬取和推送的自動化爬蟲概要——脫離Scrapy框架
目錄
4.Environment and Configuration
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 | 構造郵件的(支援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大法好。