一个爬虫的基本功能是读取URL和抓取网页内容,这就需要爬虫具备能够实现HTTP请求的功能。
使用 urllib 3 库实现
生成请求
>>> import urllib3
>>> # 创建 PoolManager 实例
>>> http=urllib3.PoolManager()
>>> # 通过reques函数创建请求,此处使用GET方法
>>> rq=http.request('GET','http://www.baidu.com')
>>> # 查看服务器响应码
>>> print('服务器响应码:',rq.status)
服务器响应码: 200
>>> # 查看相应实体
>>> print('相应实体:',rq.data)
相应实体: b'<!DOCTYPE html><!--STATUS OK-->\r\n<html>\r\n<head>\r\n\t<meta http-equiv="content-type" content="text/html;charset=utf-8">\r\n\t<meta http-equiv="X
注:输出结果太长已省略部分输出内容
请求头处理
>>> ua={'User-Agent':'Mozilla/5.0 (Windows NT 6.1;Win64;x64)Chrome/65.0.3325.181'}
>>> rq=http.request('GET','http://www.baidu.com',headers=ua)
timeout 设置
为防止因为网络不稳定、服务器不稳定等问题造成连接不稳定时的丢包,可以在GET请求中增加timeout参数设置,timeout参数通常为浮点数。
# 方法一:直接在url参数之后添加统一的timeout参数
url='http://www.baidu.com'
rq=http.request('GET',url,timeout=3.0)
# 方法二:分别设置连接与读取的timeout参数
rq=http.request('GET',url,timeout=urllib3.Timeout(connect=1.0,read=3.0))
# 方法三:在POOLManager实例中设置timeout参数
http=urllib3.PoolManager(timeout=4.0)
http=urllib3.PoolManager(timeout=urllib3.Timeout(connect=1.0,read=3.0))
请求重试设置
# 直接在url之后添加retries参数
rq=http.request('GET',url,retries=10)
# 分别设置5次请求重试次数与4次重定向的retries参数
rq=http.request('GET',url,retries=5,redirect=4)
# 同时关闭请求重试与重定向
rq=http.request('GET',url,retries=False)
# 仅关闭重定向
rq=http.request('GET',url,redirect=False)
# 在POOLManager实例中设置retries参数
http=urllib3.PoolManager(retries=5)
生成完整HTTP请求
import urllib3
# 创建 PoolManager 实例
http=urllib3.PoolManager()
# 目标 url
url='http://www.baidu.com'
# 设置请求头,UA信息
ua={'User-Agent':'Mozilla/5.0 (Windows NT 6.1;Win64;x64)Chrome/65.0.3325.181'}
# 设置超时时间
tm=urllib3.Timeout(connect=1.,read=3.0)
# 设置重试次数并生成请求
rq=http.request('GET',url,headers=ua,timeout=tm,retries=5,redirect=4)
# 查看服务器响应码
print('服务器响应码:',rq.status)
# 查看获取的内容
print('获取的内容:',rq.data.decode('utf-8'))
运行结果
服务器响应码: 200
获取的内容: <!DOCTYPE html><!--STATUS OK-->
<html><head><meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><meta name="description"
content="全球最大的中文搜索引擎、致力于让网民更便捷地获取信息,找到所求。百度超过千亿的中文网页数据库,可以瞬间找到相关的搜索结果。">
...........省略