爬虫请求模块
2019-06-10 本文已影响0人
遇明不散
爬虫请求模块
版本
- python2:urllib2、urllib
常用方法
向网站发起一个请求并获取响应
# 向网站发起一个请求并获取响应
urllib.request.urlopen("网址")
# 示例:获取百度的网页源代码
response = urllib.request.urlopen('http://www.baidu.com/')
# 字节流
html = response.read()
# 字符串
html = response.read().decode("utf-8")
print(html)
重构User-Agent
# User-Agent是爬虫和反爬虫斗争的第一步,发送请求必须带User-Agent
urllib.request.Request("网址",headers="字典")
- 利用
Request()
方法构建请求对象 - 利用
urlopen()
方法获取响应对象 - 利用响应对象的
read().decode("utf-8")
获取内容
import urllib.request
url = "http://www.baidu.com/"
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"}
# 创建请求对象
req = urllib.request.Request(url,headers=headers)
# 获取响应对象
res = urllib.request.urlopen(req)
# 响应对象read()
html = res.read().decode('utf-8')
print(html)
响应对象方法
# 读取服务器响应的内容
read()
# 返回HTTP的响应码
getcode()
# 返回实际数据的URL(防止重定向问题)
geturl()
urllib.parse模块
# 给字典进行编码
urllib.parse.urlencode(字典)
# 给字符串进行编码
urllib.parse.quote(字符串)
示例
import urllib.request
import urllib.parse
baseurl = "http://www.baidu.com/s?wd="
key = input("请输入要搜索的内容:")
# 对关键字进行urlencode()编码
# wd = {"wd":key}
# key = urllib.parse.urlencode(wd)
# 用quote()编码
key = urllib.parse.quote(key)
# 拼接地址
url = baseurl + key
headers = {"User-Agent":"Mozilla/5.0"}
# 创建请求对象
req = urllib.request.Request(url,headers=headers)
# 获取响应对象
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
# 将结果保存到本地
with open("result1.html","w",encoding="utf-8") as f:
f.write(html)
urllib.request中Handler处理器
自定义的urlopen()
方法,urlopen()
方法是一个特殊的opener
(模块已定义好),不支持代理等功能,通过Handler
处理器对象来自定义opener
对象
# 创建opener对象
build_opener(Handler处理器对象)
opener.open(url,参数)
Handler处理器分类
# 没有任何特殊功能
HTTPHandler()
# 普通代理
ProxyHandler(普通代理) # {"协议":"IP地址:端口号"}
# 私密代理
ProxyBasicAuthHandler(密码管理器对象)
# web客户端认证
HTTPBasicAuthHandler(密码管理器对象)
密码管理器对象作用
# 创建密码管理器对象
pwdmg = urllib.request.HTTPPasswordMgrWithDefaultRealm()
# 把认证信息添加到密码管理器对象
pwdmg.add_password(None,webserver,user,passwd)
# 创建Handler处理器对象
示例
# 创建相关的Handler处理器对象
http_handler = urllib.request.HTTPHandler()
# 创建自定义opener对象
opener = urllib.request.build_opener(http_handler)
# 利用opener对象打开url
req = urllib.request.Request(url,headers=headers)
res = opener.open(req)
请求方式及实例
GET
查询参数在URL地址中显示
POST
# 在Request方法中添加data参数
urllib.request.Request(url,data=data,headers=headers)
# 表单数据以bytes类型提交,不能是str
data = {....}
data = urlencode(data) # 字符串
data = bytes(data,"utf-8") # 字符串 -> 字节流
data.encode("utf-8")
Cookie模拟登陆
HTTP是一种无连接协议,客户端和服务器交互仅仅限于 请求/响应过程,结束后断开,下一次请求时,服务器会认为是一个新的客户端,为了维护他们之间的连接,让服务器知道这是前一个用户发起的请求,必须在一个地方保存客户端信息。
- cookie:通过在客户端记录的信息确定用户身份
- session:通过在服务端记录的信息确定用户身份
# 1.通过抓包工具、F12获取到cookie(先登陆1次网站)
# 2.正常发请求