带你读《Python网络爬虫从入门到实践(第2版)》之三:静态网页抓取

简介: 使用Python编写网络爬虫程序获取互联网上的大数据是当前的热门专题。本书基础部分(第1~7章)主要介绍爬虫的三个步骤——获取网页、解析网页和存储数据,并通过诸多示例的讲解,让读者能够从基础内容开始系统性地学习爬虫技术,并在实践中提升Python爬虫水平。进阶部分(第8~13章)包括多线程的并发和并行爬虫、分布式爬虫、更换IP等,帮助读者进一步提升爬虫水平。项目实践部分(第14~17章)使用本书介绍的爬虫技术对几个真实的网站进行抓取,让读者能在读完本书后根据自己的需求写出爬虫程序。

点击查看第一章
点击查看第二章

第3章

静态网页抓取
在网站设计中,纯粹HTML格式的网页通常被称为静态网页,早期的网站一般都是由静态网页制作的。在网络爬虫中,静态网页的数据比较容易获取,因为所有数据都呈现在网页的 HTML代码中。相对而言,使用AJAX动态加载网页的数据不一定会出现在HTML代码中,这就给爬虫增加了困难。本章先从简单的静态网页抓取开始介绍,第4章再介绍动态网页抓取。
在静态网页抓取中,有一个强大的Requests库能够让你轻易地发送HTTP请求,这个库功能完善,而且操作非常简单。本章首先介绍如何安装Requests库,然后介绍如何使用Requests库获取响应内容,最后可以通过定制Requests的一些参数来满足我们的需求。

3.1 安装Requests

Requests库能通过pip安装。打开Windows 的cmd或Mac的终端,键入:

image.png

就安装完成了。

3.2 获取响应内容

在Requests中,常用的功能是获取某个网页的内容。现在我们使用Requests获取个人博客主页的内容。

image.png

这样就返回了一个名为r的response响应对象,其存储了服务器响应的内容,我们可以从中获取需要的信息。上述代码的结果如图3-1所示。

image.png

上例的说明如下:
(1)r.text是服务器响应的内容,会自动根据响应头部的字符编码进行解码。
(2)r.encoding是服务器内容使用的文本编码。
(3)r.status_code用于检测响应的状态码,如果返回200,就表示请求成功了;如果返回的是4xx,就表示客户端错误;返回5xx则表示服务器错误响应。我们可以用r.status_code来检测请求是否正确响应。
(4)r.content是字节方式的响应体,会自动解码gzip和deflate编码的响应数据。
(5)r.json()是Requests中内置的JSON解码器。

3.3 定制Requests

在3.2节中,我们使用Requests库获取了网页数据,但是有些网页需要对Requests的参数进行设置才能获取需要的数据,这包括传递URL参数、定制请求头、发送POST请求、设置超时等。

3.3.1 传递URL参数

为了请求特定的数据,我们需要在URL的查询字符串中加入某些数据。如果你是自己构建URL,那么数据一般会跟在一个问号后面,并且以键/值的形式放在URL中,如http://httpbin.org/get?key1=value1
在Requests中,你可以直接把这些参数保存在字典中,用params(参数)构建至URL中。例如,传递key1 = value1和key2=value2到http://httpbin.org/get ,可以这样编写:

image.png

通过上述代码的输出结果可以发现URL已经正确编码:
URL已经正确编码:http://httpbin.org/get?key1=value1&key2=value2
字符串方式的响应体:

image.png
image.png

3.3.2 定制请求头

请求头Headers提供了关于请求、响应或其他发送实体的信息。对于爬虫而言,请求头十分重要,尽管在上一个示例中并没有制定请求头。如果没有指定请求头或请求的请求头和实际网页不一致,就可能无法返回正确的结果。
Requests并不会基于定制的请求头Headers的具体情况改变自己的行为,只是在最后的请求中,所有的请求头信息都会被传递进去。
那么,我们如何找到正确的Headers呢?
还是用到第2章提到过的Chrome浏览器的“检查”命令。使用Chrome浏览器打开要请求的网页,右击网页的任意位置,在弹出的快捷菜单中单击“检查”命令。
如图3-2所示,在随后打开的页面中单击Network选项。

image.png

如图3-3所示,在左侧的资源中找到需要请求的网页,本例为www.santostang.com。单击需要请求的网页,在Headers中可以看到Requests Headers的详细信息。

image.png

因此,我们可以看到请求头的信息为:
GET / HTTP/1.1
Host: www.santostang.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2
提取请求头中重要的部分,可以把代码改为:

