Python爬虫:urllib库的基本使用

embedded/2024/9/25 23:18:19/

文章目录

  • 一、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状态码
python">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到服务器的数据
python">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反爬,根据反爬手段的强弱,可以在请求头中放入更多信息。

python">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请求方式

python">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请求方式

python">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地址免受攻击。

python">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.ppmy.cn/embedded/5072.html

相关文章

设计模式---模板方法模式

一、介绍 所谓模板方法模式,就是提供一种方法的模板来实现一种规范,其他人可以利用这个模板定义自己的逻辑。 在Java编程中的应用,主要就是通过接口或者抽象类来实现的,抽象类中可以把逻辑函数声明为final类型,表示不能…

通快霍廷格TruPlasma RF 7007 – 7020电源使用说明手侧

通快霍廷格TruPlasma RF 7007 – 7020电源使用说明手侧

蓝桥杯刷题-数星星

1265. 数星星 - AcWing题库 /* 题目中的y是递增&#xff0c;不影响 */ /* 直接看作一维数组的更新维护 */ /* 将数据二进制化&#xff0c;拿最低位的1 */ /* 转化为线段树的解法才是核心 */ /* 思想是前缀和 */ #include <bits/stdc.h>using namespace std;const int N …

MySQL数据库外键约束打开与关闭 ️

MySQL数据库外键约束打开与关闭 &#x1f6e0;️ MySQL数据库外键约束打开与关闭 &#x1f6e0;️摘要 &#x1f4dd;引言 &#x1f680;正文内容&#xff08;详细介绍&#xff09; &#x1f4a1;关闭外键约束检查外键约束检查关闭的作用风险与最佳实践建议 &#x1f914; QA环…

pytorch中模型训练的学习率动态调整

pytorch动态调整学习率 背景手动设置自动衰减的学习率pytorch中的torch.optim.lr_schedulertorch.optim.lr_scheduler.ExponentialLRtorch.optim.lr_scheduler.StepLRtorch.optim.lr_scheduler.MultiStepLRtorch.optim.lr_scheduler.ReduceLROnPlateau 背景 在神经网络模型的训…

【C语言】贪吃蛇项目(2)- 实现代码详解

文章目录 前言一、游戏开始界面设计首先 - 打印环境界面其次 - 游戏地图、蛇身及食物的设计1、地图2、蛇身设置及打印3、食物 二、游戏运行环节蛇的上下左右移动等功能蛇的移动 三、结束游戏代码 前言 在笔者的前一篇博客中详细记载了贪吃蛇项目所需的一些必备知识以及我们进行…

CSS基础:盒子模型详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃&#xff0c;大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 We…

WPF: XAML语法规范详解

WPF&#xff08;Windows Presentation Foundation&#xff09;是.NET框架的一个组成部分&#xff0c;用于构建桌面应用程序的用户界面。XAML&#xff08;Extensible Application Markup Language&#xff09;是一种基于XML的标记语言&#xff0c;用于定义WPF应用程序的界面和逻…