05.urllib与Requests请求实战GET
GET请求
Python中的GET请求也是HTTP协议中的一种请求方法,用于向服务器请求数据。与POST请求不同,GET请求将数据以查询字符串的形式附加在URL后面,而不是封装在请求体中。通常情况下,GET请求用于向服务器请求某个资源,比如获取网页、图片、视频等。
1.Urllib模块
Urllib官方文档 https://docs.python.org/3/library/urllib.request.html
urllib 是Python的标准库,用于发送HTTP请求和处理响应。它提供了urlopen 、Request 等函数和类来与网络资源进行交互。urllib能够处理的基本请求包括GET、POST、PUT、DELETE等,同时也支持设置请求头、请求体、处理cookies等高级功能,但其API相对较为底层,使用起来比较繁琐。urllib在处理请求时,如果发生错误,可以通过urllib.error模块来捕获异常。
内置4个模块:
- request: http的请求模块,传入UPL及额外的参数,就模拟发送请求
- error 异常处理模块,确保程序不会意外终止
- parse : 一个工具模块,提供了许多URL处理方法。
- robotparser : 用来识别robots.txt文件,判断那些网站可以爬
使用示例:
urllib 是 python 内置模块 无需安装,直接引用即可:
py
import urllib.request
# 发送GET请求
response = urllib.request.urlopen('https://www.baidu.com')
data = response.read()
print(data.decode('utf-8'))
2.Requests模块
Requests 官方文档 https://docs.python-requests.org/
Requests 是一个第三方库,提供了一个更简洁、易用的API来发送HTTP请求。它内置了丰富功能,如会话对象、请求重定向、SSL验证、代理支持等,使得它成为了一个非常流行的网络请求库。Requests的API设计遵循了Pythonic原则,使得它更加容易学习和使用。其性能通常比urllib好,因为它提供了连接池管理、会话对象复用等优化措施
Requests是一个第三方库 首先需要安装requests模块 点击终端,输入
bash
pip install requests
如果安装慢的话可以通过 镜像源安装 镜像源可参考 8个国内镜像源
bash
pip install requests -i https://mirrors.aliyun.com/pypi/simple/
使用示例:
py
import requests
# 发送GET请求
response = requests.get('https://www.baidu.com')
print(response.text)
3.对比
特性 | urllib | Requests |
---|---|---|
安装 | 无需安装,Python自带 | 需要安装,pip install requests |
设计 | 较底层,需要手动处理更多细节 | 高阶,提供完整请求方法 |
功能 | 基本请求、cookies处理等 | 全面,包括会话管理、请求重定向等 |
性能 | 一般 | 较好,因为有连接池等优化 |
易用性 | 较难上手 | 易于上手和学习 |
4.实战
以 https://movie.douban.com/ 为例
- urllib GET 请求
py
import urllib.request
# 发送GET请求
response = urllib.request.urlopen('https://movie.douban.com/')
data = response.read()
print(data.decode('utf-8'))
# 发送POST请求
data = {'key': 'value'}
response = urllib.request.urlopen('https://www.baidu.com', data=data)
print(response.read().decode('utf-8'))
喔霍,没有想象中的顺利,报错了 urllib.error.HTTPError: HTTP Error 418:
可参考 HTTP响应状态码一览表
HTTP状态码418是一个非标准的HTTP状态码,被定义为"I'm a teapot"(我是一个茶壶)。这个状态码源自1998年的一个愚人节笑话,被写入了RFC 2324,Hyper Text Coffee Pot Control Protocol(超文本咖啡壶控制协议)。在实际的Web开发中,有些网站可能会使用这个状态码作为反爬虫策略的一部分。当服务器返回418状态码时,可能是因为服务器认为你的请求是一个爬虫,而不是一个正常的用户请求。
解决方法:
- 修改你的请求头,使其看起来更像一个正常的用户(也就是模拟浏览器去发出请求)。
请求头对爬虫来说,就好像一个面具,去模仿人去浏览网站,就不会被网站发现,也可以理解为打开网站的钥匙,上面我们知道,数据在链接中,但是我们申请后,返回状态码是418,请求失败,所有我们现在戴上面具,或者说,拿着钥匙再去申请,看看能不能成功打开。
- 定义一个确定的User-Agent
py
req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0")
打开电脑浏览器----》审查元素---》网络---》点开一个请求---》User-Agent
- 随机User-Agent
py
from fake_useragent import UserAgent
req.add_header('User-Agent',UserAgent().chrome)
- 如果网站使用了cookie来跟踪用户,你可能需要在你的爬虫中处理cookie。(设置了User-Agent还未解决的情况下考虑这种情况)
- 有些网站可能会检查请求之间的时间间隔,如果请求过于频繁,可能会被认为是爬虫。在这种情况下,你可以在你的请求之间添加一些延迟。
py
time.sleep(random.uniform(0, 0.02))#具体时间可以自行测试
设置请求头后能正常访问的代码:
py
from urllib import request
url = 'https://movie.douban.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36'
}
req = request.Request(url=url, data=None, headers=headers)
response = request.urlopen(req)
print(response.read().decode('utf-8'))
结果:
- requests GET 请求
py
import requests
url = 'https://movie.douban.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/537.36'
}
#发送GET请求
response = requests.get(url, headers=headers)
print(response.text)
只是用法不同,结果返回是一样的 如上图所示