handler、opener、request
urllib2.urlopen()
urllib.request.urlopen() 这个不能构建请求头
res = urllib.request.Request(url,headers=headers)
response = urllib.request.urlopen(res)
print(response.read().decode())
handler、opener
urllib.request.urlopen() 这个不能构建请求头
于是引入了 res = urllib.request.Request(url,headers=headers) 构建请求对象
但是urllib.request.Request 不能携带cookie 而且不能使用代理 所以引入 Handler 处理器 自定义opener对象
流程:
1.构建 HttpHandler 对象 支持http https
HttpHandler 支持http
HttpsHandler 支持 https
2.调用 builder_opener() 来使用上面的对象 创建打开对象
3.调用上面对象的open() 来代替之前的 urlopen()
import urllib.request
#创建处理器对象
http = urllib.request.HTTPHandler()#z这个是支持http的
#https = urllib.request.HTTPSHandler()#z这个是支持http的
#调用方法使用这个对象 创建打开器对象
opener = urllib.request.build_opener(http)
#打开url
# response = opener.open("http://www.baidu.com/")
# # print(response.read().decode())
#创建 全局打开器
urllib.request.install_opener(opener) #使用了全局打开器 后面的urlopen 也会使用
response = urllib.request.urlopen("http://www.ifeng.com/")
print(response.read().decode())
在处理器HTTPHandler、HTTPSHandler里边加上debuglevel=1 会开启 debug log日志 会在终端打印 受包发包的header 头 这样会省去抓包的操作
Cookie 本身就是文件
pv page view
uv user visitor 以cookie 为区分
Cookie 是指某些网站服务器为了辨别用户身份和进行Session跟踪,而储存在用户浏览器上的文本文件,Cookie可以保持登录信息到用户下次与服务器的会话。
Cookie原理
HTTP是无状态的协议, 为了保持连接状态, 引入了Cookie机制 Cookie是http消息头中的一种属性,包括:
Cookie名字(Name)
Cookie的值(Value)
Cookie的过期时间(Expires/Max-Age)
Cookie作用路径(Path)
Cookie所在域名(Domain),
使用Cookie进行安全连接(Secure)。
前两个参数是Cookie应用的必要条件,另外,还包括Cookie大小(Size,不同浏览器对Cookie个数及大小限制是有差异的)。cookie最大不超过4k
Cookie由变量名和值组成,根据 Netscape公司的规定,Cookie格式如下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
Cookie应用
Cookies在爬虫方面最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续。 爬取信息的过程中 绕过登陆
cookielib库 和 HTTPCookieProcessor处理器
在Python处理Cookie,一般是通过cookielib模块和 urllib2模块的HTTPCookieProcessor处理器类一起使用。
cookielib模块:主要作用是提供用于 存储cookie的对象
HTTPCookieProcessor处理器:主要作用是处理这些cookie对象,并构建handler对象。
cookielib 库
该模块主要的对象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()
模拟登陆 qq空间
import urllib.request
http = urllib.request.HTTPHandler(debuglevel=1)#z这个是支持http的
#https = urllib.request.HTTPSHandler()#z这个是支持http的
#调用方法使用这个对象 创建打开器对象
opener = urllib.request.build_opener(http)
headers = {
"Cookie":"pgv_pvid=5146724799; AMCV_248F210755B762187F000101%40AdobeOrg=-1891778711%7CMCIDTS%7C17761%7CMCMID%7C71991122967003593260888412583202511071%7CMCAAMLH-1535104600%7C11%7CMCAAMB-1535104600%7CRKhpRz8krg2tLO6pguXWp5olkAcUniQYPHaMWWgdJ3xzPWQmdj0y%7CMCOPTOUT-1534507000s%7CNONE%7CMCAID%7CNONE%7CMCSYNCSOP%7C411-17768%7CvVersion%7C2.4.0; pgv_pvi=6441753600; RK=iORgFZkhkT; ptcz=50a7d664f0d2587d5cf3524469b873afbeef308c52bf29456c46be6ead1c1b7a; o_cookie=2287228249; ptui_loginuin=2287228249; qz_screen=1440x900; QZ_FE_WEBP_SUPPORT=1; cpu_performance_v8=6; __Q_w_s__QZN_TodoMsgCnt=1; pgv_si=s3102401536; _qpsvr_localtk=0.8959738178804983; ptisp=ctc; pgv_info=ssid=s7595278691; uin=o2287228249; skey=@xIp1fyofJ; p_uin=o2287228249; pt4_token=ck7T7G10Qf7TV-eMDd-pnC1OP5R6XGKeM0UpqAJfxV4_; p_skey=U4BbP1qlJgmXueZ6gQjjrVeZ3XJ*cWdLUlw*eLdg3vA_; Loading=Yes; x-stgw-ssl-info=36feb41d19b5baab0be6eced113003b3|0.102|1554174772.492|1|.|Y|TLSv1.2|ECDHE-RSA-AES128-GCM-SHA256|14000|h2|0",
"User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
url = "https://user.qzone.qq.com/2287228249"
req = urllib.request.Request(url,headers=headers)
response = opener.open(req)
print(response.read().decode())
模拟weibo.cn登陆
import urllib.request
import http.cookiejar
import urllib.parse
#创建 cookiejar对象
cookie = http.cookiejar.CookieJar()
#创建处理器对象
handler = urllib.request.HTTPCookieProcessor(cookie)
#根据处理器对象 创建打开对象
opener = urllib.request.build_opener(handler)
#这里通过代码 模拟登陆
post_url = "https://passport.weibo.cn/signin/login"
data = {
"username":"17701256561",
"password":"lizhibin666",
"savestate":1,
"r":"https://weibo.cn/",
"ec":0,
"entry":"mweibo",
"mainpageflag":1,
"client_id":"",
"code":"",
"qq":"",
"hff":"",
"hfp":"",
"wentry":"",
"loginfrom":"",
"pagerefer":"",
}
data = urllib.parse.urlencode(data).encode('utf-8')
headers = {
"Origin": "https://passport.weibo.cn",
"Accept": "*/*",
"Content-Type": "application/x-www-form-urlencoded",
"Connection": "keep-alive",
"Host": "passport.weibo.cn",
"Accept-Language": "zh-CN,zh;q=0.9",
"Referer":"https://passport.weibo.cn/signin/login?entry=mweibo&r=https%3A%2F%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt=",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
#构建请求对象
req = urllib.request.Request(url=post_url,headers=headers,data=data)
#发送请求
#这里 opener 保存了登陆之后的cookie 信息
response = opener.open(req)
print(response.read().decode('gb2312'))
url = "https://weibo.cn/6388179289/info"
headers1 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
reqs = urllib.request.Request(url=url,headers=headers1)
#发送请求
#这里 opener 保存了登陆之后的cookie 信息
responses = opener.open(reqs)
#print(responses.read().decode('gb2312'))
练习 模拟登陆人人网
http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=2019321457754
data = {
captcha_type
username
password
....
}
opener.open(req)
url = "个人主页的时候 "
opener.open(req) 这里保存了我们的cookie信息
打印我们的页面内容
下载 cookie
import urllib.request
from http import cookiejar
#创建文件 保存cookie
filename = "baidu.txt"
#创建cookiejar对象 跟文件交互 一般用LWPCookieJar
cookie = cookiejar.LWPCookieJar(filename=filename)
#创建cookie 处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
#创建打开器
opener= urllib.request.build_opener(handler)
headers = {
"User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
url = "http://www.baidu.com/"
req = urllib.request.Request(url=url,headers=headers)
response = opener.open(req)
print(response)
print(cookie)
cookie.save()
加载本地cookie
import urllib.request
from http import cookiejar
#创建cookiejar对象 跟文件交互 一般用LWPCookieJar
cookie = cookiejar.LWPCookieJar()
#加载本地的cookie
cookie.load(filename="baidu.txt")
#创建cookie 处理器
handler = urllib.request.HTTPCookieProcessor(cookie)
#创建打开器
opener= urllib.request.build_opener(handler)
headers = {
"User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
url = "http://www.baidu.com/"
req = urllib.request.Request(url=url,headers=headers)
response = opener.open(req)
print(response.read().decode('utf-8'))
反反爬策略 2 proxyhandler 代理设置
免费的代理
西刺
快代理
proxy360
全网代理IP
代理云
西瓜代理
如果代理足够多 可以形成代理池 可以随机选择 choice
import random
import urllib.request
headers = {
"User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
proxy = {'http':'http://user1:123456@10.20.152.204:808'} #这个通过 代理客户端设置用户名和密码
# ip_list = [
# {'http':'http://116.209.53.191:9999'},
# {'https':'https://221.218.102.146:33323'},
# {'http':'http://183.148.157.128:9999'},
# ]
#这个是设置 user_agent 池
ua_list = [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5"
]
#proxy = random.choice(ip_list)
#设置代理
proxy_handler = urllib.request.ProxyHandler(proxies=proxy)
#创建打开服务器
opener = urllib.request.build_opener(proxy_handler)
url = "http://www.qfedu.com/"
req= urllib.request.Request(url,headers=headers)
req.add_header('User-Agent',random.choice(ua_list))
#print(req.get_header('User-agent'))
response = opener.open(req) #使用代理
print(response.read())
requests 库 让http服务人类
requests库继承了 urllib2 所有特性
支持 http 连接保持 连接池
支持cookie 会话保持
支持文件上传
支持国际化 URL 和POST的编码
底层就是 urllib3
社区活跃 文档齐全 不可多得
http://cn.python-requests.org/zh_CN/latest/ 中文文档
https://github.com/kennethreitz/requests 源码
安装
pip install requests
requests get
import requests
#GET 请求
responses =requests.get('http://www.qfedu.com/')
# print(responses)#<Response [200]>
# print(responses.status_code)#200
# print(responses.url)#http://www.baidu.com
# print(responses.encoding)#编码
# print(responses.cookies)#cookie
# print(responses.text) #字符串
# print(type(responses.text))
# print(responses.content)#响应数据 二进制
# print("*"*20)
# print(responses.content.decode())
headers = {
"User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
params = {
'wd':"岛国教育片"
}
response = requests.get("http://www.baidu.com/s",params=params,headers=headers)
# print(response.content.decode())
print(response.status_code)
requests post
import requests
import json
headers = {
"User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
#translate_o 需要去掉 _o
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
english = "frank"
data = {
"i": english,
"from": "en",
"to": "zh-CHS",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": 15541930622862,
"sign": "f57426a991daf484adf70e8a7d81efca",
"doctype": "json",
"version": 2.1,
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME",
"typoResult": False,
}
response = requests.post(url,data=data,headers=headers)
# json.load(response.text)
dic = response.json()
print(dic)
tgt = dic['translateResult'][0][0]['tgt']
print(tgt)
requests 操作 cookie 和 session
import requests
headers = {
"User-Agent":"User-Agent, Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
}
response = requests.get("http://www.baidu.com/",headers=headers)
print(response.cookies)
#将cookie对象转化成字典
dic = requests.utils.dict_from_cookiejar(response.cookies)
print(dic)
网友评论