实验环境准备
Python环境安装
腾讯云所提供的的镜像中已经包含了 Python 3.5
大部分情况我们只需要单独安装 pip
即可
sudo apt-get update sudo apt-get install python3 python3-pip -y
requests库的安装
我们使用 pip
软件管理工具安装 requests
,如果你需要其他方法请访问官方网站指导页面。
请执行
pip3 install requests
在了解爬虫之前,我们有必要了解 robots 协议。
·--------------------------------------------------------
*以下部分内容来自维基百科 robots.txt 词条
robots.txt(统一小写)是一种存放于网站根目录下的 ASCII 编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的 URL 是大小写敏感的,所以 robots.txt 的文件名应统一为小写。robots.txt 应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的 robots.txt,或者使用 robots 元数据(Metadata,又称元数据)。
这个协议也不是一个规范,而只是约定俗成的,有些搜索引擎会遵守这一规范,而其他则不然。通常搜索引擎会识别这个元数据,不索引这个页面,以及这个页面的链出页面。
·---------------------------------------------------
在使用爬虫过程中,我们应尽可能的遵循 robots 协议,在非学习交流与为目的的场合严格遵循其规定。
同时,我们在爬取数据的过程中应该注重服务器负载,避免给服务器带来较大压力,很多小众网站服务器工作能力并没有我们想象的那么好,数个并发爬虫就能使服务器宕机。
对于设计企业数据,网站所有者隐私的信息我们应尽可能避免爬取,换位思考,如果你是网站搭建者,你也不希望你的数据被轻松盗用吧。
Robots 协议暂且介绍这么多,现在,点击下一步,让我们进入 Python 爬虫的世界吧
cd ~ python3
当看到>>>
的输入提示符时表示进入成功,请注意确认版本为 3.X
版本
导入requests库
之后的一些内容都在Python命令行中完成
import requests
定义网址为字符串变量
targetUrl = "http://www.baidu.com"
现在请跟随示例完成,之后您可以自行爬取其他页面
进行网页爬取
res = requests.get(targetUrl)
查看返回码
res.status_code
如果是200那么我们继续,如果不是、、、额、、、再试一次?
查看网页返回的字符集类型
res.encoding
你会发现得到的结果是 ISO-8859-1
然而百度真的是这样的吗?
尝试输出爬取结果
res.text
发现了什么?中文乱码,没错,很显然百度用的不是 ISO-8859-1
的字符集
查看爬取内容的二进制数据
res.content
你觉得是什么? utf-8
!没错,那么让我们继续
自动判断字符集类型
res.apparent_encoding
那么我们尝试直接更改 res.encoding
一项
更改字符集声明
res.encoding = res.apparent_encoding
再次尝试输出
res.text
Requests 库入门
-
从简单的例子开始
-
requests 库提供的方法
requests.request() 构造一个请求
requests.request(method, url, **kwargs)
**kwargs 的含义我们暂且放一放
requests.get() 获取 HTML 网页,类似于 HTTP 的 GET
requests.get(url, params=None, **kwargs)
Response = requests.get(url)
Response 这里是 requests 返回的一个对象,我们之后会具体讲解
requests.head() 获取 HTML 网页头信息,类似于 HTTP 的 HEAD
requests.head(url, **kwargs)
requests.post() 向 HTML 网页提交 POST 请求,类似于 HTTP 的 POST
requests.post(url, data=None, json=None, **kwargs)
requests.put() 向 HTML 网页提交 PUT 请求,类似于 HTTP 的 PUT
requests.put(url, data=None, **kwargs)
requests.patch() 向 HTML 网页提交局部修改请求,类似于 HTTP 的 PATCH
requests.patch(url, data=None, **kwargs)
requests.delete() 向 HTML 页面提交删除请求,类似于 HTTP 的 DELETE
requests.delete(url, **kwargs)
Response 返回类型的基本属性
稍安勿躁
,在进行下一步实操之前,让我们再了解一下之前我们涉及到的 Response 的部分基本属性
.status_code
HTML 返回的状态码,你可以参考百度百科上的内容了解具体的含义
.text
内容的字符串形式,简而言之,就是网页上的内容
.encoding
从 HTTP header中获得响应内容编码方式,如果在 header 里没有声明,那么将会是 ISO-8859-1
.apparent_encoding
从内容中分析出的响应内容编码方式,在执行过程中会对各种编码的概率进行计算,给出最可能的编码类型,注意在程序中使用它会导致程序速度变慢。
.content
html 内容的二进制显示,对于图片这样的非文本文件,二进制的输出是必要的
raise_for_status()
这是我们上一个程序示例中没有出现的内容,但它很重要
如果不是 200,产生异常
网络传输存在着不确定性,发现并及时处理异常非常重要
重新打开 Python 命令行
cd ~ python3
导入 requests 库,这次我们爬取一个不存在的页面
targetUrl = "https://cloud.tencent.com/dsadfas" res = requests.get(targetUrl) res.raise_for_status()
不出意外的话你就能看到 Python 的报错信息
值得我们注意的是这里是产生中断的报错,而不是一个警告,通过 try...except...
我们可以实现对 http 请求错误的处理。
问题分析与处理
如果你对html请求熟悉,那么一定知道 user-agent
这玩意儿,它标识了访问者浏览器的类型,Python 很诚实的告诉网站服务器它是一个 Python 程序,然而如果我们希望获得其中的内容就需要更改这个 user-agent
。
在之前基础上这么尝试:
h = { "user-agent":"Mozilla/5.0 (MSIE 10.0; Windows NT 6.1; Trident/5.0)" } #这里用的是IE的user-agent res = requests.get(url,headers = h) print(res.status_code)
小结
http 请求 headers 中包含的信息并不只有 user-agent,很多网站都有反爬的基本策略,有的检查 user-agent,类似于我们之前看到的亚马逊,有的网站会检查 host,refer 等字段,这些内容是否需要确定,如何更改相信有了之前的例子你已经懂了,关于更多这部分的内容不属于本教程的范畴,请自行查阅相关资料。
headers 作为参数传递给 requests 库时,应该使用字典格式,把需要的内容放到字典中,剩下的 requests 会帮你解决。
更多参数
和之前出现过的 headers 类似,还有一些参数是我们所需要的这里给出简要,具体使用请自行尝试。
params : 字典或字节序列,作为参数增加到 url 中
data : 字典、字节序列或文件对象,作为 Request 的内容
json : JSON 格式的数据,作为 Request 的内容
headers : 字典,HTTP 定制头
cookies : 字典或 CookieJar, Request 中的 cookie
auth : 元组,支持 HTTP 认证功能
files : 字典类型,传输文件
timeout : 设定超时时间,秒为单位
proxies : 字典类型,设定访问代理服务器,可以增加登录认证
allow_redirects : True/False,默认为 True,重定向开关
stream : True/False, 默认为 True, 获取内容立即下载开关
verify : True/False, 默认为 True, 认证 SSL 证书开关
cert : 本地 SSL 证书路径
*以上内容来源网络