看到一篇博文上講到用Python寫自動訪問博客的功能,里面的核心功能就是抓取網頁中的鏈接,類似一個網頁爬蟲工具。正好我剛學習Python,就決定自己練習一下。寫了一下,原本覺得很簡單的東西,搞了半天才終於搞定,看來紙上得來終是淺,勤加實踐才是王道。雖然花了不少時間,但是感覺自己收獲還是蠻大的。
這段代碼的知識點包括以下幾個:
- 列表的使用;
- 自定義全局函數的寫法;
- 自定義類及繼承類的寫法;
- 標准模塊的使用
- 異常處理
下面看代碼。
先是導入用到的標准模塊:
import html.parser as parser import urllib.request
然后是分析網頁中網址的類定義:
1 class MyHtmlParser(parser.HTMLParser): 2 def __init__(self, lst = None): 3 super().__init__() #這里容易漏掉導致出錯 4 if not lst: 5 self.urls = [] 6 else: 7 self.urls = lst 8 9 def handle_starttag(self, tag, attrs): 10 for attr, value in attrs: 11 if "http" in value and ".js" not in value \ 12 and value not in self.urls: 13 self.urls.append(value) 14 15 def handle_startendtag(self, tag, attrs): 16 for attr, value in attrs: 17 if "http" in value and ".js" not in value \ 18 and value not in self.urls: 19 self.urls.append(value)
解析網址函數:
1 def ParseUrlsInText(text, lst): 2 pars = MyHtmlParser(lst) 3 try: 4 pars.feed(text) 5 #添加異常處理,可能會遇到各種異常 6 except parser.HTMLParseError as ex: 7 print("parse failed.",ex)
最后是實現整個功能的函數:
1 def VisitUrlsInPage(pageUrl): 2 url_list = [pageUrl] 3 for url in url_list: 4 try: 5 fh = urllib.request.urlopen(url) 6 data = fh.read() 7 ParseUrlsInText(str(data), url_list) 8 #這里是為了快速結束,去掉就變成小爬蟲了 9 if len(url_list) >= 200: 10 break 11 except urllib.request.URLError: 12 print("Failed.") 13 continue 14 print("length: ", len(url_list)) 15 for url in url_list: 16 print(url) 17 18 19 if __name__ == '__main__': 20 VisitUrlsInPage("http://www.cnblogs.com/jason-yang/")
里面的異常處理和對地址的剔除還不完善,對不同的網站運行過程中可能還會有些小問題。