爬虫(1)
前段時間,結合日常需要,寫了一個小的爬蟲項目。這里稍作小結一下。
關于數據來源
信息在哪里?一個地區重要的文化工作,最終都會在該地區文化部門官方網站發布相關信息。
對某個具體使用者來說,并不需要知道網站發布的所有信息。舉個例子,自己只對公共文化服務相關信息有興趣,網站中的其他信息,如文化市場、非物質文化遺產、旅游、文物保護等,對自己來說就不是關注對象。
如何只看自己想看的信息?這可以從查找信息的過程中找出方法。假設,想了解16個市在公共文化服務方面的信息,會怎么做?首先,會打開省文化和旅游廳相關欄目看當前發布的信息;然后,逐個打開每個市網站相關欄目查看。可見,查找信息是一個重復的過程。
一般情況下,涉及重復的過程,大多可以實現自動化。我們的爬蟲就是將這個過程自動化。目前,已經初步實現的功能有:
(1)從15個市級文化管理部門網站的指定欄目,自動抓取新聞消息的標題、鏈接、日期。【這里為什么是15個市?因為合肥市局網站信息比較難抓。百度搜索實現了針對該網站的信息抓取,必應搜索、搜狗搜索等未實現。】
(2)將收集到的信息,保存成數據文件,并據此生成網頁。
(3)將生成的網頁,利用微信發給指定朋友或自己,這里也可以使用linux下的mail程序,發送到指定郵箱。
關于總體設計
實際上,這個項目一開始時,自己并沒有非常明確的總體設計,現在看到目錄結構,是在基本功能完成以后逐漸整理得來的,編寫時隨意性較大,基本是想到什么功能就寫到哪里,發現不對時,就對代碼進行重構。
├── city_lv │?? ├── __init__.py │?? ├── luanweb.py │?? ├── maanshanweb.py │?? └── xuanchengweb.py ├── county_lv │?? ├── changfengweb.py │?? └── __init__.py ├── libraries │?? ├── ahslibweb.py │?? └── __init__.py ├── LICENSE ├── province_lv │?? ├── anhuiweb.py │?? └── __init__.py ├── README.md ├── templates │?? ├── base.html ├── tests │?? ├── index.html │?? ├── msg.txt │?? ├── send_msg.py │?? ├── send.sh │?? ├── test.py │?? └── txt2html.py └── utils└── webmonkey.py雖然沒有什么明確應該是什么樣的,但對項目的核心功能相對清楚,就是從各個文化機構的網站抓取信息。
具體實現時,每個數據源對應一個獨立的爬蟲程序,然后在一個總的調度程序中循環調用。
關于爬蟲框架
這里沒有使用現成的爬蟲框架,如scrapy,只是針對需求,封裝了一個非常簡單的類。
為了減少程序中的重復代碼,在編寫過程中,經過幾次重構,自己封裝了一個類webmonkey.py,用于處理抓取時一些共同操作,包括打開網站、返回一個包括網站源碼的響應對象、顯示抓取到的信息等。
針對每個具體網站,編寫了Web類,繼承自通用類webmonkey。在其基礎上,改動網站url和網頁信息提取規則。
關于數據保存
程序中沒有實現數據保存的功能,而是利用操作系統提供的管道(“|”)命令,將程序輸出到本地文件進行保存。
在數據量比較小的情況下,或用于演示時,用這種方法還可以。如果考慮長期運行,肯定需要使用數據庫。但是,這個問題不是很大,自己在另外一個小項目中已經封裝過一個sqlite3的類,需要時可以拿過來改改。
關于數據展示
為了展示抓取信息,寫了一個網頁生成的模塊txt2html.py。基本的想法是,先寫一個網頁模板,然后在這個模板基礎上,將抓取的信息寫入網頁文件。另外,還寫了一個模塊,可以將HTML文件通過微信發送給自己。
未解決問題
現在還有幾個問題沒有解決。第一,第一條信息問題。部分站點同一天會更新多條信息,目前只是抓取各網站相應欄目的第一條信息。第二,接著第一個問題而來的是數據量大了之后的數據存儲問題。第三,網頁設計問題。第四,通用性問題。
使用方法
git clone http://github.com/luckyele/socnews.git
cd socnews/tests/
python test.py > msg.txt
python txt2html.py
轉載于:https://www.cnblogs.com/py520ziyi/p/10556044.html
總結
- 上一篇: Shell脚本的学习笔记一:变量
- 下一篇: java中的神奇this