Python爬虫:urllib库的基本使用

ops/2024/9/25 17:18:46/

文章目录

  • 一、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/ops/5149.html

相关文章

打开电脑底部导航栏的任务

from pywinauto import Application app Application("uia").connect(path"explorer") app["任务栏"].print_control_identifiers() task app["任务栏"].child_window(title"酷狗音乐", auto_id"D:\soft\kugou\KGMus…

immutable variables, constants的区别(rust)

let immutable_variable 1590865; //不可变变量 const constant_variable 0096; //常量常量、不可变变量一样,都无法更改变量的值,但是常量和不可变变量之间存在以下区别: 不可变变量默认不可变,编译器会进行检查。常量不仅在默…

面向对象——类与对象

文章目录 类与对象构造函数、析构函数get/set方法函数&#xff1a;类内声明、类外定义static 类与对象 #include<iostream> #include<string> using namespace std; /* 类与对象 */ class Person{public:string name;// 固有属性&#xff0c;成员变量 int age;pu…

第一章:系统架构概述之系统架构的定义以及发展

什么是系统架构 系统架构 (System Architecture )是系统的一种整体的高层次的结构表示&#xff0c; 是系统的骨架和根基&#xff0c;也决定 了系统的健壮性和生命周期的长短。 什么系统架构设计师 系统架构设计师在整个项目研制中的主导地位愈加重要。可以说&#xff0c;系统架…

MongoDB快速启动

两种方法: 方式 1 &#xff1a;命令行参数方式启动服务 在 bin 目录中打开命令行提示符&#xff0c;输入如下命令&#xff1a; (mongod --dbpath..\data\db) mongod --dbpath..\data\db 方式 2 &#xff1a;配置文件方式启动服务 在解压目录中新建 config 文件夹&#xff0…

C语言入门第四天(数组)

一、C语言数组的基本语法 1.数组的定义 数组是 C 语言中的一种数据结构&#xff0c;用于存储一组具有相同数据类型的数据。数组中的每个元素可以通过一个索引&#xff08;下标&#xff09;来访问&#xff0c;索引从 0 开始&#xff0c;最大值为数组长度减 1。 2.定义语法格式 …

llama-factory SFT 系列教程 (四),lora sft 微调后,使用vllm加速推理

文章目录 文章列表&#xff1a;背景简介llama-factory vllm API 部署融合 lora 模型权重 vllm API 部署HuggingFace API 部署推理API 部署总结 vllm 不使用 API 部署&#xff0c;直接推理数据集 tenplatevllm 代码部署 文章列表&#xff1a; llama-factory SFT系列教程 (一)&a…

基于Echarts的超市销售可视化分析系统(数据+程序+论文

本论文旨在研究Python技术和ECharts可视化技术在超市销售数据分析系统中的应用。本系统通过对超市销售数据进行分析和可视化展示&#xff0c;帮助决策层更好地了解销售情况和趋势&#xff0c;进而做出更有针对性的决策。本系统主要包括数据处理、数据可视化和系统测试三个模块。…