当前位置: 首页 > news >正文

爬虫基本库的使用(requests库的详细解析)

注:本文一共4万多字,希望读者能耐心读完!!!    

     前面,我们了解了urllib库的基本用法(爬虫基本库的使用(urllib库的详细解析)-CSDN博客)。其中,确实又不方便的地方。例如处理网页验证和Cookie时,需要写Opener类和Handler类来处理。另外实现POST、PUT等请求时的写法也不太方便。

        为了更加方便地实现这些操作,产生了更为强大的库----requests。有了它,Cookie、登录验证、代理设置更加方便。(request库是爬虫请求网页最为常用的库!!!因为它更加方便!!!哇,今天又是深爱Python的一天!!!)

目录

request的使用

1、准备工作

2、实例引入

3、GET请求

(1)抓取网页

(2)抓取二进制数据

(3)添加请求头

4、 POST 请求

5、响应

6、高级用法

(1)文件上传

(2)Cookie设置

(3)Session维持(会话保持)

(4)SSL证书验证

(5)超时设置

(6)身份认证

(7)代理设置


request的使用

1、准备工作

        在开始学习之前,请确保已经正确安装好 requests库,如果尚未安装,可以使用pip3来安装:

pip3 install requests

2、实例引入

        urllib库中的 urlopen方法实际上是以GET方式请求网页, requests库中相应的方法就是get 方法,是不是感觉表意更直接一些? 下面通过实例来看一下:

import requests
r = requests.get('http://www.baidu.com/')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.text[:100])
print(r.cookies)

结果运行:

<class 'requests.models.Response'>
200
<class 'str'>
<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charse
<RequestsCookieJar[Cookie(version=0, name='BIDUPSID', value='13147539105C73AFAA7AF930BAE5FB0C', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=3855965406, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), Cookie(version=0, name='PSTM', value='1708481758', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=3855965406, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), Cookie(version=0, name='H_PS_PSSID', value='40123_40170_40202_39661_40210_40207_40217_40222', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=True, path='/', path_specified=True, secure=False, expires=1740017758, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), Cookie(version=0, name='BAIDUID', value='13147539105C73AFAA7AF930BAE5FB0C:FG=1', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=1740017759, discard=False, comment=None, comment_url=None, rest={}, rfc2109=False), Cookie(version=0, name='BAIDUID_BFESS', value='13147539105C73AFAA7AF930BAE5FB0C:FG=1', port=None, port_specified=False, domain='.baidu.com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=True, expires=1740017759, discard=False, comment=None, comment_url=None, rest={'SameSite': 'None'}, rfc2109=False)]>

        这里我们调用get 方法实现了与urlopen 方法相同的操作,返回一个Response对象,并将其存放在变量r中,然后分别输出了响应的类型、状态码,响应体的类型、内容,以及 Cookie。观察运行结果可以发现, 返回的响应类型是 requests. models. Response, 响应体的类型是字符串str, Cookie 的类型是 RequestsCookieJar。使用get 方法成功实现一个 GET请求算不了什么,requests库更方便之处在于其他请求类型依然可以用一句话完成,实例如下:

import requests
r = requests.get('http://www.baidu.com/get')
r = requests.post('http://www.baidu.com/post')
r = requests.put('http://www.baidu.com/put')
r = requests.delete('http://www.baidu.com/delete')
r = requests.patch('http://www.baidu.com/patch')

        这里分别用Ppost、put、delete等方法实现了POST、PUT、DELETE等请求。是不是urllib库简单太多了?

3、GET请求

        HTTP中最常见的请求之一就是GET请求,首先来详细了解一下利用request库构建GET请求下面构建一个最简单的 GET 请求, 请求的链接为   https://www.httpbin.org/get,该网站会判断客户端发起的是否为 GET 请求,如果是,那么它将返回相应的请求信息:

import requests
r = requests.get('https://www.httpbin.org/get')
print(r.text)

运行结果如下:

{"args": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "www.httpbin.org", "User-Agent": "python-requests/2.31.0", "X-Amzn-Trace-Id": "Root=1-65d5618b-5521be945aef391e45338761"}, "origin": "111.72.55.172", "url": "https://www.httpbin.org/get"
}

       可以发现,我们成功发起了 GET请求,返回结果中包含请求头、URL、IP等信息。那么,对于GET 请求,如果要附加额外的信息,一般怎样添加呢? 例如现在想添加两个参数 name 和 age, 其中 name 是 germey、age 是 25, 于是 URL 就可以写成如下内容:

https://www.httpbin.org/get?name=germey&age=25

要构造这个请求链接,是不是要直接写成这样呢?

r = requests.get('https://www.httpbin.org/get?name=germey&age=25')

        这样也可以,但是看起来有点不人性化哎? 这些参数还需要我们手动去拼接,实现起来着实不优雅。一般情况下,我们利用params 参数就可以直接传递这种信息了,实例如下:

import requests
data = {
'name': 'germey',
'age': '25'
}
r = requests.get('https://www.httpbin.org/get', params=data)
print(r. text)

运行结果如下:

{"args": {"age": "25", "name": "germey"}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": "www.httpbin.org", "User-Agent": "python-requests/2.31.0", "X-Amzn-Trace-Id": "Root=1-65d562b8-378aa65d0b25a51e3f82955f"}, "origin": "111.72.55.172", "url": "https://www.httpbin.org/get?name=germey&age=25"
}

        上面我们把 URL 参数以字典的形式传给get方法的 params 参数,通过返回信息我们可以判断,请求的链接自动被构造成了https://www.httpbin.org/get?age=22&name=germey,   这样我们就不用自己构造 URL了, 非常方便。另外,网页的返回类型虽然是 str类型,但是它很特殊,是 JSON格式的。所以,如果想直接解析返回结果,得到一个 JSON格式的数据,可以直接调用json方法。实例如下:

import requests
r = requests.get('http://httpbin.org/get')
print(type(r.text))
print(r.json())
print(type(r.json()))

运行结果如下:

<class 'str'>
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'httpbin.org', 'User-Agent': 'python-requests/2.31.0', 'X-Amzn-Trace-Id': 'Root=1-65d5643b-1793288207d293fa4fe47885'}, 'origin': '111.72.55.172', 'url': 'http://httpbin.org/get'}
<class 'dict'>

        可以发现,调用json方法可以将返回结果转化为字典。

(1)抓取网页

        上面的请求链接返回的是JSON 格式的字符串,那么如果请求普通的网页,就肯定能获得相应的内容了。我们以一个实例页面https://ssr1.scrape.center/ 作为演示,往里面加入一点提取信息的逻辑,将代码完善成如下的样子:

import requests
import re
r = requests.get('https://ssr1.scrape.center/')
pattern = re.compile(r'<h2.*?>(.*?)</h2',re.S)
titles = re. findall(pattern, r.text)
print(titles)

        这个例子中,我们用最基础的正则表达式来匹配所有的标题内容。关于正则表达式,会在 2.3 节详细介绍,这里其只作为实例来配合讲解。

运行结果如下:

['霸王别姬 - Farewell My Concubine', '这个杀手不太冷 - Léon', 
'肖申克的救赎 - The Shawshank Redemption', '泰坦尼克号 - Titanic', 
'罗马假日 - Roman Holiday', '唐伯虎点秋香 - Flirting Scholar', 
'乱世佳人 - Gone with the Wind', '喜剧之王 - The King of Comedy', 
'楚门的世界 - The Truman Show', '狮子王 - The Lion King']

        我们发现,这里成功提取出了所有电影标题,只需一个最基本的抓取和提取流程就完成了。

