前段時間自學了python,作為新手就想著自己寫個東西能練習一下,了解到python編寫爬蟲腳本非常方便,且最近又學習了MongoDB相關的知識,萬事具備只欠東風。
程序的需求是這樣的,爬蟲爬的頁面是京東的電子書網站頁面,每天會更新一些免費的電子書,爬蟲會把每天更新的免費的書名以第一時間通過郵件發給我,通知我去下載。
一、編寫思路:
1.爬蟲腳本獲取當日免費書籍信息
2.把獲取到的書籍信息與數據庫中的已有信息作比較,如果書籍存在不做任何操作,書籍不存在,執行插入數據庫的操作,把數據的信息存入MongoDB
3.執行數據庫插入操作時,把更新的數據以郵件的形式發送出來
4.用APScheduler調度框架完成python腳本調度
二、腳本的主要知識點:
1.python簡單爬蟲
本次用到的模塊有urllib2用來抓取頁面,導入模塊如下:
import urllib2from sgmllib import SGMLParser
urlopen()方法獲取網頁HTML源碼,都存儲在content中,listhref()類主要的功能是解析HTML代碼,處理HTML類型的半結構化文檔。
content = urllib2.urlopen('http://sale.jd.com/act/yufbrhZtjx6JTV.html').read()listhref = ListHref()listhref.feed(content)
listhref()類代碼可以在下面全部代碼中查詢到,這里只說幾個關鍵點:
listhref()類繼承了SGMLParser 類并重寫了其中的內部方法。SGMLParser 將HTML分解成有用的片段,比如開始標記和結束標記。一旦成功地分解出某個數據為一個有用的片段,它會根據所發現的數據,調用一個自身內部的方法。為了使用這個分析器,您需要子類化 SGMLParser類,并且重寫父類的這些方法。
SGMLParser 將 HTML 分析成不同類數據及標記,然后對每一類調用單獨的方法:
開始標記 (Start_tag)
是一個開始一個塊的 HTML 標記,像 <html>,<head>,<body> , <pre> 等,或是一個獨一的標記,象 <br> 或 <img> 等。本例當它找到一個開始標記<a>,SGMLParser將查找名為 start_a或do_a的方法。如果找到了,SGMLParser會使用這個標記的屬性列表來調用這個方法;否則,它用這個標記的名字和屬性列表來調用unknown_starttag方法。
結束標記 (End_tag)
是結束一個塊的HTML標記,像 </html>,</head>,</body> 或 </pre> 等。本例中當找到一個結束標記時,SGMLParser 將查找名為end_a的方法。如果找到,SGMLParser調用這個方法,否則它使用標記的名字來調用unknown_endtag。
文本數據(Text data)
獲取文本塊,當不滿足其它各類別的任何標記時,調用handle_data獲取文本。
以下的幾類在本文中沒有用到
字符引用 (Character reference)
新聞熱點
疑難解答