image.png

3.3.3 发送POST请求

除了GET请求外,有时还需要发送一些编码为表单形式的数据,如在登录的时候请求就为POST,因为如果用GET请求,密码就会显示在URL中,这是非常不安全的。如果要实现POST请求,只需要简单地传递一个字典给Requests中的data参数,这个数据字典就会在发出请求的时候自动编码为表单形式。

image.png

输出的结果为:
{
"args": {},
"data": "",
"form": {

"key1": "value1", 
"key2": "value2"

},

}
可以看到,form变量的值为key_dict输入的值,这样一个POST请求就发送成功了。

3.3.4 超时

有时爬虫会遇到服务器长时间不返回,这时爬虫程序就会一直等待,造成爬虫程序没有顺利地执行。因此,可以用Requests在timeout参数设定的秒数结束之后停止等待响应。意思就是,如果服务器在timeout秒内没有应答,就返回异常。
我们把这个秒数设置为0.001秒,看看会抛出什么异常。这是为了让大家体验timeout异常的效果而设置的值,一般会把这个值设置为20秒。

image.png

返回的异常为:ConnectTimeout: HTTPConnectionPool(host='www.santostang.com ',
port=80): Max retries exceeded with url: / (Caused by ConnectTimeoutError(connection.HTTPConnection object at 0x0000000005B85B00>, 'Connection to www.santostang.com timed out. (connect timeout=0.001)'))。
异常值的意思是,时间限制在0.001秒内,连接到地址为www.santostang.com 的时间已到。

3.4 Requests爬虫实践:TOP250电影数据

本章实践项目的目的是获取豆瓣电影TOP250的所有电影的名称,网页地址为:https://movie.douban.com/top250 。在此爬虫中,将请求头定制为实际浏览器的请求头。

3.4.1 网站分析

打开豆瓣电影TOP250的网站,使用“检查”功能查看该网页的请求头,如图3-4所示。

image.png

按照3.3.2中的方法提取其中重要的请求头:

image.png

第一页只有25个电影,如果要获取所有的250页电影,就需要获取总共10页的内容。
通过单击第二页可以发现网页地址变成了:
https://movie.douban.com/top250?start=25
第三页的地址为:https://movie.douban.com/top250?start=50 ,这就很容易理解了,每多一页,就给网页地址的start参数加上25。

3.4.2 项目实践

通过以上分析发现,可以使用requests获取电影网页的代码,并利用for循环翻页。其代码如下:

image.png

运行上述代码,得到的结果是:
1 页响应状态码: 200

lang="zh-cmn-Hans" class="ua-windows ua-webkit">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="renderer" content="webkit">
<meta name="referrer" content="always">
<title>

豆瓣电影TOP250
...
这时,得到的结果只是网页的HTML代码,我们需要从中提取需要的电影名称。接下来会涉及第5章解析网页的内容,读者可以先使用下面的代码,至于对代码的理解,可以等到第5章再学习。

image.png
image.png

在上述代码中,使用BeautifulSoup对网页进行解析并获取其中的电影名称数据。运行代码,得到的结果是:
1 页响应状态码: 200
2 页响应状态码: 200
3 页响应状态码: 200
4 页响应状态码: 200
5 页响应状态码: 200
6 页响应状态码: 200
7 页响应状态码: 200
8 页响应状态码: 200
9 页响应状态码: 200
10 页响应状态码: 200
['肖申克的救赎', '这个杀手不太冷', '霸王别姬', '阿甘正传', '美丽人生', '千与千寻', '辛德勒的名单', '泰坦尼克号', '盗梦空间', '机器人总动员', '海上钢琴师', '三傻大闹宝莱坞', '忠犬八公的故事', '放牛班的春天', '大话西游之大圣娶亲', '教父', '龙猫', '楚门的世界', '乱世佳人', '天堂电影院', '当幸福来敲门', '触不可及', '搏击俱乐部', '十二怒汉', '无间道', '熔炉', '指环王3:王者无敌', '怦然心动', '天空之城', '罗马假日', ...]

3.4.3 自我实践题

读者若有时间,可以实践进阶问题:获取TOP 250电影的英文名、港台名、导演、主演、上映年份、电影分类以及评分。

