文章目录
- 一、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)