爬虫基本库的使用(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 requests

headers = {
    '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-warnings
  warnings.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库进行请求的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/405536.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【初中生讲机器学习】11. 回归算法中常用的模型评价指标有哪些?here!

创建时间&#xff1a;2024-02-19 最后编辑时间&#xff1a;2024-02-23 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

【LeetCode每日一题】 单调栈的案例 42. 接雨水

这道题是困难&#xff0c;但是可以使用单调栈&#xff0c;非常简洁通俗。 关于单调栈可以参考单调栈总结以及Leetcode案例解读与复盘 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 …

TensorFlow2.x 精选笔记(1)数据基本操作与线性代数

学习参考&#xff1a; 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning 一、数组与张量 虽然张量看起来是复杂的对象&#xff0c;但它们可以理解为向量和矩阵的集合。理解向量和矩阵对于理解张量至关重要。 向量是元素的一维列表&#xff0c;向量是一…

1.0 vue环境安装

1、安装node.js 1.1 下载最新版本Node.js (nodejs.org)Node.js 1.2 开始安装 普通的安装过程&#xff0c;也记录下吧 安装完成&#xff01; 1.3 检查nodejs是否安装成功 代开cmd命令窗口输入 node -v&#xff0c;如果看到了刚才下载的版本号&#xff0c;则表示已经安装成功…

建立不同类型网站分别大概需要多少钱??

如今&#xff0c;越来越多的企业会考虑建立一个企业官方网站来展示企业形象&#xff0c;或者建立一个电子商务网站平台来拓展业务渠道&#xff0c;或者建立一个企业内部网来协助企业进行网上工作。 网站建设的类型有很多种&#xff0c;不同类型的网站成本差异很大。 因此&#…

怎么在wifi中实现手机和电脑文件互传

有时我们想手机电脑文件互传&#xff0c;数据线却不在身边&#xff0c;这时我们可以用MiXplorer来实现wifi中手机和电脑互相访问文件。 MiXplorer是一款来自著名安卓开发者论坛XDA的作品&#xff0c;免费且功能强大&#xff0c;被很多人誉为是“全能文件管理器”。 1.在手机上…

【RT-DETR有效改进】利用YOLOv9的GELAN模块替换RepC3结构(附轻量化版本 + 高效涨点版本 + 手撕结构图)

一、本文介绍 本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进RT-DETR的RepC3结构&#xff0c;GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度&#xff0c;同时…

ChatGPT plus 的平替:9个可以联网的免费AI搜索引擎

ChatGPT plus 的平替&#xff1a;9个可以联网的免费AI搜索引擎。 由于ChatGPT 训练数据截止到2021年9月&#xff0c;在该时间点之后发生的事件&#xff0c;ChatGPT均无法给出答复。所以&#xff0c;大家现在都非常期待ChatGPT能够联网&#xff0c;访问实时的信息。 ChatGPT pl…

【Docker】构建pytest-playwright镜像并验证

Dockerfile FROM ubuntu LABEL maintainer "langhuang521l63.com" ENV TZAsia/Shanghai #设置时区 #安装python3依赖与下载安装包 RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \&& apt update \&&…

fpga_cpu加速

一 cpu流水线执行指令 二 计算机体系结构 注&#xff1a;ARM就是典型的哈佛结构 三 cpu加速 同样采用流水线&#xff0c;哈佛结构的指令效率更高&#xff0c;通过指令预取&#xff0c;提高了流水线的并行度。

Linux环境安装jira

jira 是项目与事务跟踪工具&#xff0c;被广泛应用于缺陷跟踪、客户服务、需求收集、流程审批、任务跟踪、项目跟踪和敏捷管理等工作领域。 jira 软件安装包直接搜官网&#xff0c;然后可以选择免费的来下载&#xff1a; 安装 jira 之前&#xff0c;需要 Java 和 mysql 环境的…

深度学习中数据的转换

原始&#xff08;文本、音频、图像、视频、传感器等&#xff09;数据被转化成结构化且适合机器学习算法或深度学习模型使用的格式。 原始数据转化为结构化且适合机器学习和深度学习模型使用的格式&#xff0c;通常需要经历以下类型的预处理和转换&#xff1a; 文本数据&#xf…

代码随想录算法训练营第四十天|343. 整数拆分 96.不同的二叉搜索树

343. 整数拆分 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路: 动态规划的题目虽然说是要先确定dp数组的含义&#xff0c;再确定递归公式&#xff0c;但是总感觉这两者是相辅相成的&#xff0c;是一起出来的&#xff0c;但是到此&#xff0c;dp数组…

运维SRE-14 自动化批量管理

1.批量管理基础内容-SSH服务-远程连接服务 1.1SSH服务 SSH服务-OpenSSH&#xff0c;远程连接服务端&#xff1a;openssh-server客户端&#xff1a;openssh-clients openssh-7.4p1-21.el7.x86_64 openssh-server-7.4p1-21.el7.x86_64 #服务端 openssh-clients-7.4p1-21.el7.…

BERT学习笔记

论文&#xff1a;《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》&#xff0c;2019 代码&#xff1a;[tensorflow]&#xff0c;[pytorch] 来源&#xff1a;李沐精度BERT 0、摘要 与之前模型的区别&#xff1a; GPT考虑的是一个单向…

汽修专用产品---选型介绍 汽修示波器 汽车示波器 汽车电子 汽修波形 汽车传感器波形 汽车检测

为了满足汽车电子用户的测量需求&#xff0c;我司特推出汽修专用版示波器&#xff0c;一键测量&#xff0c;轻松找出汽车问题。 LOTO各种型号的示波器其实都可以用作汽车传感器信号波形的检测。汽修应用中&#xff0c;工程师对示波器的性能要求对于LOTO产品来说不算高。 在我们…

Promethues的Agent 模式代理转发的实施教程

目录 一、为什么需要代理转发&#xff1f; 二、Prometheus Agent模式的实施步骤 1、升级Prometheus的版本 2、配置B服务器的配置文件 3、启动代理点B服务器的Prometheus 4、接收端C服务器的Prometheus的安装同步骤1 5、启动接收端C服务器的Prometheus 6、验证是否能够正…

Rust核心:【所有权】相关知识点

rust在内存资源管理上采用了&#xff08;先进优秀&#xff1f;算吗&#xff09;但特立独行的设计思路&#xff1a;所有权。这是rust的核心&#xff0c;贯穿在整个rust语言的方方面面&#xff0c;并以此为基点来重新思考和重构软件开发体系。 涉及到的概念点&#xff1a;借用&am…

yolov5-tracking-xxxsort yolov5融合六种跟踪算法(三)--目标跟踪

本次开源计划主要针对大学生无人机相关竞赛的视觉算法开发。 开源代码仓库链接&#xff1a;https://github.com/zzhmx/yolov5-tracking-xxxsort.git 先按照之前的博客配置好环境&#xff1a; yolov5-tracking-xxxsort yolov5融合六种跟踪算法&#xff08;一&#xff09;–环境配…

IDEA创建java项目

1. 创建单个项目 1.1 点击New Project 刚安装好会进入下面的创建页面&#xff0c;选择直接New Project创建新项目。 如果后续打开IDEA&#xff0c;并且上次的项目存在&#xff0c;则会打默认开上次的项目&#xff0c;此时可以选择File -> New->Project创建新项目。 …