2026-08-20 16:15:41
Python爬虫中urlib库核心知识总结
一、urlib库的基础信息Python2中分为urllib和urllib2两个独立库。
Python3中统一为urllib模块,功能拆分为:
urllib.request:对应Python2的urllib,负责网络请求(如urlopen)。
urllib.parse:对应Python2的urllib2,负责URL解析(如编码/解码)。
urlopen(url)
发送网络请求,返回http.client.HTTPResponse对象。
错误处理:若响应码为400,尝试在URL末尾添加/后重试。
示例:
response = urllib.request.urlopen("urlretrieve(url, filepath)
直接下载资源到本地指定路径。
示例:
urllib.request.urlretrieve("请求头定制
问题:urlopen()无法直接设置请求头,易被反爬虫识别。
解决方案:使用urllib.request.Request()创建请求对象,添加headers参数。
示例:
req = urllib.request.Request( url="代理设置
通过ProxyHandler和build_opener实现代理请求。
示例:
handler = urllib.request.ProxyHandler({"http": "127.0.0.1:8080"})opener = urllib.request.build_opener(handler)response = opener.open("URL编码与解码
quote(url):对URL进行百分号编码(如空格转为%20)。
unquote(url):解码百分号编码的URL。
示例:
encoded_url = urllib.parse.quote("字典参数拼接
urlencode(dict):将字典转换为URL参数字符串并编码。
示例:
params = {"key1": "value1", "key2": "value2"}query_string = urllib.parse.urlencode(params) # 输出: key1=value1&key2=value2数据读取
read():返回二进制格式的响应内容(需解码为字符串)。
readlines():按行读取二进制数据。
示例:
binary_data = response.read()text_data = binary_data.decode("utf-8") # 转为字符串元信息获取
geturl():获取最终响应的URL(可能重定向)。
getheaders():返回头部信息列表(含元组),可通过dict()转为字典。
getcode():获取HTTP状态码(如200、404)。
示例:
headers_dict = dict(response.getheaders())status_code = response.getcode()请求头模拟
必须设置User-Agent,避免使用默认值(易被识别为爬虫)。
慎用字段:
Accept-encoding: gzip, deflate(可能引发解压错误)。
Content-length(由服务器自动处理,手动设置易出错)。
高级需求限制
urlopen()和Request()无法直接设置代理或Cookie,需通过Handler或第三方库(如requests)实现。
XML与JSON对比
XML:标签自定义,用于数据传输(如配置文件)。
JSON:轻量级,主流数据交换格式(推荐优先使用)。
XPath基础
安装:pip install lxml。
节点类型:元素、属性、文本(常用)。
路径表达式:
/:根节点。
//:任意位置匹配。
@:按属性选择(如//div[@class="header"])。
函数:
contains(attribute, "str"):属性包含指定字符串。
starts-with(attribute, "str"):属性以指定字符串开头。
使用方式
本地文件:etree.parse(filename)。
网络文件:etree.HTML(url_string)。
提取数据:
from lxml import etreehtml = etree.HTML("<div><a href='/link'>Text</a></div>")links = html.xpath("//a/@href") # 提取所有a标签的href属性texts = html.xpath("//a/text()") # 提取所有a标签的文本编码错误
确保响应内容解码时使用正确编码(如utf-8)。
示例:
text = response.read().decode("utf-8", errors="ignore") # 忽略错误字符网络请求失败
检查代理设置、请求头完整性及URL有效性。
使用try-except捕获异常(如URLError、HTTPError)。
总结:urllib是Python爬虫的基础库,适合简单请求与URL处理。对于复杂需求(如代理、Cookie、JSON解析),建议结合requests、BeautifulSoup或Scrapy等库使用。