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