(2)抓取二进制数据

        在上面的例子中,我们抓取的是网站的一个页面,实际上它返回的是一个HTML文档。要是想抓取图片、音频、视频等文件,应该怎么办呢?图片、音频、视频这些文件本质上都是由二进制码组成的,由于有特定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。所以,要想抓取它们,就必须拿到它们的二进制数据。下面以示例网站的站点图标为例来看一下:

import pprint
import requests
r = requests.get('https://scrape.center/favicon.ico')
pprint.pprint(r.text)
print()
pprint.pprint(r.content)

这里抓取的内容是站点图标,也就是浏览器中每一个标签上显示的小图标,如图所示。 

上述实例将会大人response对象的两个属性,一个是text,另一个是content。

运行r.text的结果:

('\x00\x00\x01\x00\x01\x00  \x00\x00\x01\x00 ''\x00�\x10\x00\x00\x16\x00\x00\x00(\x00\x00\x00 ''\x00\x00\x00@\x00\x00\x00\x01\x00 ''\x00\x00\x00\x00\x00\x00\x10\x00\x00\x12\x0b''\x00\x00\x12\x0b''\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��X@��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��X@��W?��W?��W?��W?��W?��W?��W?��X@��R:��J1��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��J1��R:��X@��W?��W?��W?��W?��W?��X@��R:��r]������������������������������������������������������������������������������������������r]��R:��X@��W?��W?��W?��W?��ZB��K2��������������������������������������������������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2��������������������������������������������������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2��������������������������������������������������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2��������������������������������������������������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2��������������������������t_��{g��zf��zf��zf��zf��zf��zf��zf��zf��{g��t_��������������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������t`��G-��Q8��O6��O6��O6��O6��O6��O6��O6��O6��Q8��G.��t_����������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������{h��Q8��ZC��YA��YB��[D��[D��[D��[D��[D��[D��]F��T<��}j����������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������zf��O6��YA��X@��T<��K2��K2��K2��K2��K2��K2��M4��C)��q\\����������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������zf��O6��YB��T;��fO����������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������zf��O6��ZC��O6��|j����������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������zf��O6��ZC��O6��{j����������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������zf��O6��ZC��O6��|j����������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������zf��O6��ZC��O6��|j����������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2����������������������zf��O6��YA��U=��_I��}l��|j��|j��|j��|j��|j��|j��|j��|j��|j��|j��{j��\x7fm��fP��T<��X@��W?��W?��W?��W?��ZB��K2����������������������zf��O6��YA��W?��U=��O5��O6��O6��O6��O6��O6��O6��O6��O6��O6��O6��O6��N5��T;��X@��W?��W?��W?��W?��W?��ZB��K2����������������������{h��Q8��ZC��YA��YA��[C��ZC��ZC��ZC��ZC��ZC��ZC��ZC��ZC��ZC��ZC��ZC��[C��XA��W?��W?��W?��W?��W?��W?��ZB��K2����������������������t`��H-��Q8��O6��O6��O6��O6��O6��O6��O6��O6��O6��O6��O6��O6��O6��P7��O6��T<��X@��W?��W?��W?��W?��W?��ZB��K2��������������������������s`��{h��zf��zf��zf��zf��zf��zf��zf��zf��zf��zf��zf��zf��zf��yf��|i��dO��U<��X@��W?��W?��W?��W?��ZB��K2��������������������������������������������������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2��������������������������������������������������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2��������������������������������������������������������������������������������������������������K2��ZB��W?��W?��W?��W?��ZB��K2��������������������������������������������������������������������������������������������������K2��ZB��W?��W?��W?��W?��X@��R:��r^������������������������������������������������������������������������������������������r]��R:��X@��W?��W?��W?��W?��W?��X@��R:��J1��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��K2��J1��R:��X@��W?��W?��W?��W?��W?��W?��W?��X@��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��ZB��X@��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

运行r.content的结果: 

(b'\x00\x00\x01\x00\x01\x00  \x00\x00\x01\x00 \x00\xa8\x10\x00\x00\x16\x00'b'\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\x00\x01\x00 \x00\x00\x00'b'\x00\x00\x00\x10\x00\x00\x12\x0b\x00\x00\x12\x0b\x00\x00\x00\x00'b'\x00\x00\x00\x00\x00\x00W?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffX@'b'\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB'b'\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB'b'\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB'b'\xeb\xffZB\xeb\xffX@\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffX@\xeb\xffR:\xea\xffJ1\xea\xffK2\xea\xffK2'b'\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2'b'\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2'b'\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffJ1\xea\xffR:\xea\xffX@'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffX@\xeb\xffR:'b'\xea\xffr]\xee\xff\x9f\x91\xf4\xff\x9a\x8a\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b'b'\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b'b'\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b'b'\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b'b'\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b\xf3\xff\x9b\x8b'b'\xf3\xff\x99\x8a\xf3\xff\x9f\x91\xf4\xffr]\xee\xffR:\xea\xffX@\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c'b'\xf3\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\x9a\x8c\xf3\xffK2\xea\xffZB'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x99\x8a'b'\xf3\xff\xff\xff\xff\xff\xfa\xf9\xfe\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfa\xf9\xfe\xff\xff\xff\xff\xff\x9a\x8a\xf3\xffK2\xea\xffZB'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c'b'\xf3\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\x9b\x8b\xf3\xffK2\xea\xffZB'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c'b'\xf3\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\x9b\x8b\xf3\xffK2\xea\xffZB'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c'b'\xf3\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff'b'\xff\xff\x95\x85\xf2\xfft_\xef\xff{g\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf'b'\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf\xef\xff{g\xef\xfft_\xee\xff\x95\x85'b'\xf3\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xfc\xfc\xff\xff\xff\xff'b'\xff\xff\x9b\x8b\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff\xff\xff\xfc\xfc'b'\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xfft`\xee\xffG-\xe9\xffQ8\xea\xffO6'b'\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6'b'\xea\xffQ8\xea\xffG.\xe9\xfft_\xee\xff\xff\xff\xff\xff\xfe\xfe'b'\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\x9b\x8b\xf3\xffK2\xea\xffZB'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c'b'\xf3\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff{h'b'\xef\xffQ8\xea\xffZC\xeb\xffYA\xeb\xffYB\xeb\xff[D\xec\xff[D\xec\xff[D'b'\xec\xff[D\xec\xff[D\xec\xff[D\xec\xff]F\xec\xffT<\xeb\xff}j\xf0\xff\xff\xff'b'\xff\xff\xfe\xfe\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\x9b\x8b\xf3\xffK2'b'\xea\xffZB\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2'b'\xea\xff\x9a\x8c\xf3\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xfe\xfe'b'\xff\xff\xff\xff\xff\xffzf\xee\xffO6\xea\xffYA\xeb\xffX@\xeb\xffT<\xeb\xffK2'b'\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffM4\xea\xffC)'b'\xe9\xffq\\\xee\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xfc\xfc\xff\xff\xff\xff'b'\xff\xff\x9b\x8b\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff\xff\xff\xfc\xfc'b'\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xffzf\xee\xffO6\xea\xffYB\xeb\xffT;'b'\xeb\xfffO\xeb\xff\x9a\x8a\xf3\xff\x98\x88\xf3\xff\x98\x88\xf3\xff\x98\x88'b'\xf3\xff\x98\x88\xf3\xff\x98\x88\xf3\xff\x99\x89\xf4\xff\x94\x83'b'\xf3\xff\xad\xa0\xf6\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xfc'b'\xff\xff\xff\xff\xff\xff\x9b\x8b\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xffzf\xee\xffO6'b'\xea\xffZC\xeb\xffO6\xeb\xff|j\xe9\xff\xff\xff\xfe\xff\xfe\xfe'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\x9b\x8b\xf3\xffK2'b'\xea\xffZB\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2'b'\xea\xff\x9a\x8c\xf3\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xfe\xfe'b'\xff\xff\xff\xff\xff\xffzf\xee\xffO6\xea\xffZC\xeb\xffO6\xeb\xff{j'b'\xea\xff\xff\xff\xfe\xff\xfb\xfb\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfd\xfd\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xfc'b'\xff\xff\xff\xff\xff\xff\x9a\x8b\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xffzf\xee\xffO6'b'\xea\xffZC\xeb\xffO6\xeb\xff|j\xea\xff\xff\xff\xfe\xff\xfd\xfd'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfb\xfb\xff\xff\xff\xff\xff\xff\x9a\x8b\xf3\xffK2'b'\xea\xffZB\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2'b'\xea\xff\x9a\x8c\xf3\xff\xff\xff\xff\xff\xfc\xfc\xff\xff\xfe\xfe'b'\xff\xff\xff\xff\xff\xffzf\xee\xffO6\xea\xffZC\xeb\xffO6\xeb\xff|j'b'\xe9\xff\xff\xff\xfe\xff\xfe\xfe\xff\xff\xff\xff\xfe\xff\xff\xff'b'\xfe\xff\xff\xff\xfe\xff\xff\xff\xfe\xff\xff\xff\xfe\xff\xff\xff'b'\xfe\xff\xff\xff\xfe\xff\xff\xff\xfe\xff\xff\xff\xfe\xff\xfc\xfc'b'\xfe\xff\xff\xff\xff\xff\x9b\x8c\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xffzf\xee\xffO6'b'\xea\xffYA\xeb\xffU=\xeb\xff_I\xe9\xff}l\xe9\xff|j\xea\xff|j\xea\xff|j'b'\xea\xff|j\xea\xff|j\xea\xff|j\xea\xff|j\xea\xff|j\xea\xff|j\xea\xff|j'b'\xea\xff{j\xea\xff\x7fm\xea\xfffP\xea\xffT<\xeb\xffX@\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xffzf\xee\xffO6'b'\xea\xffYA\xeb\xffW?\xeb\xffU=\xeb\xffO5\xeb\xffO6\xeb\xffO6\xeb\xffO6'b'\xeb\xffO6\xeb\xffO6\xeb\xffO6\xeb\xffO6\xeb\xffO6\xeb\xffO6\xeb\xffO6'b'\xeb\xffO6\xeb\xffN5\xeb\xffT;\xeb\xffX@\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff{h\xef\xffQ8'b'\xea\xffZC\xeb\xffYA\xeb\xffYA\xeb\xff[C\xeb\xffZC\xeb\xffZC\xeb\xffZC'b'\xeb\xffZC\xeb\xffZC\xeb\xffZC\xeb\xffZC\xeb\xffZC\xeb\xffZC\xeb\xffZC'b'\xeb\xffZC\xeb\xff[C\xeb\xffXA\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xfft`\xee\xffH-'b'\xe9\xffQ8\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6'b'\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6\xea\xffO6'b'\xea\xffP7\xea\xffO6\xea\xffT<\xeb\xffX@\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\x95\x85\xf2\xffs`'b'\xee\xff{h\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf'b'\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf\xef\xffzf'b'\xef\xffyf\xef\xff|i\xef\xffdO\xed\xffU<\xeb\xffX@\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xfc'b'\xff\xff\xff\xff\xff\xff\x9a\x8c\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe'b'\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfe\xfe\xff\xff\xfc\xfb'b'\xff\xff\xff\xff\xff\xff\x9a\x8b\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x99\x8a\xf3\xff\xff\xff'b'\xff\xff\xfa\xf9\xfe\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc'b'\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfc\xfc\xff\xff\xfa\xf9'b'\xfe\xff\xff\xff\xff\xff\x99\x8a\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffZB\xeb\xffK2\xea\xff\x9a\x8c\xf3\xff\xff\xff'b'\xff\xff\xfc\xfc\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfc\xfc'b'\xff\xff\xff\xff\xff\xff\x9b\x8c\xf3\xffK2\xea\xffZB\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffX@\xeb\xffR:\xea\xffr^\xee\xff\x9f\x91'b'\xf4\xff\x99\x8a\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c'b'\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c'b'\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c'b'\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c'b'\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x9a\x8c\xf3\xff\x99\x8a'b'\xf3\xff\x9f\x91\xf4\xffr]\xee\xffR:\xea\xffX@\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffX@\xeb\xffR:\xea\xffJ1\xea\xffK2\xea\xffK2'b'\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2'b'\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2'b'\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffK2\xea\xffJ1\xea\xffR:\xea\xffX@'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffX@\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB'b'\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB'b'\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB\xeb\xffZB'b'\xeb\xffZB\xeb\xffZB\xeb\xffX@\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?\xeb\xffW?'b'\xeb\xffW?\xeb\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

        可以注意到, r. text 中出现了乱码, r. content 的前面带有一个b, 代表这是 bytes类型的数据。由于图片是二进制数据,所以前者在打印时会转化为 str类型,也就是图片直接转化为字符串,理所当然会出现乱码。上面的运行结果我们并不能看懂,它实际上是图片的二进制数据。不过没关系,我们将刚才提取到的信息保存下来就好了,代码如下:

import requests
r = requests.get('https://scrape.center/favicon.ico')
with open('favicon.ico', 'wb') as f:f. write(r.content)

        这里采用了open方法,其第一个参数是文件名称,第二个参数代表以二进制写的形式打开文件,可以向文件里写入二进制数据。上述代码运行结束之后,可以发现在文件夹中出现了名为favicon.ico的图标。这样,就把二进制数据成功保存成了一张图片,这个小图标被我们成功爬取下来了。同样的,音频和视频也是用这种方法获取。

(3)添加请求头

        我们知道,在发起HTTP 请求的时候,会有一个请求头Request Headers,那么怎么设置这个请求头呢?很简单,使用headers 参数就可以完成了。在刚才的实例中,实际上是没有设置请求头信息的,这样的话,某些网站会发现这并不是一个由正常浏览器发起的请求,于是可能会返回异常结果,导致网页抓取失败。要添加请求头信息,例如这里我们想添加一个 User-Agent 字段,就可以这么写:

import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac 05 X 10 11 4) AppleWebKit/537.36(KHTML, like Gecko)Chrome/61.0.3163.100'
}
r = requests.get('https://ssr1.scrape.center/', headers=headers)
print(r. text)

        当然,可以在这个headers参数中添加任意其他字段信息。

4、 POST 请求

        前面我们了解了最基本的 GET请求,另外一种比较常见的请求方式是 POST。使用requests 库实现 POST 请求同样非常简单,实例如下:

import requests
data = {'name': 'germey', 'age': '25'}
r = requests.post("https://www.httpbin.org/post", data=data)
print(r. text)

        这里还是请求     https://www.httpbin.org/post,     该网站可以判断请求是否为POST方式,如果是, 就返回相关的请求信息。

运行结果如下:

{"args": {}, "data": "", "files": {}, "form": {"age": "25", "name": "germey"}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "18", "Content-Type": "application/x-www-form-urlencoded", "Host": "www.httpbin.org", "User-Agent": "python-requests/2.31.0", "X-Amzn-Trace-Id": "Root=1-65d580ed-443ee1b036dd61c54d83edd7"}, "json": null, "origin": "111.72.55.172", "url": "https://www.httpbin.org/post"
}

        可以发现,成功获取了返回结果,其中form部分就是提交的数据,这证明了POST请求成功发送了。

5、响应

        请求发送后,自然会得到响应。在上面的实例中,我们使用text和content 获取了响应的内容。此外,还有很多属性和方法可以用来获取其他信息,例如状态码、响应头、Cookie等。实例如下:

import requests
r = requests.get('https://ssr1.scrape.center/')
print(type(r.status_code), r.status_code)
print(type(r.headers), r.headers)
print(type(r.cookies), r.cookies)
print(type(r.url), r.url)
print(type(r.history), r.history)

        这里通过statuscode属性得到状态码、通过headers属性得到响应头、通过cookies属性得到Cookie、通过url属性得到URL、通过history属性得到请求历史。并将得到的这些信息分别打印出来。

运行结果如下:

<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Wed, 21 Feb 2024 04:54:19 GMT', 'Content-Type': 'text/html; charset=utf-8', 'X-Frame-Options': 'DENY', 'X-Content-Type-Options': 'nosniff', 'Expires': 'Wed, 21 Feb 2024 05:03:57 GMT', 'Strict-Transport-Security': 'max-age=15724800; includeSubDomains', 'Server': 'Lego Server', 'X-Cache-Lookup': 'Cache Miss, Cache Miss', 'Cache-Control': 'max-age=600', 'Age': '0', 'Content-Length': '41667', 'X-NWS-LOG-UUID': '15636374617952629126', 'Connection': 'keep-alive'}
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[]>
<class 'str'> https://ssr1.scrape.center/
<class 'list'> []

6、高级用法

        前面我们已经学习了requests库的基本用法,如基本的GET、POST请求及response对象。接下来,我们再来了解一些requests库的高级用法。

(1)文件上传

        我们知道requests库可以模拟提交一些数据。此外,要是有网站需要上传文件,也可以用它来实现。

实例代码如下:

import requests
files = {'file': open('favicon. ico', 'rb')}
r = requests.post('http://httpbin.org/post', files=files)
print(r.text)

        前面,我们保存了一个favicon.ico文件,这里用它来模拟文件上传的过程,注意文件需要和当前脚本在同一目录下。

结果如下:

{"args": {}, "data": "", "files": {"file": "data:application/octet-stream;base64,AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAABILAAASCwAAAAAAAAAAAABXP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1hA6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WEDr/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9YQOv/Ujrq/0ox6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0ox6v9SOur/WEDr/1c/6/9XP+v/Vz/r/1c/6/9XP+v/WEDr/1I66v9yXe7/n5H0/5qK8/+bi/P/m4vz/5uL8/+bi/P/m4vz/5uL8/+bi/P/m4vz/5uL8/+bi/P/m4vz/5uL8/+bi/P/m4vz/5uL8/+bi/P/m4vz/5uL8/+ZivP/n5H0/3Jd7v9SOur/WEDr/1c/6/9XP+v/Vz/r/1c/6/9aQuv/SzLq/5qM8Pz///z8mozz/0sy6v9aQuv/Vz/r/1c/6/9XP+v/Vz/r/1pC6/9LMur/mYrz///6+f7//Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P//+vn+//+aivP/SzLq/1pC6/9XP+v/Vz/r/1c/6/9XP+v/WkLr/0sy6v+ajPP///z8//7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v/8/P///5uL8/9LMur/WkLr/1c/6/9XP+v/Vz/r/1c/6/9aQuv/SzLq/5qM8Pz///z8m4vz/0sy6v9aQuv/Vz/r/1c/6/9XP+v/Vz/r/1pC6/9LMur/mozz///8/P///v7///+VhfL/dF/v/3tn7/96Zu//embv/3pm7/96Zu//embv/3pm7/96Zu//embv/3tn7/90X+7/lYXz///+/v///Pz///+bi/P/SzLq/1pC6/9XP+v/Vz/r/1c/6/9XP+v/WkLr/0sy6v+ajPP///z8///+/v///3Rg7v9HLen/UTjq/0826v9PNur/Tzbq/0826v9PNur/Tzbq/0826v9PNur/UTjq/0cu6f90X+7///7+///8/P///5uL8/9LMur/WkLr/1c/6/9XP+v/Vz/r/1c/6/9aQuv/SzLq/5qM8Pz///7+e2jv/1E46v9aQ+v/WUHr/1lC6/9bROz/W0Ts/1tE7P9bROz/W0Ts/1tE7P9dRuz/VDzr/31q8P///v7///z8m4vz/0sy6v9aQuv/Vz/r/1c/6/9XP+v/Vz/r/1pC6/9LMur/mozz///8/P///v7///96Zu7/Tzbq/1lB6/9YQOv/VDzr/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0006v9DKen/cVzu///+/v///Pz///+bi/P/SzLq/1pC6/9XP+v/Vz/r/1c/6/9XP+v/WkLr/0sy6v+ajPP///z8///+/v///3pm7v9PNur/WULr/1Q76/9mT+v/morz/5iI8/+YiPP/mIjz/5iI8/+YiPP/mYn0/5SD8/+toPb8/P///5uL8/9LMur/WkLr/1c/6/9XP+v/Vz/r/1c/6/9aQuv/SzLq/5qM8Pz///7+embu/0826v9aQ+v/Tzbr/3xq6f7//v7///z8m4vz/0sy6v9aQuv/Vz/r/1c/6/9XP+v/Vz/r/1pC6/9LMur/mozz///8/P///v7///96Zu7/Tzbq/1pD6/9PNuv/e2rq/v/7+Pz///z8///8/P///Pz///z8///8/P///f3//Pz///+ai/P/SzLq/1pC6/9XP+v/Vz/r/1c/6/9XP+v/WkLr/0sy6v+ajPP///z8///+/v///3pm7v9PNur/WkPr/0826/98aur+//39///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///7+5qL8/9LMur/WkLr/1c/6/9XP+v/Vz/r/1c/6/9aQuv/SzLq/5qM8Pz///7+embu/0826v9aQ+v/Tzbr/3xq6f7//v7//v7+/v7+/v7+//z8/v//m4zz/0sy6v9aQuv/Vz/r/1c/6/9XP+v/Vz/r/1pC6/9LMur/mozz///8/P///v7///96Zu7/Tzbq/1lB6/9VPev/X0np/31s6f98aur/fGrq/3xq6v98aur/fGrq/3xq6v98aur/fGrq/3xq6v98aur/e2rq/39t6v9mUOr/VDzr/1hA6/9XP+v/Vz/r/1c/6/9XP+v/WkLr/0sy6v+ajPP///z8///+/v///3pm7v9PNur/WUHr/1c/6/9VPev/TzXr/0826/9PNuv/Tzbr/0826/9PNuv/Tzbr/0826/9PNuv/Tzbr/0826/9PNuv/TjXr/1Q76/9YQOv/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9aQuv/SzLq/5qM8Pz///7+e2jv/1E46v9aQ+v/WUHr/1lB6/9bQ+v/WkPr/1pD6/9aQ+v/WkPr/1pD6/9aQ+v/WkPr/1pD6/9aQ+v/WkPr/1pD6/9bQ+v/WEHr/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1pC6/9LMur/mozz///8/P///v7///90YO7/SC3p/1E46v9PNur/Tzbq/0826v9PNur/Tzbq/0826v9PNur/Tzbq/0826v9PNur/Tzbq/0826v9PNur/UDfq/0826v9UPOv/WEDr/1c/6/9XP+v/Vz/r/1c/6/9XP+v/WkLr/0sy6v+ajPP///z8///+/v///5WF8v9zYO7/e2jv/3pm7/96Zu//embv/3pm7/96Zu//embv/3pm7/96Zu//embv/3pm7/96Zu//embv/3pm7/95Zu//fGnv/2RP7f9VPOv/WEDr/1c/6/9XP+v/Vz/r/1c/6/9aQuv/SzLq/5qM8Pz///z8mozz/0sy6v9aQuv/Vz/r/1c/6/9XP+v/Vz/r/1pC6/9LMur/mozz///8/P/+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v///Pv///+ai/P/SzLq/1pC6/9XP+v/Vz/r/1c/6/9XP+v/WkLr/0sy6v+ZivP///r5/v/8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///8/P///Pz///z8///6+f7//5mK8/9LMur/WkLr/1c/6/9XP+v/Vz/r/1c/6/9aQuv/SzLq/5qM8Pz///z8m4zz/0sy6v9aQuv/Vz/r/1c/6/9XP+v/Vz/r/1hA6/9SOur/cl7u/5+R9P+ZivP/mozz/5qM8/+ajPP/mozz/5qM8/+ajPP/mozz/5qM8/+ajPP/mozz/5qM8/+ajPP/mozz/5qM8/+ajPP/mozz/5qM8/+ajPP/mYrz/5+R9P9yXe7/Ujrq/1hA6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1hA6/9SOur/SjHq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SzLq/0sy6v9LMur/SjHq/1I66v9YQOv/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1hA6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WkLr/1pC6/9aQuv/WEDr/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/Vz/r/1c/6/9XP+v/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="}, "form": {}, "headers": {"Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Content-Length": "4434", "Content-Type": "multipart/form-data; boundary=0e3638982dfcbdf8de242888ace2ec4c", "Host": "httpbin.org", "User-Agent": "python-requests/2.31.0", "X-Amzn-Trace-Id": "Root=1-65d58321-1c03621214db59c22a0c724b"}, "json": null, "origin": "111.72.55.172", "url": "http://httpbin.org/post"
}

(2)Cookie设置

        我们先用一个实例看一下获取Cookie的过程:

import requests
r = requests.get('https://www.baidu.com')
print(r.cookies)
for key, value in r.cookies.items():print(key+'='+value)

运行结果如下:

<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315

        这里首先调用cookies属性,成功得到Cookie,可以发现它是RequestsCookieJar类型。然后调用items方法将Cookie转换为元组组成的列表,遍历输出每一个cookie条目的名称和值,实现对Cookie的遍历解析。

        当然,Cookie是用来维持登录状态的。下面以GitHub为例说明,首先我们登录GitHub,后去到Cookie内容。

        现在访问GitHub会经常出现访问不到,速度慢等问题,这是由于GitHub收到了DNS污染,禁用了国内许多ip的访问。推荐大家根据看一下这篇帖子(解决GitHub访问问题),博主亲试,非常好用!!!

        在请求头里面找到Cookie和User-Agent内容,把它复制下来,放入以下代码中:

import requestsheaders = {'Cookie': '_octo=GH1.1.768603740.1708499441; preferred_color_mode=light; tz=Asia%2FShanghai; _device_id=c11190988951d1323777f580db4d4b8d; has_recent_activity=1; saved_user_sessions=125776147%3Al9manaFSpASoXL7iJzCQDJzY2JdIt6iMj_fj-zwkuKsimnDV; user_session=l9manaFSpASoXL7iJzCQDJzY2JdIt6iMj_fj-zwkuKsimnDV; __Host-user_session_same_site=l9manaFSpASoXL7iJzCQDJzY2JdIt6iMj_fj-zwkuKsimnDV; tz=Asia%2FShanghai; color_mode=%7B%22color_mode%22%3A%22auto%22%2C%22light_theme%22%3A%7B%22name%22%3A%22light%22%2C%22color_mode%22%3A%22light%22%7D%2C%22dark_theme%22%3A%7B%22name%22%3A%22dark%22%2C%22color_mode%22%3A%22dark%22%7D%7D; logged_in=yes; dotcom_user=hecticlin; _gh_sess=H0lK2UCH9tgRwT7SJylln1komGjpUDljV6H4dWfLqvwq8JPI%2F1%2B5xcY95r%2Fj5e9I4iKYqEkXwQ3KpaTXf7HRfU5JtHzYFVDvd%2FF2ryKuUwULeBpESJPautwpaHes8nj5zLz5%2ByGSAyVmjRkKpyaiuA5M0zhaxwRLEnMZCROTZ5UU6wJCjG2cs0enYxV061zaXpzu2XYXGRzotAG05JDOJxKeK1Gj7IyK5WwWqG8frKw%2BwS3jsy9MSeLiW0wUUDK0lU19%2FRivUwbAaIewEdKeIPCQxNl38Ndz%2BULV4SYWncdeF0abi5jjEW%2FV0f7QtHaRgudJaOpYLsaLJlyDG64cJ10aRuqqYRnloi1GgkAaN13C3AY9C76XbQIcrW1xV09segUmXxkI452ieCLSLMS2c7RtvbTr3Wo2mr5NyTP5Vc4KRclaH3lMukyMGrSEdOzV%2F4pt8h6KUBwue%2FFEeJLmzQf1T0rC23qCRgG7Nty3Hp6WqTWKkTskIP75ZdbGjzQom7lOw%2Blg6K2OW52ATvfAxdFhyUwmk1I3fmV1yCvJV%2FmtmR7b5%2FnHLLwbAsDmYJZC7tHT78LuX%2Flp6oHxCHkEMe7iOZ%2FZNFIGNg0fHp1n%2BETf55vw1dIlTvCEar1svSZGXpeGKl4%2BsuqlYUqVKJKg%2FFQQYQ%2BQVS2UwsQ5fcvcnmc2Y%2BzI3PEBJyhU%2Fb5RiDUzsqDLDwC6rHUYMaHGB2ZXeReTx4M3szwaRDeWKD6ayAci0%2FcZSQGlVFVp1PuWOJnNes%2BM3KqfLYg77ZmwpKJsOpDyhFIw9ht4MAQAO9C06myKipvcWB4arMbtb8rJ7XLq9wY0zL7Q4QYkOlVD7b%2FWaXtiLET4Jh%2FvWEav0a4Jg4MkhELjQUD3zTwmEWFym7s8mKaIUV3oXbld33%2FYlU3PVcj9z95OEd8dmNIq849AyWlACzmY4IN6RujjxfLutCIBrqSkn5cl%2FURCE5CS9wvwne8Aq%2BnQEzrpYpy1QqDDW%2Fpihc%2BnJka1kwvsI2DYcyo78xRkDA%3D%3D--SfeweJQU5BOLVJLS--CMby5%2BhF1%2FoaTqRQ1ZHDOQ%3D%3D','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
r =requests.get('https://www.github.com', headers=headers)print(r.text)

 结果如下:

         可以发现,结果中包含了登录后才能包含的结果,其中有我的GitHub用户名。得到这样的结果,说明用Cookie成功模拟登录状态,这样就可以绕过登录就可以看到登录后的页面。可以将上面得到的Cookie保存为一个文本文件,需要用到的时候直接调用即可,不用再去手动获取了。

(3)Session维持(会话保持)

        会话保持有什么作用呢,举例说明一下如果有一个用户访问请求被分配到服务器A,并且在服务器A登录了,并且在很短的时间,这个用户又发出了一个请求,如果没有会话保持功能的话,这个用户的请求很有可能会被分配到服务器B去,这个时候在服务器B上是没有登录的,所以你要重新登录,但是用户并不知道自己的请求被分配到了哪里,用户的感觉就是登录了,怎么又要登录,用户体验很不好。要解决这个问题的方法就是维持同一个Session,而却不用担心Cookie的问题。

        我们来做个实验:一个测试网址:http://httpbin.org/cookies/set/number/123456789,请求这个网址时,设置了一个Cookie条目,名称是number,内容是123456789。随后又请求http://httpbin.org/cookies,以获取当前的Cookie信息。能不能成功获取设置的Cookie信息?

实例代码如下:

import requests
requests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.org/cookies')
print(r.text)

结果如下:

{"cookies": {}
}

        结果并不能,下面是我们试试用Session的方式试试。

实例代码如下:

import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

结果如下:

{"cookies": {"number": "123456789"}
}

        可以看到Cookie被成功获取到了!!!这就是同一个Session和不同Session的区别!!!因此,利用Session可以做到模拟同一个会话而不同担心Cookie问题,它通常在模拟登录成功之后,进行下一步操作时用到。

(4)SSL证书验证

        现在很多网站要求使用HTTPS协议, 但是有些网站可能并没有设置好 HTTPS证书, 或者网站的HTTPS证书可能并不被CA 机构认可,这时这些网站就可能出现SSL证书错误的提示。例如这个网站:https://ssr2.scrape.com.center/,如果用Chrome浏览器打开,则会提示“您的连接不是私密连接”这样的错误。

        那如何用requests库来访问这类网站呢?可以使用verify参数控制是否验证证书,如果将此类参数设置为False,那么在请求时就不会再验证证书是否有效。如果不设置verify参数,其默认值是True,会自动验证。代码如下:

import requests
response = requests.get('https://ssr2.scrape.com.center/', verify=False)
print(response.status_code)

结果如下:

 InsecureRequestWarning: Unverified HTTPS request is being made to host 'ssr2.scrape.com.center'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#tls-warningswarnings.warn(
410

        上面抛出了一个警告,它建议我们给它制定证书。我们可以设置忽略警告的方式来屏蔽警告:

import requests
import urllib3
urllib3.disable_warnings()
response = requests.get('https://ssr2.scrape.com.center/', verify=False)
print(response.status_code)

结果如下:

410

        结果为410,在HTTP协议中,状态码 410 Gone 表示资源在服务器上曾经存在,但是现在已经永久被删除并不可用。与 404 Not Found 相比,410 Gone 是明确地告知客户端,所请求的资源不再可用,并且这是一个永久的状态,也就是说不期望资源将来还会被恢复。虽然该网已被删除,但这也说明了我们成功获取到了响应。

(5)超时设置

        在本机网络状况不好或者服务器网络响应太慢甚至无响应时,我们可能会等待特别久的时间才能接收到响应,甚至到最后因为接收不到响应而报错。为了防止服务器不能及时响应,应该设置一个超时时间,如果超过这个时间还没有得到响应,就报错。这需要用到 timeout参数,其值是从发出请求到服务器返回响应的时间。实例如下:

import requests
r = requests.get('https://www.httpbin.org/get', timeout=1)
print(r. status_code)

        通过这样的方式,我们可以将超时时间设置为1秒,意味着如果1秒内没有响应,就抛出异常。实际上, 请求分为两个阶段: 连接(connect)和读取(read)。上面设置的 timeout 是用作连接和读取的 timeout 的总和。如果要分别指定用作连接和读取的 timeout,则可以传入一个元组:

r = requests.get('https://www.httpbin.org/get', timeout=(5, 30))

        如果想永久等待,可以直接将timeout 设置为None,或者不设置直接留空,因为默认取值是 None。这样的话,如果服务器还在运行,只是响应特别慢,那就慢慢等吧,它永远不会返回超时错误的或直接不加参数。

(6)身份认证

        在访问启用了基本身份认证的网站时(例如https://ssr3.scrape.center/),会弹出一个认证窗口,如图所示:

        这个网站就是启用了基本身份认证,我们可以利用urllib库来实现身份的校验,但实现起来相对烦琐。那在requests库中怎么做呢? 当然也有办法。我们可以使用requests 库自带的身份认证功能,通过 auth参数即可设置,实例如下:

import requests
from requests. auth import HTTPBasicAuth
r = requests.get('https://ssr3.scrape.center/', auth=HTTPBasicAuth('admin', 'admin'))
print(r. status_code)

        这个实例网站的用户名和密码都是 admin,在这里我们可以直接设置。如果用户名和密码正确,那么请求时就会自动认证成功,返回200状态码; 如果认证失败,则返回401状态码。当然, 如果参数都传一个 HTTPBasicAuth类, 就显得有点烦琐了,所以 requests 库提供了一个更简单的写法,可以直接传一个元组,它会默认使用HTTPBasicAuth这个类来认证。所以上面的代码可以直接简写如下:

import requests
r = requests.get('https://ssr3.scrape.center/', auth=('admin', 'admin'))
print(r. status_code)

        此外, requests 库还提供了其他认证方式, 如 OAuth 认证,不过此时需要安装 oauth 包, 安装命令如下:

pip3 install requests oauthlib

使用OAuth1 认证的示例方法如下:

import requests
from requests_oauthlib import OAuth1
url = 'https://api.twitter.com/1.1/account/verify credentials.json'
auth = OAuth1('YOUR APP KEY', 'YOUR APP SECRET',
'USER OAUTH TOKEN', 'USER OAUTH TOKEN SECRET')
requests.get(url, auth=auth)

(7)代理设置

        某些网站在测试的时候请求几次,都能正常获取内容。但是一旦开始大规模爬取,面对大规模且频繁的请求时,这些网站就可能弹出验证码,或者跳转到登录认证页面,更甚者可能会直接封禁客户端的 IP,导致在一定时间段内无法访问。那么,为了防止这种情况发生,我们需要设置代理来解决这个问题,

  •  代理的基本原理

        代理实际上就是指代理服务器,英文叫作 Proxy Server,功能是代网络用户取得网络信息。形象点说,代理是网络信息的中转站。当客户端正常请求一个网站时,是把请求发送给了 Web 服务器,Web服务器再把响应传回给客户端。设置代理服务器,就是在客户端和服务器之间搭建一座桥,此时客户端并非直接向 Web服务器发起请求,而是把请求发送给代理服务器,然后由代理服务器把请求发送给Web服务器,Web服务器返回的响应也是由代理服务器转发给客户端的。这样客户端同样可以正常访问网页,而且这个过程中Web服务器识别出的真实IP就不再是客户端的 IP了,成功实现了 IP伪装,这就是代理的基本原理。

  • 代理的作用

1、突破自身IP的访问限制,访问一些平时不能访问的站点。

2、访问一些单位或团体的内部资源。比如,使用教育网内地址段的免费代理服务器,就可以下载和上传对教育网开放的各类 FTP,也可以查询、共享各类资料等。

3、 提高访问速度。通常,代理服务器会设置一个较大的硬盘缓冲区,当有外界的信息通过时,会同时将其保存到自己的缓冲区中,当其他用户访问相同的信息时,直接从缓冲区中取出信息,提高了访问速度。

4、隐藏真实 IP。上网者可以通过代理隐藏自己的 IP,免受攻击。对于爬虫来说,使用代理就是为了隐藏自身IP,防止自身的 IP 被封锁。

        至此,requests库的基本用法介绍到此了,是不是比urllib库好用多啦!想要用requests库爬取网站可以看我爬虫实战的博客!基本上,我都是采用requests库进行请求的。

相关文章:

爬虫基本库的使用(requests库的详细解析)

注&#xff1a;本文一共4万多字&#xff0c;希望读者能耐心读完&#xff01;&#xff01;&#xff01; 前面,我们了解了urllib库的基本用法&#xff08;爬虫基本库的使用(urllib库的详细解析)-CSDN博客&#xff09;。其中&#xff0c;确实又不方便的地方。例如处理网页验证…...

QT实现串口通信

一.Qt串口通信 Qt提供了两个关于串口通信的C类&#xff0c;分别是QSerialPort和QSerialPortInfo。 QSerialPort类提供了操作串口的各种接口。 QSerialPortInfo是一个辅助类&#xff0c;可以提供计算机中可用的串口的各种信息。 QSerialPortInfo Class用于提供外部串行端口的…...

微信小程序 --- 通用模块封装(showToast,showModal ,本地存储)

目录 01. 为什么进行模块封装 02. 消息提示模块封装 03. 模态对话框封装 04. 封装本地存储 API 05. 拓展:封装异步存储API优化代码 01. 为什么进行模块封装 在进行项目开发的时候&#xff0c;我们经常的会频繁的使用到一些 API&#xff0c; 例如&#xff1a;wx.showToast…...

基于springboot+vue的音乐网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

pclpy 最小二乘法拟合平面

pclpy 最小二乘法拟合平面 一、算法原理二、代码三、结果1.左边原点云、右边最小二乘法拟合平面后点云投影 四、相关数据 一、算法原理 平面方程的一般表达式为&#xff1a; A x B y C z D 0 ( C ≠ 0 ) Ax By Cz D 0 \quad (C\neq0) AxByCzD0(C0) 即&#xff1a; …...

蓝桥杯备战刷题(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…...

Python习题详解

练习&#xff1a; 1&#xff0c;计算100以内奇数的和 #计算100以内所有奇数的和 sum 0 # n 1 # while n < 100: # # sum sum n # sum n # # n n 2 # n 2 # print(sum) n 99 #求偶数时n 100 while n > 0:sum n# n n - 2n - 2 print(sum)2&#xff0c;打印直…...

绩效考核利器:Excel报表模板,解锁企业高效员工评价新境界

一、背景与目标 在现今的企业管理中&#xff0c;绩效考核是一项至关重要的任务。它旨在评估员工的工作表现&#xff0c;激励员工积极进取&#xff0c;同时也是制定薪酬、晋升、培训等决策的重要依据。为了满足这一需求&#xff0c;我们设计了一款绩效考核Excel报表模板&#x…...

如何使用Lychee+cpolar搭建本地私人图床并实现远程访问存储图片

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…...

跨境支付介绍

1、跨境电商定义和分类&#xff1b; 2、国际贸易清结算&#xff1b; 3、跨境支付&#xff1b; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同&#xff0c;交易双方属于不同的国家。因此&#xff0…...

如何在Linux搭建MinIO服务并实现无公网ip远程访问内网管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…...

Cortex-M可以跑Linux操作系统吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; Cortex-M系列微控制器主要设计…...

日志系统项目(2)项目实现(实用工具类、日志等级类、日志消息类、日志格式化输出类)

前面的文章中我们讲述了日志系统项目的前置知识点&#xff0c;再本文中我们将开始日志项目的细节实现。 日志系统框架设计 本项目实现的是一个多日志器日志系统&#xff0c;主要实现的功能是让程序员能够轻松的将程序运行日志信息落地到指定的位置&#xff0c;且支持同步与异…...

剑指offer面试题19 二叉树的镜像

考察点 树的遍历知识点 题目 分析 我们分析算法题目的思路基本上都是归纳法&#xff0c;即通过举一些普通的例子来推理出算法流程&#xff0c;而画图又是举例子的常用手段&#xff0c;比如针对树或者链表画画图&#xff0c;针对数字类的举一些数字的例子寻找规律&#xff0c…...

SpringCloud Alibaba 2022之Nacos学习

SpringCloud Alibaba 2022使用 SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本&#xff0c;同时JDK需要是17及以上的版本。具体的可以看官网的说明。 Spring Cloud Alibaba版本说明 环境搭建 这里搭建的是一个聚合项目。项目结构如下&#xff1a; 父项目的pom.xm…...

js之数组遍历

for 可以用来遍历数组、字符串、类数组、DOM节点&#xff0c;可以更改原数组&#xff0c;可以使用break、continue 跳出循环 return 只能在函数内部使用 for(声明循环变量&#xff1b;判断循环条件&#xff1b;更新循环变量){循环体 }forEach 参数&#xff08;当前元素&#x…...

极狐GitLab 16.9 重磅发布,快来 pick 你心仪的功能吧~【五】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 沿袭我们的月度发版机制&#xff0c;今天我们正式发布极狐GitL…...

如何在本地部署密码管理软件bitwarden并结合cpolar实现远程同步

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序&#xff0c;适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…...

DT DAY3 信号和槽

作业&#xff1a; 1> 思维导图 2> 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 btn3 new QPushButton("按钮3",this);btn3->resize(ui->btn2->width(),ui->b…...

Spring、SpringBoot、SpringCloud三者的区别

Spring、Spring Boot 和 Spring Cloud 是构建企业级 Java 应用程序的不同层次的框架和工具。下面详细介绍它们之间的区别&#xff1a; 1. Spring框架&#xff1a; 概述&#xff1a; Spring 是一个全功能的企业级 Java 框架&#xff0c;提供了依赖注入、面向切面编程、事务管理…...

leetcode:46.全排列

1.什么是排列&#xff1f; 有顺序&#xff01;&#xff01; 2.树形结构&#xff1a; 使用used数组进行标记取过的元素&#xff0c;一个元素一个元素地进行取值&#xff0c;取完之后将used数组进行标记。 3.代码实现&#xff1a;&#xff08;循环从i0开始&#xff0c;而不是…...

基于STM32的宠物箱温度湿度监控系统

基于STM32的宠物箱温度湿度监控系统 一、引言 随着人们生活水平的提高,养宠物已经成为越来越多人的选择。宠物作为家庭的一员,其生活环境和健康状况受到了广泛关注。温度和湿度是影响宠物舒适度和健康的重要因素之一。因此,开发一款能够实时监控宠物箱温度和湿度的系统具有…...

《高质量的C/C++编程规范》学习

目录 一、编程规范基础知识 1、头文件 2、程序的板式风格 3、命名规则 二、表达式和基本语句 1、运算符的优先级 2、复合表达式 3、if语句 4、循环语句的效率 5、for循环语句 6、switch语句 三、常量 1、#define和const比较 2、常量定义规则 四、函数设计 1、参…...

客户端订阅服务端事件的机制

一、场景描述 产业大脑平台是一个典型的审核系统&#xff0c;用户发布到平台的信息需要经过审核员审核后生效。 用户发布信息->审核员审核信息->用户信息生效&#xff0c;这一流程可能发生在用户的同一次登录周期内。为了使客户端能实时响应信息的状态变化&#xff0c;…...

pulsar入门介绍

概述 Pulsar 是一个多租户、高性能的服务器到服务器消息传递解决方案。Pulsar 最初由 Yahoo 开发&#xff0c;由 Apache 软件基金会管理。 特点 Pulsar 的主要功能如下&#xff1a; 原生支持 Pulsar 实例中的多个集群&#xff0c;可跨集群无缝地复制消息。非常低的发布和端…...

Leetcode 3047. Find the Largest Area of Square Inside Two Rectangles

Leetcode 3047. Find the Largest Area of Square Inside Two Rectangles 1. 解题思路2. 代码实现 题目链接&#xff1a;3047. Find the Largest Area of Square Inside Two Rectangles 1. 解题思路 这道题倒是没啥特别的思路&#xff0c;直接暴力求解就是了&#xff0c;因此…...

ELK 简介安装

1、概念介绍 日志介绍 日志就是程序产生的&#xff0c;遵循一定格式&#xff08;通常包含时间戳&#xff09;的文本数据。 通常日志由服务器生成&#xff0c;输出到不同的文件中&#xff0c;一般会有系统日志、 应用日志、安全日志。这些日志分散地存储在不同的机器上。 日志…...

Linux 的交换空间(swap)是什么?有什么用?

目录 swap是什么&#xff1f;swap有什么用&#xff1f;swap使用典型场景如何查看你的系统是否用到交换空间呢&#xff1f;查看系统中swap in/out的情况 swap是什么&#xff1f; swap就是磁盘上的一块区域。它和Windows系统中的交换文件作用类似&#xff0c;但是它是一段连续的…...

消息中间件篇之RabbitMQ-消息不丢失

一、生产者确认机制 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后&#xff0c;会返回一个结果给发送者&#xff0c;表示消息是否处理成功。 当消息没有到交换机就失败了&#xff0c;就会返回publish-confirm。当消息没有到达MQ时&…...

MongoDB中的TTL索引:自动过期数据的深入解析与使用方式

目录 一、TTL索引的深入原理二、TTL索引的使用方式三、TTL索引的限制与考虑因素四、优化TTL索引的策略五、总结 一、TTL索引的深入原理 TTL&#xff08;Time-To-Live&#xff09;索引在MongoDB中是一种特殊的索引&#xff0c;用于自动删除过期的文档。其核心原理在于MongoDB会…...

IPV6地址

技术背景&#xff1a;对IPV4做优化&#xff0c;比如地址长度128&#xff0c;简化了报文头部---快 ipv6地址 十六进制&#xff0c;简写前导0忽略&#xff0c;连续的0写成:: IPv6地址类型 1.单播 2.组播---接口有地址后&#xff0c;自动加入到一个组播里 3.任播---允许地址…...

解密API关键词搜索(淘宝京东1688)商品列表数据

API关键词搜索商品列表数据&#xff1a;赋能电商行业的新动力 随着电子商务的蓬勃发展&#xff0c;API&#xff08;应用程序接口&#xff09;关键词搜索商品列表数据在电商行业中的重要性日益凸显。这一数据资源不仅为消费者提供了便捷的购物体验&#xff0c;还为电商企业带来…...

wpf 简单实验 数据更新 列表更新

1.概要 1.1 需求 一个列表提供添加修改删除的功能&#xff0c;添加和修改的内容都来自一个输入框 1.2 要点 DisplayMemberPath"Zhi"列表.ItemsSource datalist;(列表.SelectedItem ! null)(列表.SelectedItem as A).Zhi 内容.Text;datalist.Remove((列表.Selec…...

【Flink精讲】Flink性能调优:内存调优

内存调优 内存模型 JVM 特定内存 JVM 本身使用的内存&#xff0c;包含 JVM 的 metaspace 和 over-head 1&#xff09; JVM metaspace&#xff1a; JVM 元空间 taskmanager.memory.jvm-metaspace.size&#xff0c;默认 256mb 2&#xff09; JVM over-head 执行开销&#xff1…...

Java 中常用的数据结构类 API

目录 常用数据结构API 对应的线程安全的api 高可用衡量标准 常用数据结构API ArrayList: 实现了动态数组&#xff0c;允许快速随机访问元素。 import java.util.ArrayList; LinkedList: 实现了双向链表&#xff0c;适用于频繁插入和删除操作。 import java.util.LinkedLis…...

JavaScript学习小记(1)基本数据结构(数组,字符串)

一个寒假确实过的很快&#xff0c;这个寒假除了调包调参突然心血来潮想学一下前端&#xff0c;学习过程比较平滑&#xff0c;我是自己找的技术文档&#xff0b;写代码实践来学习的&#xff0c;教程视频虽然详细&#xff0c;但是真的一点都看不动。 目录 JS如何定义变量的老旧的…...

python opencv实现车牌识别

目录 一:实现步骤: 二:实现车牌检测 一:实现步骤: 使用Python和OpenCV实现车牌识别的步骤大致可以分为以下两部分: 车牌检测: 读取需要进行车牌识别的图片。 对图像进行灰度化处理,可能还包括高斯模糊和灰度拉伸。 进行开运算,消除图像中的噪声。 将灰度拉伸后的图…...

K8S节点GPU虚拟化(vGPU)

vGPU实现方案 4paradigm提供了k8s-device-plugin,该插件基于NVIDIA官方插件(NVIDIA/k8s-device-plugin),在保留官方功能的基础上,实现了对物理GPU进行切分,并对显存和计算单元进行限制,从而模拟出多张小的vGPU卡。在k8s集群中,基于这些切分后的vGPU进行调度,使不同的容器…...

NLP 使用Word2vec实现文本分类

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客 &#x1f366; 参考文章&#xff1a;365天深度学习训练营 &#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/…...

【Redis学习笔记03】Java客户端

1. 初识Jedis Jedis的官网地址&#xff1a;https://github.com/redis/jedis 1.1 快速入门 使用步骤&#xff1a; 注意&#xff1a;如果是云服务器用户使用redis需要先配置防火墙&#xff01; 引入maven依赖 <dependencies><!-- 引入Jedis依赖 --><dependency&g…...

神经网络系列---激活函数

文章目录 激活函数Sigmoid 激活函数Tanh激活函数ReLU激活函数Leaky ReLU激活函数Parametric ReLU激活函数 &#xff08;自适应Leaky ReLU激活函数&#xff09;ELU激活函数SeLU激活函数Softmax 激活函数Swish 激活函数Maxout激活函数Softplus激活函数 激活函数 一般来说&#xf…...

python中continue的对比理解

# 使用while循环&#xff0c;输入1-10之间的数字&#xff0c;除7之外。 以下为代码对比&#xff1a; # 使用while循环&#xff0c;输入1-10之间的数字&#xff0c;除7之外。 # 第一种方式 num 0 while num < 10:num num 1if num 7:print("")else:print(num)…...

Amazon Generative AI | 基于 Amazon 扩散模型原理的代码实践之采样篇

以前通过论文介绍 Amazon 生成式 AI 和大语言模型&#xff08;LLMs&#xff09;的主要原理之外&#xff0c;在代码实践环节主要还是局限于是引入预训练模型、在预训练模型基础上做微调、使用 API 等等。很多开发人员觉得还不过瘾&#xff0c;希望内容可以更加深入。因此&#x…...

[服务器-数据库]MongoDBv7.0.4不支持ipv6访问

文章目录 MongoDBv7.0.4不支持ipv6访问错误描述问题分析错误原因解决方式 MongoDBv7.0.4不支持ipv6访问 错误描述 报错如下描述 Cannot connect to MongoDB.No suitable servers found: serverSelectionTimeoutMS expired: [failed to resolve 2408]问题分析 首先确定其是…...

【b站咸虾米】chapter5_uniapp-API_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

课程地址&#xff1a;【新课uniapp零基础入门到项目打包&#xff08;微信小程序/H5/vue/安卓apk&#xff09;全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 5 API 5.1 页面和路…...

自学Python第十八天-自动化测试框架(二):DrissionPage、appium

自学Python第十八天-自动化测试框架&#xff08;二&#xff09;&#xff1a;DrissionPage、appium DrissionPage环境和安装配置准备工作简单的使用示例控制浏览器收发数据包模式切换 浏览器模式创建浏览器对象访问页面加载模式none 模式技巧 获取页面信息页面交互查找元素ele()…...

云尚办公-0.3.0

5. controller层 import pers.beiluo.yunshangoffice.model.system.SysRole; import pers.beiluo.yunshangoffice.service.SysRoleService;import java.util.List;//RestController&#xff1a;1.该类是控制器&#xff1b;2.方法返回值会被写进响应报文的报文体&#xff0c;而…...

汇编英文全称

mov move mvn Mov Negative ldr LoaD Register str Store Register lsl Logic Shift Left lsr Logic Shift Right asr Arithmetic Shift Right 算数右移 ror Rotate right 循环右移…...

基于虚拟力优化的无线传感器网络覆盖率matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 虚拟力优化算法 4.2 覆盖覆盖率计算 5.完整程序 1.程序功能描述 基于虚拟力优化的无线传感器网络覆盖率&#xff0c;仿真输出优化前后的网络覆盖率&#xff0c;覆盖率优化收敛迭代曲线…...

阿里云-系统盘-磁盘扩容

阿里云系统磁盘扩容 之前是测试环境磁盘用的默认的有 40G&#xff0c;后面升级到正式的 磁盘怕不够用打算升级到 100G&#xff0c; 系统镜像&#xff1a; Alibaba Cloud Linux 3.2104 LTS 64 位 磁盘 ESSD 40G 升级步骤&#xff1a; 扩容与创建快照 在阿里云后台首先去扩容…...