前言
urllib库是python自带的标准库,不用安装,可直接使用。它用于处理url,并对网页的内容进行抓取处理。
urllib 包含以下几个模块:
● urllib.request :打开和读取 URL。用于发送请求和读取数据
● urllib.error :包含 urllib.request 抛出的异常。
● urllib.parse :解析和构造 URL。
● urllib.robotparser :提供 RobotFileParse 类,解析 robots.txt 文件。
一、urllib.request
1、发送请求
urllib.request.urlopen 是 Python urllib.request 模块中的一个函数,用于打开一个 URL 并返回一个 HTTPResponse 对象。
urllib.request.urlopen() 的语法:
urllib.request.urlopen(url, date=None, [timeout, ]*, cafile=None, capath=None,
cadefault=False, context=None)
- url:要请求的URL。
- data:可选,发送的数据(如POST请求的数据)。默认值为None,若data为None,代表请求方式为get,发送get请求;若data不为None,则代表请求方式为post,发送post请求。
- timeout:可选,请求超时时间(秒),如果未指定,则使用全局默认超时设置。
- cafile:可选,CA证书文件路径。
- capath:可选,CA证书目录路径。
- cadefault:可选,是否使用默认CA证书。
- context:可选,SSL上下文对象。
例如:
import urllib.request
# 发送一个GET请求到 https://mp.csdn.net,并设置超时时间为10秒。
response = urllib.request.urlopen('https://mp.csdn.net', timeout=10)
2、处理响应内容
urllib.request.urlopen 的返回值是一个 对象 http.client.HTTPResponse ,常用以下方法读取响应内容:
- read():读取整个响应内容。
- readline():读取一行内容。
- readlines():读取所有行并返回一个列表
读取响应内容,例如:
import urllib.request
response = urllib.request.urlopen('https://mp.csdn.net')
context = response.read() //读取响应内容
print(context)
3、设置请求头
在发送请求时,可以设置 HTTP 请求头,以模拟浏览器行为或传递额外的信息。通过urllib.request 模块中的 Request 类来设置请求头。
urllib.request.Request() 的语法:
urllib.request.Request(url, data=None, heads={}, method=None)
- url:要发送请求的 URL。
- data:可选,发送的数据(如POST请求的数据)。默认值为None,若data为None,代表请求 方式为get,发送get请求;若data不为None,则代表请求方式为post,发送post请求。
- headers:可选,设置请求中的请求头信息(字典类型)。
- method:设置请求方式)。
设置请求头,例如:
import urllib.request
url = 'https://mp.csdn.net'
# 自定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) '
'AppleWebKit/534.16 (KHTML, like Gecko) '
'Chrome/10.0.648.133 Safari/534.16'
}
# 设置请求头
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
context = response.read()
print(context)
4、代理IP
在使用 urllib 进行网络请求时,可设置代理IP来访问网站,以隐藏用户的真实 IP 地址。通过 urllib.request.ProxyHandler() 方法动态设置代理IP池。
创建代理IP池,使用代理IP访问网站,例如:
import urllib.request
import random
# 创建代理IP池
proxy_pool = [
{'http': '8.220.204.215:8080', 'https': '8.220.204.215:8080'},
{'http': '154.203.132.49:8080', 'https': '154.203.132.49:8080'},
{'http': '180.103.181.10:80', 'https': '180.103.181.10:80'},
{'http': '101.200.75.55:80', 'https': '101.200.75.55:80'}
]
# 从代理IP池中随机选择一个代理IP
def get_random_proxy():
return random.choice(proxy_pool)
url = 'https://mp.csdn.net'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) '
'AppleWebKit/534.16 (KHTML, like Gecko) '
'Chrome/10.0.648.133 Safari/534.16'
}
# 代理IP
proxy = get_random_proxy()
# 设置代理IP
proxy_handler = urllib.request.ProxyHandler(proxy)
opener = urllib.request.build_opener(proxy_handler)
request = urllib.request.Request(url, headers=headers)
response = opener.open(request).decode('utf-8')
context = response.read()
print(context)
注:由于使用代理IP,代理IP可能不可用或已失效,连接IP的时候出现超时而报错;也可能目标网站检测到代理并拒绝访问,且频繁使用有限的代理IP可能导致IP被封。