首页 > 编程笔记

Python requests库详解

requests 库是一个功能更加强大的网络请求库,其在模拟登录、使用代理 IP 等方面均比 urllib 库更加方便,进而可以节约大量的工作时间,帮助程序员更加方便地对所需要的网页信息进行爬取。

由于 requests 库属于 Python 的第三方库,所以需要进行安装,只需在命令提示符中输入命令pip install requests

1、发送HTTP请求

可以通过 requests 库中的 get() 函数和 post() 函数发送 HTTP 请求。

1) get()函数

该函数表示使用 GET 方法发起 HTTP 请求,并返回 Response 对象,其语法格式如下:
get(url,params,headers)
其中,参数 url 表示请求 URL;参数 params 表示 GET 方法的请求参数;参数 headers 表示请求头的信息。

此外,通过 Response 对象的相关属性和方法可以获取所需的数据,具体如下表所示。

表 1 Response对象的相关属性和方法
属  性 描  述 方  法 描  述
text 字符串类型的响应内容 json() 将响应内容解析为 JSON 格式
content 字节类型的响应内容    
url 响应的 URL    
status_code 响应状态码    
headers 响应头中的全部信息    
encoding 设置编码格式    
以下为 get() 函数的相关示例代码。

爬取百度首页的源代码,示例代码如下:
import requests
url="http://www.baidu.com"
response=requests.get(url=url)
response.encoding="utf-8"
print(response.url)
print(response.status_code)
print(response.headers)
res=response.text
with open("baidu.html","w",encoding="utf-8")as f:
    f.write(res)

爬取老夏学院的 Logo 图片,示例代码如下:
import requests
url="http://www.oldxia.com/xzd/upload/static/image/common/logo.png"
response=requests.get(url=url)
#返回二进制的数据
res=response.content
with open("logo.png","wb")as f:
  f.write(res)

爬取 360 搜索首页的源代码,示例代码如下:
import requests
url="http://www.so.com"
headers={
"User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/74.0.3729.169 Safari/537.36",
}
response=requests.get(url=url,headers=headers)
response.encoding="utf-8"
res=response.text
with open("360.html","w",encoding="utf-8")as f:
f.write(res)

2) post()函数

该函数表示使用 POST 方法发起 HTTP 请求,并返回 Response 对象,其语法格式如下:
post(url,data,headers)
其中,参数 url 表示请求 URL;参数 data 表示 POST 方法的请求参数;参数 headers 表示请求头的信息。

以下为 post() 函数的相关示例代码。

访问老夏学院的 HTTP 请求测试页面,示例代码如下:
import requests
url="http://www.oldxia.com/http_test/post.php"
data={'name':'夏正东','age':35}
response=requests.post(url=url,data=data)
res=response.text
print(res)

百度翻译 API,示例代码如下:
import requests
url="https://fanyi.baidu.com/sug"
name=input("请输入要查询的单词:")
headers={
"User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,like Gecko)Chrome/74.0.3729.169 Safari/537.36",
}
data={
"kw":name
}
response=requests.post(url=url,headers=headers,data=data)
#响应头中的Content-Type为application/json
res=response.json()
print(res["data"][0]["v"])

2、模拟登录

使用 requests 库进行模拟登录与 urllib 库一样,可以分为两种方式,即手动添加 Cookie 和自动保存 Cookie。

1) 手动添加Cookie

该方式的应用过程与 urllib 库中手动添加 Cookie 的方式一致,示例代码如下
import requests
url="https://www.kuaidaili.com/usercenter/"
headers={
    "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/74.0.3729.169 Safari/537.36",
    "Cookie":"channelid=0;sid=1629544743008400;_gcl_au=1.1.1908873876.1629544864;_ga=GA1.2.810344698.1629544865;_gid=GA1.2.2144128861.1629544865;Hm_lvt_7ed65b1cc4b810e9fd37959c9bb51b31=1629544865,1629599040; Hm_lpvt_7ed65b1cc4b810e9fd37959c9bb51b31=1629599043;sessionid=5465c0121d88e755b9ecad8b82109136"
}
response=requests.get(url=url,headers=headers)
response.encoding="utf-8"
res=response.text
with open("kuaidaili.html","w",encoding="utf-8")as f:
f.write(res)

