Python 网络爬虫 008 (编程) 通过ID索引号遍历目标网页里链接的所有网页
通过 ID索引号 遍历目标网页里链接的所有网页
使用的系统:Windows 10 64位
Python 语言版本:Python 2.7.10 V
使用的编程 Python 的集成开发环境:PyCharm 2016 04
我使用的 urllib 的版本:urllib2
注意: 我没这里使用的是 Python2 ,而不是Python3
一 . 前言
通过之前两节(爬取一个网页 的网络爬虫 和 解决爬取到的网页显示时乱码问题),我们终于完成了最终的
download()函数。
并且上一节,我们通过网站地图解析里面的URL的方式爬取了目标站点的所有网页。这一节 我再介绍一种方法来爬取一个网页里面所有的链接网页。
简单的说:就是利用一些网站结构的弱点,更加轻松地访问所有内容。
二 . 原理
对于一些网站,它里面的链接网址是由索引号设定的。举个例子:
下面这些网页的URL是同一个站点的:
http://example.webscraping.com/view/Afghanistan-1
http://example.webscraping.com/view/Aland-Islands-2
http://example.webscraping.com/view/Albania-3
它们之间有规律,前面(
http://example.webscraping.com/view/)都是一样的,而后面是ID索引号。这样我们就可以使用这样的规律来对这个站点进行下载操作。
一般情况下,Web服务器会忽略ID索引号跟随的这个字符串,(这个字符串叫着:页面别名),只使用ID来匹配数据库中的相关记录。也就是说:http://example.webscraping.com/view/1 这个网址也可以使用,得到的结果和访问 http://example.webscraping.com/view/Afghanistan-1 是一样的。
所以,我们只使用ID索引号是行得通的,网页依然可以成功加载。
三 . 代码
现在我们将来忽略页面别名,只遍历ID来下载这个站点(
http://example.webscraping.com/view/)里面的所有网页。
简单的程序如下。这段代码我对ID索引号进行遍历,直到出现下载错误时停止,(我们现在就假设此时为:到达最后一个国家的页面。)
import itertools def traverse_id(): for page in itertools.count(1): url = 'http://example.webscraping.com/view/%d' % page html = download(url) if html is None: break else: # success - can scrape the result pass
download()函数 完整的代码在这篇博客的最下面:https://www.geek-share.com/detail/2684771422.html
四 . 运行:
先启动 Python27 的终端交互界面,执行下面的命令:
> C:\Python27\pytho n.exe -i 1-4-3-id-traverse.py
执行:
>>> traverse_id()
输出:
Downloading: http://example.webscraping.com/view/1 Downloading: http://example.webscraping.com/view/2 Downloading: http://example.webscraping.com/view/3 Downloading: http://example.webscraping.com/view/4 Downloading: http://example.webscraping.com/view/5
上面这段代码是存在一个缺陷的:可能目标站点的某些ID索引号的网页已经被删除了,就是目标站点数据库的ID索引号不是连续的。那么,上面这段程序访问到目标站点的某个间断点,爬虫就会立即退出。所以我们需要对上面的代码进行升级。
五 . 代码升级:
下面的代码是升级后的代码。程序会在连续发生多次下载错误后才会退出程序。
import itertools # maximum number of consecutive download errors allowed max_errors = 5 # current number of consecutive download errors num_errors = 0 for page in itertools.count(1): url = 'http://example.webscraping.com/view/%d' % page html = download(url) if html is None: # received an error trying to download this webpage num_errors += 1 if num_errors == max_errors: # reached maximum number of # consecutive errors so exit break else: # success - can scrape the result # ... num_errors = 0
上面这个程序就是实现了一个:如果连续5次下载错误才停止遍历 的功能。这样做就可以很大程度上降低了遇到间断点时,过早停止遍历的风险。
搞定
总结:
在爬取网站时,使用遍历ID索引号是一个很便捷的方法。但是:
1 . 一些网站会检查页面别名是否满足预期,如果不是,则会返回
404 Not Found错误。
2 . 另一些网站则会使用非连接的多位数字作为ID,或者根本就不使用数值作为ID,此时遍历就难以发挥其作用了。
所以在爬取网站的时候,使用的方法要根据网站的特点来选择使用。
下一节,我介绍在一个网页中使用正则表达式来得到这个网页中所有的链接URL。
- Python 网络爬虫 008 (编程) 通过ID索引号遍历目标网页里链接的所有网页
- Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页
- Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码
- Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页
- Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码
- Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页
- Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页
- 网页爬虫的最简C/C++程序代码示例------先通过列表获取所有博文id, 然后遍历所有博文id
- Python爬虫(七)学习提取网页中所有链接
- Python 网络爬虫 006 (编程) 解决下载(或叫:爬取)到的网页乱码问题
- Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫
- Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫
- Python 网络爬虫 006 (编程) 解决下载(或叫:爬取)到的网页乱码问题
- python爬虫抓取目标网页链接
- 【网络爬虫】【python】网络爬虫(五):scrapy爬虫初探——爬取网页及选择器
- 【python网络编程】新浪爬虫:关键词搜索爬取微博数据
- Python 实现网络爬虫 抓取静态网页【代码】
- Python -- 网络编程 -- 抓取网页图片 -- 图虫网
- Selenium FF WebDriver 遍历所有链接(另类爬虫)
- Linux企业级项目实践之网络爬虫(9)——通过URL抓取网页内容