看到一篇博文上讲到用Python写自动访问博客的功能,里面的核心功能就是抓取网页中的链接,类似一个网页爬虫工具。正好我刚学习Python,就决定自己练习一下。写了一下,原本觉得很简单的东西,搞了半天才终于搞定,看来纸上得来终是浅,勤加实践才是王道。虽然花了不少时间,但是感觉自己收获还是蛮大的。
这段代码的知识点包括以下几个:
- 列表的使用;
- 自定义全局函数的写法;
- 自定义类及继承类的写法;
- 标准模块的使用
- 异常处理
下面看代码。
先是导入用到的标准模块:
import html.parser as parserimport 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 break11 except urllib.request.URLError:12 print("Failed.")13 continue14 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/")
里面的异常处理和对地址的剔除还不完善,对不同的网站运行过程中可能还会有些小问题。