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

news2024/10/5 15:31:57

05.urllib与Requests请求实战GET

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

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

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模块 点击终端,输入

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)

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 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 请求
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)

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1700731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Linux]第一个小程序-进度条

回车,换行概念 \n&#xff1a;回车&#xff0c;换行 回车&#xff1a;回到最开始 换行&#xff1a;回到最新的一行 缓冲区概念 #include <stdio.h> int main() {printf("hello Makefile!\n");sleep(3);return 0; } #include <stdio.h> int main() {pr…

邦之信短信分析:验证码短信、营销短信与通知短信的差异化解析

在数字通讯时代&#xff0c;短信已成为我们日常生活中不可或缺的一部分。其中&#xff0c;验证码短信、营销短信和通知短信各自扮演着不同的角色。今天&#xff0c;飞鸽将带您深入了解这三种短信类型之间的核心差异。 1. 验证码短信 验证码短信广泛应用于各类电商网站和…

使用Prometheus组件node_exporter采集linux系统的指标数据(包括cpu/内存/磁盘/网络)

一、背景 Linux系统的基本指标包括cpu、内存、磁盘、网络等&#xff0c;其中网络可以细分为带宽进出口流量、连接数和tcp监控等。 本文使用Prometheus组件node_exporter采集&#xff0c;存储在promethues&#xff0c;展示在grafana面板。 二、安装node_exporter 1、下载至本…

【C++】CentOS环境搭建-升级 OpenSSL