2) 自动保存Cookie

该方式的应用过程与 urllib 库中自动保存 Cookie 的方式有所区别。

在 requests 库中,首先,需要通过 Session 类创建 session 对象,该对象可以自动保存 Cookie,并且可以实现会话保持,然后,通过 session 对象的 get() 方法或 post() 方法发起 HTTP 请求即可,示例代码如下:
import requests
#创建session对象,该对象会自动保存Cookie,并且可以实现会话保持
session=requests.Session()
url="https://www.kuaidaili.com/login/"
#POST方法的请求参数
data={
    "username":"13309861086",
    "passwd":"www.oldxia.com"
}
headers={
    "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,
like Gecko)Chrome/74.0.3729.169 Safari/537.36",
}
#向登录页面发起HTTP请求,目的是获取成功登录后的Cookie,然后保存到session对象中
response=session.post(url=url,data=data,headers=headers)
new_url="https://www.kuaidaili.com/usercenter/"
#使用已经自动保存Cookie的session对象向账户管理页面发起HTTP请求
new_response=session.get(url=new_url,headers=headers)
res=new_response.text
with open("kuaidaili.html","w",encoding="utf-8")as f:
    f.write(res)

3、使用代理IP

在 requests 库中,使用代理 IP 的应用过程较 urllib 库要简单许多,只需在 get() 函数或 post() 函数中添加参数 proxies,该参数表示代理 IP,并且同样可以分为两种,即免费代理 IP 和收费代理 IP,其格式与 urllib 库中所使用的格式一致,示例代码如下:
import requests
url='https://www.so.com/s?q=ip'
#免费代理IP
#proxy={
#"http":"http://42.56.238.40:3000",
#"https":"http://42.56.238.40:3000"
#}
#收费代理IP
proxy={
    "http":"http://xiazhengdong:3p0h090r@110.85.202.232:18937",
    "https":"http://xiazhengdong:3p0h090r@110.85.202.232:18937"
}
headers={
    "User-Agent":"Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,
like Gecko)Chrome/74.0.3729.169 Safari/537.36",
}
response=requests.get(url=url,headers=headers,proxies=proxy)
res=response.text
with open("so.html","w",encoding="utf-8")as f:
    f.write(res)
此时,运行 so.html 文件,其显示的 IP 为“223.11.213.168中国山西省太原市中国电信”,而笔者的真实 IP 为“113.234.106.225中国辽宁省大连市中国联通”。

4、验证码登录

目前,互联网上绝大多数的网站采取了各式各样的措施来反网络爬虫技术,其中一个常用的措施便是要求输入验证码。

早期的验证码是由纯数字随机组合而成的,后来加入了英文字母和混淆曲线等,并且随着技术的不断发展,验证码的种类也愈发繁多,包括有任意特殊字符的验证码、计算题类型的验证码、问答题类型的验证码和坐标类型的验证码等。

Python 网络爬虫实现验证码登录的基本原理很简单。首先,需要将网站登录页面中的验证码图片保存下来,然后获取该图片中验证码的信息,并统一封装,最后使用 POST 方法发送给服务器,进而实现验证码登录。

虽然基本原理非常简单,但是需要注意的是,在获取验证码和登录时,必须使用 session 对象来保持同一个会话,以保证获取验证码和登录时的 Cookie 一致,否则无法成功登录。

而关于获取验证码中信息的方法,推荐读者使用第三方识别平台,如超级鹰等,因为个人开发的验证码识别 API,其所能识别的验证码种类较少,并且识别率不高,相比来讲,虽然第三方平台需要付费使用,但是费用相对较低,并且识别验证码的种类非常全面,识别成功率也极高,可以帮助读者极大地节省开发时间。

推荐阅读