看到一篇博文上讲到用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/")

里面的异常处理和对地址的剔除还不完善,对不同的网站运行过程中可能还会有些小问题。

posted on 2012-04-14 22:26  Jason Yang  阅读(3891)  评论(0编辑  收藏  举报