博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python小应用1 - 抓取网页中的链接地址
阅读量:4676 次
发布时间:2019-06-09

本文共 1931 字,大约阅读时间需要 6 分钟。

看到一篇博文上讲到用Python写自动访问博客的功能,里面的核心功能就是抓取网页中的链接,类似一个网页爬虫工具。正好我刚学习Python,就决定自己练习一下。写了一下,原本觉得很简单的东西,搞了半天才终于搞定,看来纸上得来终是浅,勤加实践才是王道。虽然花了不少时间,但是感觉自己收获还是蛮大的。

这段代码的知识点包括以下几个:

  1. 列表的使用;
  2. 自定义全局函数的写法;
  3. 自定义类及继承类的写法;
  4. 标准模块的使用
  5. 异常处理

下面看代码。

先是导入用到的标准模块:

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

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

转载于:https://www.cnblogs.com/jason-yang/archive/2012/04/14/2447766.html

你可能感兴趣的文章
第4.17章读书笔记
查看>>
python- 属性 静态方法,类方法
查看>>
前端面试题二
查看>>
react 单元测试 (jest+enzyme)
查看>>
HTML5网站大观:10个精美的 HTML5 企业网站欣赏
查看>>
HDU 2588 GCD
查看>>
[IDDFS+背包] 洛谷P2744 [USACO5.3]量取牛奶Milk Measuring
查看>>
关于Yaffs2在u-boot中的支持
查看>>
poj 3181 Dollar Dayz (整数划分问题---递归+DP)
查看>>
android:id="@android:id/tabhost" 、android:id="@+id/llRoot" 、android:id="@id/llRoot" 之间的区别...
查看>>
MySQL 忘记Root密码
查看>>
WPF后台自定义文字带背景的选择状态按钮
查看>>
【转自Mgen】 .NET(C#):谈谈各种结束进程的方法
查看>>
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
查看>>
用原生javascript做的一个打地鼠的小游戏
查看>>
小米手机 - Charles无法安装证书 因为无法读取证书
查看>>
android 动态壁纸开发
查看>>
你误解了Windows的文件后缀名吗?
查看>>
谷歌浏览器插件
查看>>
gcc malloc/free的质疑
查看>>