首页 > 编程笔记
Python requests库详解
requests 库是一个功能更加强大的网络请求库,其在模拟登录、使用代理 IP 等方面均比 urllib 库更加方便,进而可以节约大量的工作时间,帮助程序员更加方便地对所需要的网页信息进行爬取。
由于 requests 库属于 Python 的第三方库,所以需要进行安装,只需在命令提示符中输入命令
此外,通过 Response 对象的相关属性和方法可以获取所需的数据,具体如下表所示。
以下为 get() 函数的相关示例代码。
爬取百度首页的源代码,示例代码如下:
爬取老夏学院的 Logo 图片,示例代码如下:
爬取 360 搜索首页的源代码,示例代码如下:
以下为 post() 函数的相关示例代码。
访问老夏学院的 HTTP 请求测试页面,示例代码如下:
百度翻译 API,示例代码如下:
在 requests 库中,首先,需要通过 Session 类创建 session 对象,该对象可以自动保存 Cookie,并且可以实现会话保持,然后,通过 session 对象的 get() 方法或 post() 方法发起 HTTP 请求即可,示例代码如下:
早期的验证码是由纯数字随机组合而成的,后来加入了英文字母和混淆曲线等,并且随着技术的不断发展,验证码的种类也愈发繁多,包括有任意特殊字符的验证码、计算题类型的验证码、问答题类型的验证码和坐标类型的验证码等。
Python 网络爬虫实现验证码登录的基本原理很简单。首先,需要将网站登录页面中的验证码图片保存下来,然后获取该图片中验证码的信息,并统一封装,最后使用 POST 方法发送给服务器,进而实现验证码登录。
虽然基本原理非常简单,但是需要注意的是,在获取验证码和登录时,必须使用 session 对象来保持同一个会话,以保证获取验证码和登录时的 Cookie 一致,否则无法成功登录。
而关于获取验证码中信息的方法,推荐读者使用第三方识别平台,如超级鹰等,因为个人开发的验证码识别 API,其所能识别的验证码种类较少,并且识别率不高,相比来讲,虽然第三方平台需要付费使用,但是费用相对较低,并且识别验证码的种类非常全面,识别成功率也极高,可以帮助读者极大地节省开发时间。
由于 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 对象的相关属性和方法可以获取所需的数据,具体如下表所示。
属 性 | 描 述 | 方 法 | 描 述 |
---|---|---|---|
text | 字符串类型的响应内容 | json() | 将响应内容解析为 JSON 格式 |
content | 字节类型的响应内容 | ||
url | 响应的 URL | ||
status_code | 响应状态码 | ||
headers | 响应头中的全部信息 | ||
encoding | 设置编码格式 |
爬取百度首页的源代码,示例代码如下:
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,其所能识别的验证码种类较少,并且识别率不高,相比来讲,虽然第三方平台需要付费使用,但是费用相对较低,并且识别验证码的种类非常全面,识别成功率也极高,可以帮助读者极大地节省开发时间。