经常会遇到需要向第三方发送http请求的场景,python中的requests库可以很好的满足这一要求,Requests模块是一个用于网络请求的模块,主要用来模拟浏览器发请求。其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能。但是这些模块都复杂而且差不多过时了,requests模块简单强大高效,使得其在众多网络请求模块中脱引而出。
1、文档
官方文档
https://docs.python.org/zh-cn/3.7/
https://requests.readthedocs.io/en/latest/
快速上手
https://requests.readthedocs.io/en/latest/user/quickstart/
https://blog.csdn.net/thmail/article/details/74330626?ops_request_misc=&request_id=&biz_id=102&utm_term=requests%E5%BF%AB%E9%80%9F%E4%B8%8A%E6%89%8B%E6%96%87%E6%A1%A3&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-74330626.142^v73^control,201^v4^add_ask,239^v2^insert_chatgpt&spm=1018.2226.3001.4187
2、安装
sudo pip3 install requests
代码如下(示例):requests_基本使用.py
# _*_ coding : utf-8 _*_
# @Time : 2023/2/27 1:25 PM
# @Author : yanhh
# @File : requests_基本使用
# @Project : pythonProject
import requests
url = 'http://www.baidu.com'
response = requests.get(url=url)
# 一个类型和六个属性
# 一个类型Response
# <class 'requests.models.Response'>
# print(type(response))
# 六个属性
# 0、设置响应的编码格式
response.encoding = 'utf-8'
# 1、以字符串的形式来返回了网页的源码
# print(response.text)
# 2、获取请求的url:http://www.baidu.com/
# print(response.url)
# 3、响应的字节类型 b'<!DOCTYPE html>\r...
# print(response.content)
# 4、返回响应状态码 200
# print(response.status_code)
# 5、返回响应头 {'Cache-Control': 'private, no-cache, no-store, proxy-revalidate, no-transform', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Content-Type': 'text/html', 'Date': 'Mon, 27 Feb 2023 07:35:11 GMT', 'Last-Modified': 'Mon, 23 Jan 2017 13:27:29 GMT', 'Pragma': 'no-cache', 'Server': 'bfe/1.0.8.18', 'Set-Cookie': 'BDORZ=27315; max-age=86400; domain=.baidu.com; path=/', 'Transfer-Encoding': 'chunked'}
print(response.headers)
代码如下(示例):request_get请求.py
# _*_ coding : utf-8 _*_
# @Time : 2023/2/27 3:39 PM
# @Author : yanhh
# @File : request_get请求
# @Project : pythonProject
import requests
url = 'https://www.baidu.com/s'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
data = {
'wd': '北京'
}
# url 请求资源路径
# params参数
# kwargs字典
response = requests.get(url=url, params=data, headers=headers)
content = response.text
print(content)
# 总结
# 1、参数使用params传递
# 2、参数无需urlencode编码
# 3、不需要请求对象的定制
# 4、请求路径中的?可以不加
代码如下(示例):requests_post请求.py
# _*_ coding : utf-8 _*_
# @Time : 2023/2/27 3:57 PM
# @Author : yanhh
# @File : requests_post请求
# @Project : pythonProject
# 爬取百度翻译
import requests
url = 'https://fanyi.baidu.com/sug'
data = {
'kw': 'eye'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
# url 请求地址
# data请求参数
# kwargs 字典
response = requests.post(url=url, data=data, headers=headers)
content = response.text
import json
obj = json.loads(content, encoding='utf-8')
print(obj)
# 总结
# 1、post请求,不需要编解码
# 2、post的请求参数是data
# 3、不需要请求对象的定制
代码如下(示例):requests_代理.py
# _*_ coding : utf-8 _*_
# @Time : 2023/2/27 4:27 PM
# @Author : yanhh
# @File : requests_代理
# @Project : pythonProject
import requests
url = 'http://www.baidu.com/s?'
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
data = {
'wd': 'ip'
}
# 代理
proxy = {
'http': '60.211.218.78:53281'
}
response = requests.get(url=url, params=data, headers=headers, proxies=proxy)
content = response.text
# 内容写入 agent.html
with open('agent.html', 'w', encoding='utf-8') as fp:
fp.write(content)
https://www.kuaidaili.com/free/intr/
# 通过登陆 然后进入到主页面
# 通过找登陆接口我们发现 登陆的时候需要的参数很多
# _VIEWSTATE: /m1O5dxmOo7f1qlmvtnyNyhhaUrWNVTs3TMKIsm1lvpIgs0WWWUCQHl5iMrvLlwnsqLUN6Wh1aNpitc4WnOt0So3k6UYdFyqCPI6jWSvC8yBA1Q39I7uuR4NjGo=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: [email protected]
# pwd: xxxx
# code: PId7
# denglu: 登录
# 我们观察到_VIEWSTATE __VIEWSTATEGENERATOR code是一个可以变化的量
# 难点:(1)_VIEWSTATE __VIEWSTATEGENERATOR 一般情况看不到的数据 都是在页面的源码中
# 我们观察到这两个数据在页面的源码中 所以我们需要获取页面的源码 然后进行解析就可以获取了
# (2)验证码
import requests
# 这是登陆页面的url地址
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'
}
# 获取页面的源码
response = requests.get(url = url,headers = headers)
content = response.text
# 解析页面源码 然后获取_VIEWSTATE __VIEWSTATEGENERATOR
from bs4 import BeautifulSoup
soup = BeautifulSoup(content,'lxml')
# 获取_VIEWSTATE
viewstate = soup.select('#__VIEWSTATE')[0].attrs.get('value')
# 获取__VIEWSTATEGENERATOR
viewstategenerator = soup.select('#__VIEWSTATEGENERATOR')[0].attrs.get('value')
# 获取验证码图片
code = soup.select('#imgCode')[0].attrs.get('src')
code_url = 'https://so.gushiwen.cn' + code
# 有坑
# import urllib.request
# urllib.request.urlretrieve(url=code_url,filename='code.jpg')
# requests里面有一个方法 session() 通过session的返回值 就能使用请求变成一个对象
session = requests.session()
# 验证码的url的内容
response_code = session.get(code_url)
# 注意此时要使用二进制数据 因为我们要使用的是图片的下载
content_code = response_code.content
# wb的模式就是将二进制数据写入到文件
with open('code.jpg','wb')as fp:
fp.write(content_code)
# 获取了验证码的图片之后 下载到本地 然后观察验证码 观察之后 然后在控制台输入这个验证码 就可以将这个值给
# code的参数 就可以登陆
code_name = input('请输入你的验证码')
# 点击登陆
url_post = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
data_post = {
'__VIEWSTATE': viewstate,
'__VIEWSTATEGENERATOR': viewstategenerator,
'from': 'http://so.gushiwen.cn/user/collect.aspx',
'email': '[email protected]',
'pwd': 'action',
'code': code_name,
'denglu': '登录',
}
response_post = session.post(url = url, headers = headers, data = data_post)
content_post = response_post.text
with open('gushiwen.html','w',encoding= ' utf-8')as fp:
fp.write(content_post)
# 难点
# (1) 隐藏域
# (2) 验证码