通过 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() 函数 完整的代码在这篇博客的最下面:http://blog.csdn.net/github_35160620/article/details/52529435

四 . 运行:

先启动 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索引号遍历目标网页里链接的所有网页的更多相关文章

  1. Python 网络爬虫 007 (编程) 通过网站地图爬取目标站点的所有网页

    通过网站地图爬取目标站点的所有网页 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 2016 ...

  2. Python 网络爬虫 006 (编程) 解决下载(或叫:爬取)到的网页乱码问题

    解决下载(或叫:爬取)到的网页乱码问题 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:PyCharm 20 ...

  3. Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页

    爬取目标站点里所有的网页 使用的系统:Windows 10 64位 Python语言版本:Python 3.5.0 V 使用的编程Python的集成开发环境:PyCharm 2016 04 一 . 首 ...

  4. Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码

    通过 正则表达式 来获取一个网页中的所有的 URL链接,并下载这些 URL链接 的源代码 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 ...

  5. Python 网络爬虫 005 (编程) 如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫

    如何编写一个可以 下载(或叫:爬取)一个网页 的网络爬虫 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 Python 的集成开发环境:P ...

  6. Python网络爬虫

    http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...

  7. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  8. 《精通python网络爬虫》笔记

    <精通python网络爬虫>韦玮 著 目录结构 第一章 什么是网络爬虫 第二章 爬虫技能概览 第三章 爬虫实现原理与实现技术 第四章 Urllib库与URLError异常处理 第五章 正则 ...

  9. Python网络爬虫与信息提取

    1.Requests库入门 Requests安装 用管理员身份打开命令提示符: pip install requests 测试:打开IDLE: >>> import requests ...

随机推荐

  1. 【新手专属】IntelliJ IDEA删除项目

    这两天刚从Eclipse转手IDEA,每次都是直接删项目文件,后来百度一下才明白原来应该这样~~~ IntelliJ IDEA 删除项目,共三步: 第一步:记住当前项目文件路径1,然后点击file-- ...

  2. LeetCode OJ:Sum Root to Leaf Numbers(根到叶节点数字之和)

    Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number ...

  3. XML DOM - Range 对象

    Range对象 Range对象表示文档的连续范围区域,如用户在浏览器窗口中用鼠标拖动选中的区域.   dom标准Range对象 在IE中使用TextRange对象 range对象常用的建立方法在开发中 ...

  4. canvas基础学习(二)

    一.图像绘制 canvas绘制图像的方法是ctx.drawImage();该方法有三种使用方式 1.ctx.drawImage(img,x,y); img是指图像对象,x和y分别是这个图像左上角在ca ...

  5. Linux C 编程内存泄露检测工具(一):mtrace

    前言 所有使用动态内存分配(dynamic memory allocation)的程序都有机会遇上内存泄露(memory leakage)问题,在Linux里有三种常用工具来检测内存泄露的情況,包括: ...

  6. 两个VLC实现播放串流测试

    实现原理: 一个VLC打开视频文件发布串流(格式HTTP.RTP.RTSP等),另一个VLC打开串流播放 发布串流步骤: 1.菜单“媒体”->“流”,先添加视频文件.选择“串流”,如下图: 2. ...

  7. STL空间配置器解析和实现

    STL空间配置器的强大和借鉴作用不言而喻,查阅资料,发现了Dawn_sf已经对其有了极其深入和详细的描述,所以决定偷下懒借用其内容,只提供自己实现STL空间配置器的源码,具体解析内容参考:(一)STL ...

  8. shell split函数的使用

    #!/bin/awk -f BEGIN{FS=","} {split($1,name," "); for (i in name) print name[i] }

  9. webpack学习(一)—— 入门

    ,我们通常采用的是组件化开发方式,这样就会对应有很多个js文件,而打包工具的出现则是为了正确处理这些js文件的依赖关系,并生成一个最终的文件,这样,我们最后只需要加载打包以后的文件就可以了,而无须加载 ...

  10. bzoj 2115 [Wc2011] Xor——路径和环的转化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2115 思路很精妙.好像能应用到很多地方. 发现如果路径上有环,可以通过一些走法达到 异或了那 ...