Python爬虫:urllib库的基本使用

文章目录

  • 一、urllib简介
  • 二、请求的发送和响应
    • (一)发送请求
    • (二)获取相应内容
    • (三)下载所需文件
  • 三、URL请求对象的定制
  • 四、常见请求方式
    • (一)get请求方式
    • (二)post请求方式
  • 五、代理IP的使用

一、urllib简介

urllib是Python自带的标准库,通常用于爬虫开发、API数据获取和测试,是一个收集了多个涉及 URL 的模块的包:

作用
urllib.request打开和读取 URL
urllib.error包含 urllib.request 抛出的异常
urllib.parse用于解析 URL
urllib.robotparser用于解析 robots.txt 文件

二、请求的发送和响应

(一)发送请求

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

参数说明
url需要访问的网站的URL地址
data用于给出要发送到服务器的附加数据,若不需要发送数据则为 None
timeout用于指定阻塞操作的超时时间,单位为秒,未指定将使用全局默认超时参数
cafile、capsth用于为 HTTPS 请求指定一组受信 CA 证书
cadefault将被忽略
context用于描述各种SSL选项的实例

(二)获取相应内容

当对网站发送请求时,网站会返回相应的响应内容,对于使用urlopen得到的http.client.HTTPResponse类型的数据,主要有以下几种方法函数:

方法函数说明
read()按字节进行读取,可以指定读取多少字节
readline()按行进行读取,读取一行
readlines()按行进行读取,读取所有行
geturl()返回请求的URL
getheaders返回请求链接的状态信息
getcode返回HTTP状态码
import urllib.request# 指定url
url = "http://www.baidu.com"# 打开url
response = urllib.request.urlopen(url)# 读取返回的内容
content = response.read().decode('utf-8')# 写入txt
with open('baidu.txt', 'w', encoding='utf-8') as f:f.write(content)

(三)下载所需文件

对于不同内容可以使用urlretrieve下载得到相应的文件。

urlretrieve(url, filename=None, reporthook=None, data=None):

参数说明
url下载链接地址
filename指定保存本地路径
reporthook回调函数
data指post到服务器的数据
import urllib.request# 下载百度网页
url_page = "http://www.baidu.com"
urllib.request.urlretrieve(url_page, "baidu.html")# 下载csdn图标
url_img = "https://img-home.csdnimg.cn/images/20201124032511.png"
urllib.request.urlretrieve(url_img, "csdn.png")# 下载生日快乐歌
url_video = "https://vd4.bdstatic.com/mda-id9czn5517wu43qj/sc/mda-id9czn5517wu43qj.mp4"
urllib.request.urlretrieve(url_video, "birthday.mp4")

三、URL请求对象的定制

将对网页的请求封装到对象当中,同时设置相关的参数,例如可以应对常见的UA反爬,根据反爬手段的强弱,可以在请求头中放入更多信息。

import urllib.request# 指定请求对象的相关参数
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
}# 定制请求对象
request = urllib.request.Request(url=url, headers=headers)# 向请求对象发出请求
response = urllib.request.urlopen(request)# 转换为utf-8编码打印出来
content = response.read().decode("utf-8")
print(content)

四、常见请求方式

get请求是从指定的资源请求数据,用于获取数据,请求的内容会作为url的一部分,请求的资源会得到缓存。

post请求是向指定的资源提交要被处理的数据,用于将数据发送给服务器,请求的内容数据量更大,不会作为url的一部分,不会被缓存。

(一)get请求方式

import urllib.request
import urllib.parse# 指定基本url和请求查询参数
base_url = "https://www.baidu.com/s?"
data = {'wd':'csdn','tag':'社区','address':'海南省海口市'
}# 将查询参数拼接到基本的url中
new_data = urllib.parse.urlencode(data)
url = base_url + new_data# 定制请求对象
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
}
request = urllib.request.Request(url=url, headers=headers)# 向请求对象发出请求
response = urllib.request.urlopen(request)# 转换为utf-8编码打印出来
content = response.read().decode("utf-8")
print(content)

(二)post请求方式

import urllib.parse
import urllib.request# 指定url、请求头文件、请求查询参数
url = "https://fanyi.baidu.com/sug"
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"
}
data = {"kw": "spider"
}# 对查询参数进行编码
data = urllib.parse.urlencode(data).encode("utf-8")# 定制请求对象,将查询参数放到请求对象中
request = urllib.request.Request(url, data, header)# 向请求对象发出请求
response = urllib.request.urlopen(request)# 转换为utf-8编码的json文件打印出来
content = response.read().decode("utf-8")
import json
obj = json.loads(content)
print(obj)