【C】CentOS环境搭建-升级 OpenSSL 下载 OpenSSL 源代码解压源代码进入源代码目录配置编译选项报错Cant locate IPC/Cmd.pm in INC (INC contains: /usr/local/openssl-3.3.0/util/perl /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/shar…

Python编程-后端开发之Django5应用请求处理与模板基础

Python编程-后端开发之Django5应用请求处理与模板基础 最近写项目&#xff0c;刚好用到了Django&#xff0c;现在差不多闲下来&#xff0c;个人觉得单体项目来讲django确实舒服&#xff0c;故写此总结 模板语法了解即可&#xff0c;用到了再看&#xff0c;毕竟分离已经是主流操…

幼儿园管理系统-收退费管理原型模版

幼儿园管理系统是专为幼儿园打造&#xff0c;涵盖学校儿童、职工人事、收费财务、后勤管理、办公教务、膳食分析、体检保健、文档管理等各方面内部管理的幼儿园专家系统。 本次分享给大家的是雅居乐教育集团幼儿园园务管理系统中“收退费管理”模块的设计文档。收退费管理是幼儿…

报错:c2665 ”loadimage“没有重载函数可以转换所有参数类型

解决方法: 右键项目选择属性-》高级-》字符集-》使用多字节字符集-》确定

IO多路复用模型原理

在linux没有实现epoll事件驱动机制之前,常规的手段是选择select和poll等IO多路复用的方法来实现并发服务程序。但是在大数据、高并发、集群情况下,select和poll的性能瓶颈就出现了,于是epoll就诞生了 Select select函数监视的文件描述符分三类:writefds、readfds和exceptf…

国内首个智能体生态大会!2024百度万象大会定档5月30日

最近&#xff0c;百度悄悄「上新」了几个AI神器。 百度搜索上线「互动」功能&#xff0c;可以实时问答&#xff0c;查询信息就像聊天一样简单&#xff0c;还可以艾特相关智能体&#xff0c;更细致精确地满足个性化需求&#xff0c;比如去新加坡旅游&#xff0c;可以让新加坡旅…

【源码】2024心悦搜剧源码百万级网盘资源

1、一键转存他人链接&#xff1a;就是将别人的分享链接转为你自己的 2、转存心悦搜剧资源&#xff1a;就是将心悦搜剧平台上的所有资源都转成你自己的 3、每日自动更新&#xff1a;自动转存每天的资源并入库 前端uin-app&#xff0c;后端PHP&#xff0c;兼容微信小程序

必看!企业数字化转型的组织架构与人员配置方案!

数字化浪潮汹涌而来&#xff0c;企业如何在这波大潮中破浪前行&#xff1f;关键在于构建合理的组织架构和配备合适的人员&#xff01;今天&#xff0c;我们就为大家带来蚓链实践经验总结的方案&#xff0c;让你的企业数字化转型之路更加顺畅&#xff01; 组织架构&#xff1a; …

【数学建模】碎纸片的拼接复原

2013高教社杯全国大学生数学建模竞赛B题 问题一模型一模型二条件设立思路 问题求解 问题一 已知 d i d_i di​为第 i i i张图片图片的像素矩阵 已知 d i d_i di​都是 n ∗ m n*m n∗m二维矩阵 假设有 N N N张图片 模型一 我们认为对应位置像素匹配为 d i [ j ] [ 1 ] d k…

引入安全生产培训云平台,实现“人人讲安全、个个会应急”

引入安全生产培训云平台&#xff0c;旨在全面提升企业及员工的安全意识与应急处理能力&#xff0c;通过数字化手段实现“人人讲安全、个个会应急”的目标。这一平台的构建和应用&#xff0c;不仅促进了安全知识的普及&#xff0c;还极大提高了培训的效率与效果。以下是该平台几…

【赠书第24期】Java项目开发实战(微视频版)

文章目录 前言 1 项目选择与需求分析 1.1 项目选择 1.2 需求分析 2 系统设计 2.1 系统架构设计 2.2 数据库设计 2.3 接口设计 3 编码实现 3.1 环境搭建 3.2 编码规范 3.3 编码实现 4 测试与部署 4.1 单元测试 4.2 系统测试 4.3 部署与上线 5 总结与展望 6 推…

挖矿宝藏之系统日志

什么是日志&#xff1f; 日志是指系统或应用程序在运行过程中产生的记录文件&#xff0c;这些文件记录了系统或应用程序的运行情况、错误信息、用户操作等。 日志的主要作用 记录信息&#xff1a;日志可以记录系统或应用程序的启动、运行、停止等状态信息&#xff0c;以及用户的…

262 基于matlab的一级倒立摆仿真

基于matlab的一级倒立摆仿真&#xff0c;在对一级倒立摆进行数学建模的基础上&#xff0c;对模型进行线性化&#xff0c;得到其状态空间模型&#xff0c;利用二次型最优控制方法得出控制率。输出角度和位置优化曲线。程序已调通&#xff0c;可直接运行。 262 一级倒立摆仿真 状…

adb环境搭建

1.安装jdk adb正常使用的前提条件&#xff1a;安装jdk&#xff0c;网上很多可以找找&#xff0c;或者翻翻之前记录的。 2.安装adb 2.1.下载Android_sdk 通过网盘下载&#xff0c;网盘链接&#xff1a;https://pan.baidu.com/s/1r4Y_2-nkKs2a2h9mdrueWg&#xff0c;e5wv。下载成…

关系代数、函数依赖、Armstrong公理及软考试题解析

注&#xff1a;本文面向于软考高级—系统架构设计师&#xff0c;具体来说是数据库部分&#xff0c;知识点偏零碎化。想要系统学习数据库原理的&#xff0c;可考虑去看《数据库原理》&#xff0c;清华大学出版社或其他出版社皆可。 概述 概念 关系&#xff0c;就是二维表。特…

2024年上半年软件设计师试题及答案(回忆版)

目录 基础知识选择题案例题1.缺陷识别的数据流图2.球队、球员、比赛记录的数据库题3.用户、老师、学生、课程用例图4.算法题5.程序设计题 基础知识选择题 树的节点&#xff0c;度为4的有4个&#xff0c;度为3的有8个&#xff0c;度为2个有6个&#xff0c;度为1的有10个&#x…

spring boot整合j2cache 配置项目全局键标识 帮助定位是哪个项目产生的缓存

我们利用 j2cache 存进 redis的缓存 key 可以加个全局标识 这样 到时看缓存 方便别人看是哪个项目存进去的 例如 这里 我们存入的 book 我们 keys * 查看 就知道是个book 但不知道具体来自那套系统 我们在 j2cache.properties 中加上 redis.namespace 项目全局键标识 我们…