当前位置:   article > 正文

使用Python的requests库,轻松实现网络爬虫和数据抓取_requests.models.response

requests.models.response

requests库是什么?

requests库是一个用于发送HTTP请求的Python库。它提供了一种简单而优雅的方式来处理HTTP通信,包括发送GET、POST和其他类型的请求,处理Cookie、会话管理、身份验证等功能。使用requests库,你可以轻松地与Web服务器进行交互,获取响应内容、处理响应头部信息、处理错误等。它是Python中最常用的HTTP库之一,被广泛用于网络爬虫、API调用和Web开发等应用场景。

1

requests库的安装

pip install requests
  • 1

2

requests 的使用

使用方法

示例:

import requests
# get请求方式
r = requests.get('http://www.baidu.com')
# 响应类型
print(type(r))
# 状态码
print(r.status_code)
# 响应体的类型为字符串(str)
print(type(r.text))
# 响应内容
print(r.text[:100])
# 响应 cookit
print(r.cookies)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

运行结果:

# 响应类型
<class 'requests.models.Response'>
# 状态码
200
# 响应体的类型为字符串(str)
<class 'str'>
# 响应类型
<!DOCTYPE html>
# 响应内容
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charse
# 响应 cookit
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

其它请求类型

示例:

# GET请求
r = requests.get('http://www.baidu.com/get')
# POST请求
r = requests.post('http://www.baidu.com/post')
# PUT请求
r = requests.put('http://www.baidu.com/put')
# DELETE请求
r = requests.delete('http://www.baidu.com/delete')
# PATCH请求
r = requests.patch('http://www.baidu.com/patch')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

GET 请求

示例:

import requests
r = requests.get('http://www.httpbin.org/get')
# 显示请求头,URL,IP等信息
print(r.text)
  • 1
  • 2
  • 3
  • 4

运行结果:

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.1", 
    "X-Amzn-Trace-Id": "Root=1-6303c25e-1b115b387fa817f26cca2927"
  }, 
  "origin": "175.9.202.241", 
  "url": "http://www.httpbin.org/get"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

传递参数

params 方法

示例:

import requests
# 变量(data)关联添加的参数
data = {
    'name': 'test',
    'age': '25'
}
# params方法写入参数
r = requests.get('http://www.httpbin.org/get', params=data)
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行结果:

