当前位置: 首页 > news >正文

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

05.urllib与Requests请求实战GET

    • 1.Urllib模块
    • 2.Requests模块
    • 3.对比
    • 4.实战

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 内置模块 无需安装,直接引用即可:

import urllib.request# 发送GET请求
response = urllib.request.urlopen('https://www.baidu.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'))

2.Requests模块

Requests是一个第三方库,提供了一个更简洁、易用的API来发送HTTP请求。它内置了丰富功能,如会话对象、请求重定向、SSL验证、代理支持等,使得它成为了一个非常流行的网络请求库。Requests的API设计遵循了Pythonic原则,使得它更加容易学习和使用。其性能通常比urllib好,因为它提供了连接池管理、会话对象复用等优化措施
Requests是一个第三方库 首先需要安装requests模块 点击终端,输入

pip install requests

如果安装 慢 的话可以通过 镜像源安装 镜像源可参考 8个国内镜像源

pip install requests -i https://mirrors.aliyun.com/pypi/simple/

使用示例:

import requests# 发送GET请求
response = requests.get('https://www.baidu.com')
print(response.text)# 发送POST请求
data = {'key': 'value'}
response = requests.post('https://www.baidu.com', data=data)
print(response.text)

3.对比

特性urllibRequests
安装无需安装,Python自带需要安装,pip install requests
设计较底层,需要手动处理更多细节高阶,提供完整请求方法
功能基本请求、cookies处理等全面,包括会话管理、请求重定向等
性能一般较好,因为有连接池等优化
易用性较难上手易于上手和学习

4.实战

以 https://movie.douban.com/ 为例
在这里插入图片描述

  • urllib GET 请求
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
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
from fake_useragent import UserAgent
req.add_header('User-Agent',UserAgent().chrome)
  1. 如果网站使用了cookie来跟踪用户,你可能需要在你的爬虫中处理cookie。(设置了User-Agent还未解决的情况下考虑这种情况
  2. 有些网站可能会检查请求之间的时间间隔,如果请求过于频繁,可能会被认为是爬虫。在这种情况下,你可以在你的请求之间添加一些延迟。
time.sleep(random.uniform(0, 0.02))#具体时间可以自行测试

设置请求头后能正常访问的代码:

from urllib import requesturl = '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 请求
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)

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

  • urllib requests POST 请求会涉及到一些认证在接下来的章节会详细介绍

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【机器学习结合AI绘画工具】——开启艺术创作的新纪元
  • Vue 子组件向父组件传值
  • ros 学习记录(四)仿真环境中键盘控制turtlebot3运动
  • MySQL - 信贷业务报表
  • 半年不在csdn写博客,总结一下这半年的学习经历,coderfun的一些碎碎念.
  • Hudi 多表摄取工具 HoodieMultiTableStreamer 配置方法与示例
  • RH850F1KM-S4-100Pin_ R7F7016453AFP MCAL Gpt 配置
  • SylixOS nty模块使用说明
  • Spring框架温习
  • 大学校园广播“录编播”与IP广播系统技术方案
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • 【Linux】-Flink分布式内存计算集群部署[21]
  • Mysql下Limit注入方法(此方法仅适用于5.0.0<mysql<5.6.6的版本)
  • DFS:解决二叉树问题
  • 返回枚举类给前端
  • “大数据应用场景”之隔壁老王(连载四)
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 10个确保微服务与容器安全的最佳实践
  • 2019.2.20 c++ 知识梳理
  • Apache Spark Streaming 使用实例
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS7 安装JDK
  • centos安装java运行环境jdk+tomcat
  • Consul Config 使用Git做版本控制的实现
  • create-react-app项目添加less配置
  • DOM的那些事
  • hadoop集群管理系统搭建规划说明
  • Mac转Windows的拯救指南
  • Map集合、散列表、红黑树介绍
  • MaxCompute访问TableStore(OTS) 数据
  • PAT A1050
  • QQ浏览器x5内核的兼容性问题
  • Redis的resp协议
  • spark本地环境的搭建到运行第一个spark程序
  • SpringCloud集成分布式事务LCN (一)
  • 二维平面内的碰撞检测【一】
  • 番外篇1:在Windows环境下安装JDK
  • 简单实现一个textarea自适应高度
  • 巧用 TypeScript (一)
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 一份游戏开发学习路线
  • 自制字幕遮挡器
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​Java基础复习笔记 第16章:网络编程
  • ​queue --- 一个同步的队列类​
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (十一)手动添加用户和文件的特殊权限
  • (一)基于IDEA的JAVA基础12
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转载)从 Java 代码到 Java 堆