05.爬虫---urllib与requests请求实战(GET)

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请求和处理响应。它提供了urlopenRequest 等函数和类来与网络资源进行交互。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状态码时,可能是因为服务器认为你的请求是一个爬虫,而不是一个正常的用户请求。

解决方法:

  1. 修改你的请求头,使其看起来更像一个正常的用户(也就是模拟浏览器去发出请求)。

请求头对爬虫来说,就好像一个面具,去模仿人去浏览网站,就不会被网站发现,也可以理解为打开网站的钥匙,上面我们知道,数据在链接中,但是我们申请后,返回状态码是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)
  1. 如果网站使用了cookie来跟踪用户,你可能需要在你的爬虫中处理cookie。(设置了User-Agent还未解决的情况下考虑这种情况
  2. 有些网站可能会检查请求之间的时间间隔,如果请求过于频繁,可能会被认为是爬虫。在这种情况下,你可以在你的请求之间添加一些延迟。
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)

只是用法不同,结果返回是一样的 如上图所示

相关推荐
数据小小爬虫7 小时前
利用Java爬虫获取苏宁易购商品详情
java·开发语言·爬虫
小木_.7 小时前
【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
爬虫·python·学习·分享·批量下载·图片下载器
lovelin+v175030409667 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
qq_375872699 小时前
14爬虫:scrapy实现翻页爬取
爬虫·scrapy
Jelena技术达人9 小时前
Java爬虫获取1688关键字接口详细解析
java·开发语言·爬虫
小爬虫程序猿13 小时前
如何利用Python爬虫精准获取苏宁易购商品详情
开发语言·爬虫·python
API快乐传递者13 小时前
Python爬虫获取1688详情接口详细解析
开发语言·爬虫·python
小爬虫程序猿15 小时前
如何设置爬虫的访问频率?
爬虫