看到一篇博文上讲到用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/")
里面的异常处理和对地址的剔除还不完善,对不同的网站运行过程中可能还会有些小问题。