requests 是一个非常流行的 Python 库,用于发送 HTTP 请求。它简单易用,功能强大,适合编写爬虫程序来抓取网页内容。
【1】安装与入门
① 安装
需要安装 requests 库,建议同时安装 BeautifulSoup 或 lxml:
pip install requests
pip install beautifulsoup4
pip install lxml
官方文档
http://cn.python‐requests.org/zh_CN/latest/
快速上手
http://cn.python‐requests.org/zh_CN/latest/user/quickstart.html
response的属性以及类型
类型 :models.Response
r.text : 获取网站源码
r.encoding :访问或定制编码方式
r.url :获取请求的url
r.content :响应的字节类型
r.status_code :响应的状态码
r.headers :响应的头信息
案例
import requests
url = 'http://www.baidu.com'
response = requests.get(url=url)# 一个类型和六个属性
# Response类型
# print(type(response))# 设置响应的编码格式
# response.encoding = 'utf-8'# 以字符串的形式来返回了网页的源码
# print(response.text)# 返回一个url地址
# print(response.url)# 返回的是二进制的数据
# print(response.content)# 返回响应的状态码
# print(response.status_code)# 返回的是响应头
print(response.headers)
② 处理请求重定向
默认情况下,requests 会自动处理 HTTP 重定向(如 301、302)。如果你不想自动跟随重定向,可以使用 allow_redirects=False 参数:
import requestsresponse = requests.get('https://httpbin.org/redirect/1', allow_redirects=False)print(f"状态码: {response.status_code}")
print(f"重定向到: {response.headers['Location']}")
- allow_redirects=False:禁用自动重定向,返回原始的重定向响应。
- 你可以通过 response.headers[‘Location’] 获取重定向的目标 URL。
③ 处理请求超时
为了避免请求长时间挂起,你可以设置请求的超时时间。如果请求在指定时间内没有完成,requests 会抛出 Timeout 异常。
import requeststry:response = requests.get('https://example.com', timeout=5) # 超时时间为 5 秒print(response.text)
except requests.Timeout:print("请求超时")
timeout 参数:设置请求的超时时间(以秒为单位)。你可以为连接和读取分别设置不同的超时时间:
response = requests.get('https://example.com', timeout=(5, 10)) # 连接超时 5 秒,读取超时 10 秒
【2】GET请求
import requests
url = 'http://www.baidu.com/s?'
headers = {
'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
data = {
'wd':'北京'
}
response = requests.get(url,params=data,headers=headers)
定制参数
参数使用params传递
参数无需urlencode编码
不需要请求对象的定制
请求资源路径中?可加可不加
【3】POST请求
import requests
post_url = 'http://fanyi.baidu.com/sug'
headers={
'User‐Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
}
data = {
'kw': 'eye'
}
response = requests.post(url = post_url,headers=headers,data=data)content =response.textimport jsonobj = json.loads(content,encoding='utf-8')
print(obj)
【4】代理
在请求中设置proxies参数,参数类型是一个字典类型
import requests
url = 'http://www.baidu.com/s?'
headers = {
'user‐agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/65.0.3325.181 Safari/537.36'
}
data = {
'wd':'ip'
}
proxy = {
'http':'219.149.59.250:9797'
}
r = requests.get(url=url,params=data,headers=headers,proxies=proxy)
with open('proxy.html','w',encoding='utf‐8') as fp:
fp.write(r.text)
【5】Cookie
有些网站需要登录或保持会话状态,这时你可以使用 requests.Session() 来管理 cookies。Session 对象会在多个请求之间共享 cookies,模拟浏览器的行为。
- requests.Session():创建一个会话对象,所有请求都会共享相同的 cookies 和会话信息。
- 可以使用 session.cookies 来查看或修改会话中的 cookies。
如下是一个案例,绕过古文文网的登录,进入登录后的页面。
# 通过登陆 然后进入到主页面
# 通过找登陆接口我们发现 登陆的时候需要的参数很多
# _VIEWSTATE: /m1O5dxmOo7f1qlmvtnyNyhhaUrWNVTs3TMKIsm1lvpIgs0WWWUCQHl5iMrvLlwnsqLUN6Wh1aNpitc4WnOt0So3k6UYdFyqCPI6jWSvC8yBA1Q39I7uuR4NjGo=
# __VIEWSTATEGENERATOR: C93BE1AE
# from: http://so.gushiwen.cn/user/collect.aspx
# email: 11111111@qq.com
# pwd: action
# 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 BeautifulSoupsoup = 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': '22222222@qq.com','pwd': 'action','code': code_name,'denglu': '登录',
}response_post = session.post(url = url, headers = headers, data = data_post)content_post = response_post.textwith open('gushiwen.html','w',encoding= ' utf-8')as fp:fp.write(content_post)# 难点
# (1) 隐藏域
# (2) 验证码
【6】使用超级鹰打码平台解析图片验证码
#!/usr/bin/env python
# coding:utf-8
import requests
from hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword = password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.base_params = {'user': self.username,'pass2': self.password,'softid': self.soft_id,}self.headers = {'Connection': 'Keep-Alive','User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}def PostPic(self, im, codetype):"""im: 图片字节codetype: 题目类型 参考 http://www.chaojiying.com/price.html"""params = {'codetype': codetype,}params.update(self.base_params)files = {'userfile': ('ccc.jpg', im)}r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)return r.json()def ReportError(self, im_id):"""im_id:报错题目的图片ID"""params = {'id': im_id,}params.update(self.base_params)r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)return r.json()if __name__ == '__main__':chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001im = open('a.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//print(chaojiying.PostPic(im, 1902)) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()