五、代理IP的使用

代理的常用功能包括:可以突破自身IP的限制,访问单位或团体的内部资源,提高访问的速度,隐藏自己的IP地址免受攻击。

import urllib.request# 请求对象的定制
url = 'http://www.baidu.com/s?wd=ip'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'
}
request = urllib.request.Request(url=url, headers=headers)# 代理IP池
proxiesPool = [{'http': '182.34.21.22:9999'},{'http': '60.182.35.230:8888'}
]# 随机从代理IP池中选择一个IP
import random
proxies = random.choice(proxiesPool)# 使用handler对象创建opener对象
handler = urllib.request.ProxyHandler(proxies=proxies)
opener = urllib.request.build_opener(handler)# 向opener对象发出请求
response = opener.open(request)content = response.read().decode('utf-8')
with open('ip.html', 'w', encoding='utf-8') as fp:fp.write(content)

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

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

相关文章

当我们使用git 上传码云的时候报错:Push rejected Push to origin/master was rejected

在我们推送成果去git(码云)的过程中报错:Push rejected Push to origin/master was rejected 这个问题是我们在推的时候被拒绝了 控制台报错: 18:46:19.665: [zengqingqingandluoxuwen] git -c credential.helper -c core.quote…

系统架构最佳实践 -- 金融企业的资损问题介绍

什么是资损 资损通常来讲是指支付场景下的资金损失,这里可以从两个维度看 用户角度:多扣用户款导致用户资金损失,此问题一般需要通过客服等渠道反馈,可以把多的钱退给用户,但是很大程度上损失了用户体验; …

list 简化版模拟实现

