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

news2024/11/16 6:38:51

注:本文一共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库进行请求的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P2670 [NOIP2015 普及组] 扫雷游戏 ---- 洛谷

题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n 行 m 列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩家翻开一个非地雷格时&#xff0c;该格将会出现一个数字——提示周围格子…

【前端素材】推荐优质后台管理系统Xoric平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 功能层次 a. 用户管理功能&#xff1a; 用户注册和登录&#xff1a;管理用户账户的注册和登录过程。权限管…

C#上位机与三菱PLC的通信08---开发自己的通讯库(A-1E版)

1、A-1E报文回顾 具体细节请看&#xff1a; C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析 C#上位机与三菱PLC的通信04--MC协议之A-1E报文测试 2、为何要开发自己的通讯库 前面使用了第3方的通讯库实现了与三菱PLC的通讯&#xff0c;实现了数据的读写&#xff0c;对于通…

熬夜整理的考研考公学习资料,祝愿大家成功上岸

现如今大学生毕业大都在考研、考公这两条道路上选一个。今天给这些朋友同学分享一下考研、考公的学习资料。希望能够帮助到部分努力的同学&#xff01; 以下就是考研、考公的学习资料 学习资料获取地址 点击获取学习资料 就拿考研来说这里不仅包含了深入浅出的复习笔记&#x…

steam搬砖项目还能不能做,新手小白月入过万真的假的

steam搬砖项目还能不能做&#xff1f;今天&#xff0c;我们将通过实际数据来告诉你&#xff0c;当前市场上存在着大量没有实操过Steam搬砖项目的人&#xff0c;他们也开始参与其中&#xff0c;导致市场格局混乱。这些人可能是第一次接触该项目&#xff0c;但却毫不犹豫地发表自…

Facebook Horizon:探索虚拟现实中的社交空间

随着科技的不断进步&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正成为社交互动和娱乐体验的新前沿。在这个数字时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;正在引领虚拟社交的新时代&#xff0c;其推出的虚拟社交平台Facebook Horizon成为了…

如何使用Docker部署MongoDB并结合内网穿透实现远程访问本地数据库

文章目录 前言1. 安装Docker2. 使用Docker拉取MongoDB镜像3. 创建并启动MongoDB容器4. 本地连接测试5. 公网远程访问本地MongoDB容器5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 …

Fiddler工具 — 19.Fiddler抓包HTTPS请求(二)

5、查看证书是否安装成功 方式一&#xff1a; 点击Tools菜单 —> Options... —> HTTPS —> Actions 选择第三项&#xff1a;Open Windows Certificate Manager打开Windows证书管理器。 打开Windows证书管理器&#xff0c;选择操作—>查看证书&#xff0c;在搜索…

【webrtc】m77 PacedSender

mediasoup是m77的代码,m77的代码并没有paced controller ,而且与paced sender 的逻辑混在了一起。结合大神们的代码分析,对照m77 进行 理解。m77 有ProbeController。给pacersender 更新飞行数据:PacedSender::InsertPacket(size_t bytes) 对应的是 PacingController::OnPa…

微信小程序错误----config is not defined

微信小程序出错 请求头发生错误 修改 options.header {// 为请求头对象添加 token 验证的 Authorization 字段Access-Token: token,platform: MP-WEIXIN,// 保留原有的 header...options.header,}

运维SRE-11 备份服务及备份项目

1.第一个服务-rsync备份服务-守护进程模式 1.1概述 守护进程&#xff1a;持续运行的进程&#xff0c;也可以叫作服务服务一般分为&#xff1a;服务端与客户端服务端&#xff1a;linux服务器上运行的各种服务软件客户端&#xff1a;linux中的客户端可能是一个命令&#xff0c;…

Android 11以上获取不到第三方app是否安装

开年第一篇&#xff0c;处理了一下年前的小问题。 问题&#xff1a;本地app跳转到第三方app地图进行导航&#xff0c;获取不到第三方地图是否安装。 解决&#xff1a; 1.添加包名 This can be done by adding a <queries> element in the Android manifest.在app下的…

性能全面提升!探索ONLYOFFICE最新8.0版:更快速、更强大,PDF表单编辑轻松搞定!

文章目录 PDF表单功能表单模板 屏幕朗读器功能EXCEL新增功能单变量求解图表向导数字排序 PPT 新增功能新增语言区域设置和优化插件界面 ONLYOFFICE 是由 Ascensio System SIA 推出的一款功能强大的办公套件&#xff0c;其中提供了适用于文本文档、表格以及演示文稿的在线编辑软…

Redis部署方式(一)四种部署方式介绍

redis的四种部署方式&#xff1a; Redis单机模式部署、Redis主从模式部署、Redis哨兵模式部署、Cluster集群模式部署&#xff0c;后面三种&#xff08;主从模式&#xff0c;Sentinel哨兵模式&#xff0c;Cluster模式&#xff09;也可以统称为集群模式。 一、单机 1、缺点&…

简单实现节流函数踩的小坑

平时debounce&#xff08;防抖&#xff09;用得多&#xff0c;throttle用得少&#xff0c;记下写 throttle 时遇到的低级错误。 节流&#xff0c;一定时间内多次操作&#xff0c;在最早操作的若干延迟后执行。 场景参考&#xff1a;周期上报&#xff0c;有的数据不急着报&#…

OpenWRT部署web站点并结合内网穿透实现无公网ip远程访问

文章目录 前言1. 检查uhttpd安装2. 部署web站点3. 安装cpolar内网穿透4. 配置远程访问地址5. 配置固定远程地址 前言 uhttpd 是 OpenWrt/LuCI 开发者从零开始编写的 Web 服务器&#xff0c;目的是成为优秀稳定的、适合嵌入式设备的轻量级任务的 HTTP 服务器&#xff0c;并且和…

医疗行业的数字化转型:开发智慧医疗源码与互联网医院APP教学

今天&#xff0c;笔者将与大家共同了解医疗行业的数字化转型过程&#xff0c;重点关注开发智能医疗源码以及互联网医院APP的实践指南&#xff0c;希望能够为医疗机构的数字化建设提供有益的参考和指导。 一、数字化转型背景与意义 数字化转型则可以通过智能化技术&#xff0c;…

基于Android的大学生足球赛事管理系统的设计与实现

足球是世界范围内广受欢迎的一种体育运动&#xff0c;国内有中超、中甲及大学生联赛等各级别的赛事&#xff0c;中超和中甲基本上都有专业的球队在运营&#xff0c;而大学生联赛属于校园级别的赛事&#xff0c;其重视程度较为有限&#xff0c;使得其信息化水平不高&#xff0c;…

昇腾ACL应用开发之模型转换ATC

一.前提条件 在前面的章节中我们已经安装了包含模型转换的套件包CANN-TOOLKIT&#xff0c;默认的安装路径会在/usr/local/Ascend里面&#xff0c;我们将该套件所需要的东西加入到环境变量中以便我们调用&#xff1a; 将source /usr/local/Ascend/ascend-toolkit/set_env.sh加入…

yml配置文件中常见的配置及含义

1.数据库连接的相关配置 项目名称:datasource:driver-class-name: com.mysql.cj.jdbc.Driverhost: localhostport: 3306database: 数据库名username: 用户名password: 密码 springboot配置文件,用于配置数据库源连接信息 数据库驱动类型为com.mysql.cj.jdbc.Driver,这是数据…