✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。
????个人主页:算法工程师的学习日志
昨晚分享了Python爬虫的基本知识,本文分享一下爬虫里面请求相关的内容:Requests 用法。
往期知识回顾:
12.奇怪知识(1) --Matlab爬虫获取王者荣耀英雄皮肤
在了解完爬虫相关的基础知识以后,我们就可以尝试去开发自己的爬虫程序了。我们使用的是Python 语言来开发爬虫,其中不得不学习的就是关于 requests 库的使用了
1、安装 requests 库
因为学习过程使用的是 Python 语言,需要提前安装 Python ,我安装的是 Python 3.8,可以通过命令 python --version 查看自己安装的 Python 版本,建议安装 Python 3.X 以上的版本。
安装好 Python 以后可以 直接通过以下命令安装 requests 库。
Ps:可以切换到国内的pip源,例如阿里、豆瓣,速度快
为了演示功能,我这里使用nginx模拟了一个简单网站。
下载好了以后,直接运行根目录下的 nginx.exe 程序就可以了(备注:windows环境下)。
这时本机访问 :http://127.0.0.1 ,会进入 nginx 的一个默认页面。
2、获取网页
下面我们开始用 requests 模拟一个请求,获取页面源代码。
执行以后得到的结果如下:
3、关于请求
常见的请求有很多种,比如上面的示例使用的就是 GET 请求,这里详细介绍一下这些常见的请求方法。
关于请求的测试,介绍一个网站 :http://httpbin.org/ ,这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持GET、POST等多种方法,对 web 开发和测试很有帮助。它用 Python + Flask 编写,是一个开源项目。
4、GET 请求
4.1、发起请求
我们使用相同的方法,发起一个 GET 请求:
返回结果如下:
通过返回结果,我们可以看到返回结果所包括的信息有:Headers、URL、IP等。
4.2、添加参数
平时我们访问的 URL 会包含一些参数,比如:id是100,name是YOOAO。正常的访问,我们会编写如下 URL 进行访问:
显然很不方便,而且参数多的情况下会容易出错,这时我们可以通过 params 参数优化输入内容。
这是执行代码返回的结果如下:
通过返回结果,我们可以看到,通过字典方式传输的参数被自动构造成了完整的 URL ,不需要我们自己手动完成构造。
4.3、返回结果处理
返回结果是 json 格式,因此我们可以使用调用 json 的方法来解析。如果返回内容不是 json 格式,这种调用会报错。
返回结果:
4.4、内容抓取
这里我们使用简单的正则表达式,来抓取nginx示例页面种所有< a >标签的内容,代码如下:
抓取结果:
这里一次简单的页面获取和内容抓取就完成了,
4.5、数据文件下载
上面的示例,返回的都是页面信息,如果我们想获取网页上的图片、音频和视频文件,我们就需要学会抓取页面的二进制数据。我们可以使用 open 方法来完成图片等二进制文件的下载,示例代码:
open 方法中,它的第一个参数是文件名称,第二个参数代表以二进制的形式打开,可以向文件里写入二进制数据。
运行结束以后,会在运行文件的同级文件夹下保存下载下来的图片。运用同样原理,我们可以处理视频和音频文件。
4.6、添加headers
在上面的示例中,我们直接发起的请求,没有添加 headers ,某些网站为因为请求不携带请求头而造成访问异常,这里我们可以手动添加 headers 内容,模拟添加 headers 中的 Uer-Agent 内容代码:
执行结果:
结果可见,User-Agent 的值变了。不是之前的:python-requests/2.23.0。
5、POST 请求
GET请求相关的知识都讲完了,下面讲讲另一个常见的请求方式:POST请求。
使用 requests 实现 POST 请求的代码如下:
结果如下
从 form 中我们看到了自己提交的数据,可见我们的 POST 请求访问成功。
6、响应
访问URL时,有请求就会有响应,上面的示例使用 text 和 content 获取了响应的内容。除此以外,还有很多属性和方法可以用来获取其他信息,比如状态码、响应头、Cookies 等。
关于状态码,requests 还提供了一个内置的状态码查询对象 requests.codes,用法示例如下:
这里通过比较返回码和内置的成功的返回码,来保证请求得到了正常响应,输出成功请求的消息,否则程序终止。
这里我们用 requests.codes.ok 得到的是成功的状态码 200。
这样的话,我们就不用再在程序里面写状态码对应的数字了,用字符串表示状态码会显得更加直观。
下面是响应码和查询条件对照信息:
7、SSL 证书验证
现在很多网站都会验证证书,我们可以设置参数来忽略证书的验证。
或者制定本地证书作为客户端证书:
注意:本地私有证书的 key 必须是解密状态,加密状态的 key 是不支持的。
8、设置超时
很多时候我们需要设置超时时间来控制访问的效率,遇到访问慢的链接直接跳过。
示例代码:
将连接时间和读取时间分开计算:
不添加参数,默认不设置超时时间,等同于:
9、身份认证
遇到一些网站需要输入用户名和密码,我们可以通过 auth 参数进行设置。
简化写法:
10、设置代理
如果频繁的访问某个网站时,后期会被一些反爬程序识别,要求输入验证信息,或者其他信息,甚至IP被封无法再次访问,这时候,我们可以通过设置代理来避免这样的问题。
若你的代理需要使用HTTP Basic Auth,可以使用
http://user:password@host/ 语法:
要为某个特定的连接方式或者主机设置代理,使用 scheme://hostname 作为 key, 它会针对指定的主机和连接方式进行匹配。