1ListNode template<class T>struct ListNode{public:ListNode(const T& x T()):_next(nullptr), _prev(nullptr), _data(x){}//private://共有可访问ListNode<T>* _next;ListNode<T>* _prev;T _data;}; 实现iterator对Node*的封装 实现运算符重载 vo…

万字长文深入理解Docker镜像分层原理、容器数据卷、网络通信架构(Docker系列第2章,共3章)

镜像分层的简单直观体现 在执行docker pull时&#xff0c;会发现多个Pull complete 字样&#xff0c;就能体现分层&#xff0c;如果是一个文件&#xff0c;只会有一个Pull complete 。 docker pull redis Using default tag: latest latest: Pulling from library/redis a2ab…

算法中的复杂度(先做个铺垫)

文章目录 定义与分类时间复杂度概念大O的渐进表示法举例情况注意内涵 空间复杂度最优解 定义与分类 复杂度&#xff1a;衡量算法效率的标准时间效率&#xff1a;衡量这个算法的运行速度&#xff0c;也就是我们常说的时间复杂度空间效率&#xff1a;衡量这个算法所需要的额外空…

ChatGPT 专属指南:利用ChatGPT提升论文写作效率

ChatGPT无限次数:点击直达 ChatGPT 专属指南&#xff1a;利用ChatGPT提升论文写作效率 引言 随着人工智能技术的不断发展&#xff0c;如今许多工具被开发出来&#xff0c;以帮助人们更高效地进行各种工作。其中&#xff0c;ChatGPT作为一个强大的语言生成模型&#xff0c;不仅…

分布式结构化数据表Bigtable

文章目录 设计动机与目标数据模型行列时间戳 系统架构主服务器Chubby作用子表服务器SSTable结构子表实际组成子表地址组成子表数据存储及读/写操作数据压缩 性能优化局部性群组&#xff08;Locality groups&#xff09;压缩布隆过滤器 Bigtable是Google开发的基于GFS和Chubby的…

云计算:Linux 部署 OVN 集群

目录 一、实验 1.环境 2.Linux 部署 OVN 集群&#xff08;中心端&#xff09; 3.Linux 部署 OVN 集群&#xff08;业务端1&#xff09; 4.Linux 部署 OVN 集群&#xff08;业务端2&#xff09; 4.OVN 中心端 连接数据库 5.OVN 业务端1 加⼊控制器 6.OVN 业务端2 加⼊控…

【uniapp】初始化项目

初始化uniapp项目 创建 Vue3/Vite 工程 # 创建以 javascript 开发的工程 npx degit dcloudio/uni-preset-vue#vite my-vue3-project # 创建以 typescript 开发的工程 npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project 如果报错&#xff0c;或者网络问你等无法…

强大的压缩和解压缩工具 Keka for Mac

Keka for Mac是一款功能强大的压缩和解压缩工具&#xff0c;专为Mac用户设计。它支持多种压缩格式&#xff0c;包括7z、Zip、Tar、Gzip和Bzip2等&#xff0c;无论是发送电子邮件、备份文件还是节省磁盘空间&#xff0c;Keka都能轻松满足用户需求。 这款软件的操作简单直观&…

Tesserocr 的安装步骤

Tesserocr 的安装 OCR&#xff0c;即 Optical Character Recognition&#xff0c;光学字符识别。是指通过扫描字符&#xff0c;然后通过其形状将其翻译成电子文本的过程。那么对于图形验证码来说&#xff0c;它都是一些不规则的字符&#xff0c;但是这些字符确实是由字符稍加扭…

数据结构与算法——20.B-树

这篇文章我们来讲解一下数据结构中非常重要的B-树。 目录 1.B树的相关介绍 1.1、B树的介绍 1.2、B树的特点 2.B树的节点类 3.小结 1.B树的相关介绍 1.1、B树的介绍 在介绍B树之前&#xff0c;我们回顾一下我们学的树。 首先是二叉树&#xff0c;这个不用多说&#xff…

Linux的文件操作中的静态库的制作

Linux操作系统支持的函数库分为&#xff1a; 静态库&#xff0c;libxxx.a&#xff0c;在编译时就将库编译进可执行程序中。 优点&#xff1a;程序的运行环境中不需要外部的函数库。 缺点&#xff1a;可执行程序大 &#xff08;因为需要 编译&#xff09; 动态库&#xff0c…

Spring Cloud学习笔记:Eureka集群搭建样例

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、项目架构2、Dependency3、项目启动类4、application.yml5、启动项目 1、项目架构 因为这是单机模拟集群搭建&#xff0c;为了方便管理就都放在了一个项目中。这次准备搭建三个项目server1, server2, server3 …

常见的垃圾回收算法

文章目录 1. 标记清除算法2. 复制算法3. 标记整理算法4. 分代垃圾回收算法 1. 标记清除算法 核心思想&#xff1a; 标记阶段&#xff0c;将所有存活的对象进行标记。Java中使用可达性分析算法&#xff0c;从GC Root开始通过引用链遍历出所有存活对象。清除阶段&#xff0c;从…

ES6 的解构赋值

解构赋值&#xff08;Destructuring assignment&#xff09;是一种方便快捷的方式&#xff0c;可以从对象或数组中提取数据&#xff0c;并将数据赋值给变量。解构赋值是ES6中一项强大且常用的特性. 1. 基本数组解构 首先&#xff0c;让我们看看如何对数组进行解构赋值。假设我…

IT运维中负载均衡的原理,包括它的作用、原理和算法优化

负载均衡在IT运维中扮演着重要的角色&#xff0c;它能够提高系统的性能、可靠性和可扩展性。本文将详细介绍负载均衡的原理、作用、优化方面以及几种常见的负载均衡算法&#xff0c;并提供一些具体的应用示例。 一、负载均衡的作用 负载均衡的主要作用是将客户端请求均匀地分…

C++ 泛型编程 模板

1.模板 就是建立通用的模具&#xff0c;大大提高复用性 模板的特点&#xff1a; 模板不可以直接使用&#xff0c;它只是一个框架 模板的通用并不是万能的 * C另一种编程思想称为 泛型编程 &#xff0c;主要利用的技术就是模板 * C提供两种模板机制:**函数模板**和**类模板*…

快速配置docker 国内源地址

前言 用于快速配置docker国内镜像&#xff0c;和自定义的docker存储路径。 执行代码 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://dockerproxy.com","https://docker.mirrors.ustc.…

webrtc中的Track,MediaChannel,MediaStream

文章目录 Track,MediaChannel,MediaStream的关系MediaStream的创建流程创建VideoChannel的堆栈创建VideoStream的堆栈 sdp中媒体参数信息的映射sdp中媒体信息参数设置体系参数设置流程参数映射体系 Track,MediaChannel,MediaStream的关系 Audio/Video track&#xff0c;MediaC…