相关文章
|
17小时前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点) 今天给小伙伴们分享一份Python语言及其应用的手册,这份手册主要介绍 Python 语言的基础知识及其在各个领域的具体应用,基于最新版本 3.x。
|
1天前
|
存储 数据管理 测试技术
构建Python构建自动化测试框架(原理与实践)
当谈到软件质量保证时,自动化测试是一个不可或缺的步骤。Python作为一种简单易学的编程语言,具有丰富的测试框架和库,使得构建自动化测试框架变得相对简单。本文将介绍如何使用Python构建自动化测试框架,包括选择合适的测试框架、编写测试用例、执行测试和生成报告等方面。
构建Python构建自动化测试框架(原理与实践)
|
3天前
|
数据可视化 API Python
Python零基础“圣经”!300W小白从入门到精通首选!
今天分享的这本书在让你尽快学会 Python基础知识的同时,能够编写并正确的运行程序(游戏、数据可视化、Web应用程序) 最大的特色在于,在为初学者构建完整的 Python 语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是 后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽 又面面俱到。相信这本书能够得到更多 Python 初学者的喜爱。
|
4天前
|
Python
小白入门必备!计科教授的Python精要参考PDF开放下载!
随着互联网产业的高速发展,在网络上早已积累了极其丰富的Python学习资料,任何人都可以基于这些资源,自学掌握 Python。 但实际上,网络上充斥的资源太多、太杂且不成体系,在没有足够的编程/工程经验之前,仅靠“看”线上资源自学,的确是一件非常困难的事。
|
4天前
|
数据可视化 API Python
豆瓣评分9.4!堪称经典的Python入门圣经,你还没看过吗?
最理想的新人入门书应该满足两个特点:第一就是内容通俗易懂;第二就是要有实战,能够让读者在学完之后知道具体怎么用。 今天给小伙伴们分享的这份Python入门手册,在为初学者构建完整的Python语言知识体系的同时,面向实际应用情境编写代码样例,而且许多样例还是后续实践项目部分的伏笔。实践项目部分的选题经过精心设计,生动详尽又面面俱到。
|
4天前
|
Python 容器
GitHub狂揽6700 Star,Python进阶必备的案例、技巧与工程实践
当下是 Python 急剧发展的时代,越来越多的人开始学习和使用Pyhon,而大家也遇到了各种问题。这份手册清晰、细致地介绍了 Python 代码应该遵循的编程风格,并解释了背后的原理和机制。 入门 Python 语言相对简单,但写出优雅的代码并非易事。这份手册深入讲解了 Python进阶知识的方方面面,并配以许多有趣的案例故事,使读者能更轻松地理解各种原理,并更好地将其运用于日常工作。
|
5天前
|
Python 容器
GitHub狂揽6700 Star,Python进阶必备的案例、技巧与工程实践
当下是 Python 急剧发展的时代,越来越多的人开始学习和使用Pyhon,而大家也遇到了各种问题。这份手册清晰、细致地介绍了 Python 代码应该遵循的编程风格,并解释了背后的原理和机制。
|
6天前
|
数据采集 运维 API
适合所有编程初学者,豆瓣评分8.6的Python入门手册开放下载!
Python是一种跨平台的计算机程序设计语言,它可以用来完成Web开发、数据科学、网络爬虫、自动化运维、嵌入式应用开发、游戏开发和桌面应用开发。 Python上手很容易,基本有其他语言编程经验的人可以在1周内学会Python最基本的内容(PS:没有基础的人也可以直接学习,速度会慢一点)
|
6天前
|
数据采集 存储 C++
单线程 vs 多进程:Python网络爬虫效率对比
本文探讨了Python网络爬虫中的单线程与多进程应用。单线程爬虫实现简单,但处理速度慢,无法充分利用多核CPU。而多进程爬虫通过并行处理提高效率,更适合现代多核架构。代码示例展示了如何使用代理IP实现单线程和多进程爬虫,显示了多进程在效率上的优势。实际使用时还需考虑代理稳定性和反爬策略。
单线程 vs 多进程:Python网络爬虫效率对比
|
7天前
|
数据采集 存储 中间件
Python高效爬虫——scrapy介绍与使用
Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。 相比于自己通过requests等模块开发爬虫,scrapy能极大的提高开发效率,包括且不限于以下原因: 1. 它是一个异步框架,并且能通过配置调节并发量,还可以针对域名或ip进行精准控制 2. 内置了xpath等提取器,方便提取结构化数据 3. 有爬虫中间件和下载中间件,可以轻松地添加、修改或删除请求和响应的处理逻辑,从而增强了框架的可扩展性 4. 通过管道方式存储数据,更加方便快捷的开发各种数据储存方式