{
  "args": {
    "age": "25", 
    "name": "test"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.1", 
    "X-Amzn-Trace-Id": "Root=1-6303c3a4-7dcebbd57d7e38b84cf68703"
  }, 
  "origin": "175.9.202.241", 
  "url": "http://www.httpbin.org/get?name=test&age=25"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

网页返回的类型为字符串(str)类型,是 JSON 格式

调用 JSON 方法返回结果转化为字典.
示例:

import requests
r = requests.get('http://www.httpbin.org/get')
print(type(r.text))
# json 方法显示结果,该结果为字典类型
print(r.json())
# 字典(dict)类型
print(type(r.json()))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果:

<class 'str'>
{'args': {}, 'headers': {'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate', 'Host': 'www.httpbin.org', 'User-Agent': 'python-requests/2.28.1', 'X-Amzn-Trace-Id': 'Root=1-6303c57f-5f462dd966656b4f6b87741b'}, 'origin': '175.9.202.241', 'url': 'http://www.httpbin.org/get'}
<class 'dict'>
  • 1
  • 2
  • 3

注:如果返回结果不是 JSON 格式,则报错,json.decoder.JSONDecodeError异常.

3

抓取网页

示例:

import requests
import re
# requests.get方法请求 url
r = requests.get('https://ssr1.scrape.center/'
# re.compile创建正则模块,re.S:使匹配内容包括换行符在内的所有字符
w = re.compile('<h2.*?>(.*?)</h2>', re.S)
# re.findall方法:获取正则表达式相匹配的所有字符,w:指定正则模块,r.text:指定响应内容
test = re.findall(w, r.text)
print(test)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行结果:

# 列表格式
['霸王别姬 - 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']
  • 1
  • 2

4

抓取二进制数据

抓取图片,音频,视频,本质都是二进制数据
示例:

import requests
# 获取网站 ico 文件
r = requests.get('https://scrape.center/favicon.ico')
# 显示 ico 文件内容
print(r.text)
# content返回的是bytes型也就是二进制的数据
print(r.content)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果:

# 因为是图片,直接乱码,打印结果是 str 类型,图片转化成了 str 所以报错
W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?��W?
# 前面带个 b,说明content返回的是bytes型也就是二进制的数据
b'\x00\x00\x01\x00\x01\x00  \x00\x00\x01\x00 \x00\xa8\x10\x00\x00\x16\x00\x00\x00(\x00\x00\x00 \x00\x00\x00@\x00\x00\x00\x01\x00
示例:
  • 1
  • 2
  • 3
  • 4
  • 5

示例:

将爬取下来图片的二进制数据存入本地favicon.ico里,这样图片就会被保存到本地

import requests
r = requests.get('https://scrape.center/favicon.ico')
# 将爬取下来图片的二进制数据存入本地favicon.ico里,这样图片就会被保存到本地
with open('favicon.ico', 'wb') as f:
    f.write(r.content)
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

# 文件夹下会有favicon.ico图片
  • 1

5

添加请求头

发起 HTTP 请求,有个请求头(Request headers),使用 headers 参数
示例:

import requests
# 指定变量(headers)字典的内容
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36',
}
r = requests.get('https://ssr1.scrape.center/', headers=headers)
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果:

<html lang="en">
<head>
''''''''
  • 1
  • 2
  • 3

6

POST请求

示例:

import requests
data = {'name': 'test', 'age':'25' }
r = requests.post('https://www.httpbin.org/post', data=data)
print(r.text)
  • 1
  • 2
  • 3
  • 4

运行结果:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
# form 部分就是提交的数据,name:test,age:25
  "form": {
    "age": "25", 
    "name": "test"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "16", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.1", 
    "X-Amzn-Trace-Id": "Root=1-630c1d93-3a4e6ff30b2775394a6e8425"
  }, 
  "json": null, 
  "origin": "175.10.5.197", 
  "url": "https://www.httpbin.org/post"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

响应

获取其它信息:状态码,响应头,Cookit 等
示例:

import requests
r = requests.get('https://ssr1.scrape.center/')
# 状态码类型,状态码
print(type(r.status_code), r.status_code)
# 响应类型,响应体
print(type(r.headers), r.headers)
# Cookit类型,Cookit
print(type(r.cookies), r.cookies)
# url 类型,url
print(type(r.url), r.url)
# history类型,请求历史
print(type(r.history), r.history)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果:

<class 'int'> 200
<class 'requests.structures.CaseInsensitiveDict'> {'Date': 'Mon, 29 Aug 2022 02:08:13 GMT', 'Content-Type': 'text/html; charset=utf-8', 'Content-Length': '41667', 'Connection': 'keep-alive', 'Server': 'Lego Server', 'Cache-Control': 'max-age=600', 'Expires': 'Mon, 29 Aug 2022 02:18:13 GMT', 'X-Frame-Options': 'DENY', 'X-Content-Type-Options': 'nosniff', 'Strict-Transport-Security': 'max-age=15724800; includeSubDomains', 'X-NWS-LOG-UUID': 'a3b13c77-73a8-43be-b3eb-9da34d7543e8', 'X-Cache-Lookup': 'Cache Miss', 'X-Daa-Tunnel': 'hop_count=1'}
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[]>
<class 'str'> https://ssr1.scrape.center/
<class 'list'> []
  • 1
  • 2
  • 3
  • 4
  • 5

requests 库内置状态码查询对象,对比状态码,判断

示例:

import requests
r = requests.get('https://ssr1.scrape.center/')
# 对比返回码和内置的表示成功的状态码,来保证请求是否正常响应
exit()  if not r.status_code == requests.codes.ok else print('Request Successfully')
  • 1
  • 2
  • 3
  • 4

运行结果:

Request Successfully
  • 1

其它状态码

1**: 信息性状态码
2**: 成功状态码
3**: 重定向状态码
4**: 客户端状态码
5**: 服务器错误状态码

文件使用方式标识

‘r’:默认值,表示从文件读取数据
‘w’:表示要向文件写入数据,并截断以前的内容
‘a’:表示要向文件写入数据,添加到当前内容尾部
‘r+’:表示对文件进行可读写操作(删除以前的所有数据)
‘r+a’:表示对文件可进行读写操作(添加到当前文件尾部)
‘b’:表示要读写二进制数据。

5

高级用法

文件上传
网站上传文件
示例:

import requests
# 读取二进制文件 favicon.ico,
files = {'file': open('favicon.ico,并以', 'rb')}
r = requests.post('https://www.httpbin.org/post', files=files)
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

{
  "args": {}, 
  "data": "", 
  "files": {
# 证明文件上传会单独使用 files 字段来标识
    "file": "data:application/octet-stream;base64,AAABAAEAI......"
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "4433", 
    "Content-Type": "multipart/form-data; boundary=351b07a2393dd70145e4f994ac82df48", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.1", 
    "X-Amzn-Trace-Id": "Root=1-630c264a-1adfbd9302f3c7293e9defff"
  }, 
  "json": null, 
  "origin": "175.10.5.197", 
  "url": "https://www.httpbin.org/post"
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Cookit 设置

获取Cookit值

示例:

import requests
r = requests.get('https://www.bilibili.com/')
print(r.cookies)
# items(): 转换为由元组组成的列表
# 迭代循环
for key, value in r.cookies.items():
    print(key + '=' + value)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果:

<RequestsCookieJar[<Cookie buvid3=878525DA-9130-7492-E1D3-6EF79EC16CA320305infoc for .bilibili.com/>, <Cookie innersign=0 for .bilibili.com/>]>
buvid3=878525DA-9130-7492-E1D3-6EF79EC16CA320305infoc
innersign=0
  • 1
  • 2
  • 3

维持 Cookit 登录状态

示例:

import requests
# 复制 cookit 值
headers = {
    'Cookit': '_octo=GH1.1.1434622938.1661822169; tz=Asia/Shanghai; _device_id=fa584be84f1dc7a499c98764d44d5aa3; preferred_color_mode=dark; has_recent_activity=1; user_session=j6k9o6IikOLwKX-84RUu6h5Bjj9hRPDrIOsehbZZN8yg57BN; __Host-user_session_same_site=j6k9o6IikOLwKX-84RUu6h5Bjj9hRPDrIOsehbZZN8yg57BN; tz=Asia/Shanghai; color_mode={"color_mode":"auto","light_theme":{"name":"light","color_mode":"light"},"dark_theme":{"name":"dark","color_mode":"dark"}}; logged_in=yes; dotcom_user=dageheshui; _gh_sess=w0sO24Nv5PWF2h6XkXbkx0K5BDJjs9EnWXEUCwitl+3yfIv15cmz/l7Iof2EszYh2urGstLeMPNLHEuLa2SfB1PTIhZ/87k8AxOet1SJ6DW5Wr6Z+44UqFUKfpNlbWVjeVnaD1nypqDobpxWvc455OmDx6YQ8G05JcO/Tc3Up8Sn65GBByMH8CDKRRi5UD0bbFUz5F3dV2cRJ8Kfh4osEI58IB4d4xHeEx8AhpQni3HDL/TLirSi5NP289Pj32najW14O1iWI1g4jOWgmAaj00XFLJWRwKDsIKqGgyXmCB9C1TzDk53SC7Tg2m90Z465YQh0ujRaRcaVTt5LUItzG1W//twXaIWlR4A6275cCJJ7ChZFhFvhQdGDddfydLVuHQh6klCLRDeAAAdXaJHNZvPq44LAYrg2Iq3S5yB0GxGjtVujNUHoaN90/XRaHe5LtxiF+vu6eOalEpGeJzcrJrMlIsxihqZRG1LyqmLjRYvLpWdOiQVMfoICTehptZ8Eeg0JMCBEP/cx1HuTuXR2gtykZ3ougyGAefdxc0uDaYoNHa5IIJSMdqeCUQR6bUoa0/SDOlVm4Co6ipVV6pEvF+CzgDvIdzHLoh/0mMBATW6mZWpQNkm8r4THnzhMeQL986JlxYtNRzOwth0ItWkH26A7pujSkyf3T26zzmg00niqgkoX1leeI8hLO3+mDVkHV5ZLUvM3uzzpacwUHac/Ma7705lIxYW9nYtbDs7LL/Yx6Huowq2ZbMNBegqNIN35uzGIuQ==--EPAWJcVQPUYIv5JS--SqO0GsO06Hq6CXcytLaCWQ=='
}
r = requests.get('https://github.com/', headers=headers)
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行结果:

<!DOCTYPE html>
<html lang="en"  data-a11y-animated-images="system">
  <head>
......
  • 1
  • 2
  • 3
  • 4

设置 cookit 信息

示例:

import requests
cookies = '_octo=GH1.1.1434622938.1661822169; tz=Asia/Shanghai; _device_id=fa584be84f1dc7a499c98764d44d5aa3; preferred_color_mode=dark; has_recent_activity=1; user_session=j6k9o6IikOLwKX-84RUu6h5Bjj9hRPDrIOsehbZZN8yg57BN; __Host-user_session_same_site=j6k9o6IikOLwKX-84RUu6h5Bjj9hRPDrIOsehbZZN8yg57BN; tz=Asia/Shanghai; color_mode={"color_mode":"auto","light_theme":{"name":"light","color_mode":"light"},"dark_theme":{"name":"dark","color_mode":"dark"}}; logged_in=yes; dotcom_user=dageheshui; _gh_sess=w0sO24Nv5PWF2h6XkXbkx0K5BDJjs9EnWXEUCwitl+3yfIv15cmz/l7Iof2EszYh2urGstLeMPNLHEuLa2SfB1PTIhZ/87k8AxOet1SJ6DW5Wr6Z+44UqFUKfpNlbWVjeVnaD1nypqDobpxWvc455OmDx6YQ8G05JcO/Tc3Up8Sn65GBByMH8CDKRRi5UD0bbFUz5F3dV2cRJ8Kfh4osEI58IB4d4xHeEx8AhpQni3HDL/TLirSi5NP289Pj32najW14O1iWI1g4jOWgmAaj00XFLJWRwKDsIKqGgyXmCB9C1TzDk53SC7Tg2m90Z465YQh0ujRaRcaVTt5LUItzG1W//twXaIWlR4A6275cCJJ7ChZFhFvhQdGDddfydLVuHQh6klCLRDeAAAdXaJHNZvPq44LAYrg2Iq3S5yB0GxGjtVujNUHoaN90/XRaHe5LtxiF+vu6eOalEpGeJzcrJrMlIsxihqZRG1LyqmLjRYvLpWdOiQVMfoICTehptZ8Eeg0JMCBEP/cx1HuTuXR2gtykZ3ougyGAefdxc0uDaYoNHa5IIJSMdqeCUQR6bUoa0/SDOlVm4Co6ipVV6pEvF+CzgDvIdzHLoh/0mMBATW6mZWpQNkm8r4THnzhMeQL986JlxYtNRzOwth0ItWkH26A7pujSkyf3T26zzmg00niqgkoX1leeI8hLO3+mDVkHV5ZLUvM3uzzpacwUHac/Ma7705lIxYW9nYtbDs7LL/Yx6Huowq2ZbMNBegqNIN35uzGIuQ==--EPAWJcVQPUYIv5JS--SqO0GsO06Hq6CXcytLaCWQ=='
jar = requests.cookies.RequestsCookieJar()
headers = {
    'Host': 'www.zhihu.com',
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
for cookie in cookies.split(';'):
    key, value = cookie.split('=', 1)
    jar.set(key, value)
r = requests.get('http://www.bilibili.com', cookies=jar, headers=headers)
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行结果:

<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8"><title>哔哩哔哩 (゜-゜)つロ 干杯~-bi
........
  • 1
  • 2

新建了一个 RequestCookieJar 对象,然后将复制下来的 cookies 利用 split 方法分割,接着利用 set 方法设置好每个 Cookie 的 key 和 value,然后通过调用 requests 的 get() 方法并传递给 cookies 参数即可。

Session维持

第二次请求,是打开一个新的浏览器选项卡,而不是打开一个新的浏览器
Session模拟同一个会话
示例:

import requests
s = requests.Session()
s.get('https://www.httpbin.org/cookies/set/number/123456789')
r = s.get('https://www.httpbin.org/cookies')
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

{
  "cookies": {
    "number": "123456789"
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5

SSL 证书验证

访问某些网站,SSL 证书错误,需设置来忽略证书的验证

在这里插入图片描述

verify参数:控制是否验证证书,默认值为True

示例:

import requests
r = requests.get('https://ssr2.scrape.center/')
print(r.status_code)
  • 1
  • 2
  • 3

运行结果:

# 直接报错
requests.exceptions.SSLError: HTTPSConnectionPool(host='ssr2.scrape.center', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1108)')))
  • 1
  • 2

修改为:

import requests
#  设置verify参数为False
r = requests.get('https://ssr2.scrape.center/', verify=False)
print(r.status_code)
  • 1
  • 2
  • 3
  • 4

运行结果:

# 响应成功,但还是有报错
# 它建议指定证书,可以设置忽略警告方式来屏蔽这个警告
/Users/word/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/urllib3/connectionpool.py:1045: InsecureRequestWarning: Unverified HTTPS request is being made to host 'ssr2.scrape.center'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/1.26.x/advanced-usage.html#ssl-warnings
  warnings.warn(
# 状态码
200
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

设置忽略警告,来屏蔽警告

示例:

import requests
from requests.packages import urllib3
urllib3.disable_warnings()
response = requests.get('https://www.12306.cn', verify=False)
print(response.status_code)
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

200
  • 1

或捕获警告到日志的方式忽略警告

示例:

import logging
import requests
logging.captureWarnings(True)
test = requests.get('https://www.12306.cn', verify=False)
print(test.status_code)
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

200
  • 1

或指定本地证书用作客户端证书

示例:

import requests
response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
print(response.status_code)
  • 1
  • 2
  • 3

运行结果:

200
  • 1

超时设置

响应太慢或无响应

示例:

import requests
# timeout参数(0.01 秒内没响应,则报错)
r = requests.get('https://www.baidu.com/', timeout=0.01)
print(r.status_code)
  • 1
  • 2
  • 3
  • 4

运行结果:

# 直接报错
requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x11475fd00>, 'Connection to www.baidu.com timed out. (connect timeout=0.01)'))
  • 1
  • 2

timeout参数,分为 2 阶段:连接(connect),读取(read)

分别指定连接和读取,则可以传入一个元组
示例:

import requests
# imeout参数,分为 2 阶段:连接(connect),读取(read)
# 分别指定连接和读取,则可以传入一个元组
r = requests.get('https://www.baidu.com/', timeout=(5, 1))
print(r.status_code)
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

200
  • 1

为 如果想永久等待,timeout参数等于None,或不设置直接留空,默认值就是 None

# timeout参数为None
r = requests.get('https://www.baidu.com/', timeout=None)
# 不设置,留空
r = requests.get('https://www.baidu.com/')
  • 1
  • 2
  • 3
  • 4

身份认证

访问启用了身份认证的网站

auth参数:身份认证功能
示例:

import requests
from requests.auth import HTTPBasicAuth
# requests库自带的身份认证功能,auth 参数 HTTPBasicAuth 认证
r = requests.get('https://ssr3.scrape.center/', auth=HTTPBasicAuth('admin', 'admin'))
print(r.status_code)
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果:

200
  • 1

便捷写法:直接传入元组,默认使用HTTPBasicAuth类

import requests
# 传入元组
r = requests.get('https://ssr3.scrape.center/', auth=('admin', 'admin'))
print(r.status_code)
  • 1
  • 2
  • 3
  • 4

其它认证功能:OAuth 库

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

6

代理设置

多次同一个 IP 请求,会被封禁客户端 IP
proxies 参数:代理
示例:

import requests
proxies = {
    'http': '192.168.0.1:100',
    'https': '192.168.0.1:100',
}
r = requests.get('https://www.taobao.com', proxies=proxies)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

若代理需要身份认证,需以这样的语法来设置代理

http://user:password@host:port
  • 1

示例:

import requests
proxies = {'https': 'http://user:password@10.10.1.10:3128/',}
requests.get('https://www.taobao.com', proxies=proxies)
  • 1
  • 2
  • 3

HTTP 代理外,requests 还支持 SOCKS 协议的代理

示例:

import requests
proxies = {
    'http': 'socks5://user:password@host:port',
    'https': 'socks5://user:password@host:port'
}
requests.get('https://www.taobao.com', proxies=proxies)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Prepared Request

将请求表示为数据结构,其中各个参数都可以通过一个 Request 对象来表示。这在 requests 里同样可以做到,这个数据结构就叫 Prepared Request。
示例:

from requests import Request, Session
url = 'http://httpbin.org/post'
data = {'name': 'germey'}
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36'
}
s = Session()
req = Request('POST', url, data=data, headers=headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

引入了 Request,然后用 url、data 和 headers 参数构造了一个 Request 对象,这时需要再调用 Session 的

prepare_request 方法将其转换为一个 Prepared Request 对象,然后调用 send 方法发送即可,运行结果如下:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "name": "germey"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "11", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36", 
    "X-Amzn-Trace-Id": "Root=1-6310f54b-7542cba46fcc6f334cfee58e"
  }, 
  "json": null, 
  "origin": "175.0.159.134", 
  "url": "http://httpbin.org/post"
}
# 有了 Request 这个对象,就可以将请求当作独立的对象来看待,这样在进行队列调度时会非常方便。后面我们会用它来构造一个 Request 队列。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

题外话

当下这个大数据时代不掌握一门编程语言怎么跟的上脚本呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述
若有侵权,请联系删除
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/685899
推荐阅读
相关标签
  

闽ICP备14008679号