Python小應用1 - 抓取網頁中的鏈接地址


看到一篇博文上講到用Python寫自動訪問博客的功能,里面的核心功能就是抓取網頁中的鏈接,類似一個網頁爬蟲工具。正好我剛學習Python,就決定自己練習一下。寫了一下,原本覺得很簡單的東西,搞了半天才終於搞定,看來紙上得來終是淺,勤加實踐才是王道。雖然花了不少時間,但是感覺自己收獲還是蠻大的。

這段代碼的知識點包括以下幾個:

  1. 列表的使用;
  2. 自定義全局函數的寫法;
  3. 自定義類及繼承類的寫法;
  4. 標准模塊的使用
  5. 異常處理

下面看代碼。

先是導入用到的標准模塊:

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/")

里面的異常處理和對地址的剔除還不完善,對不同的網站運行過程中可能還會有些小問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM