目录
ProxyHandler处理器(代理设置)
代理原理:在请求目的网站之前,先向代理服务器发送请求,代理服务器向目的网站发送请求,代理服务器拿到目的网站的数据之后再转发给我们的代码。
from urllib import request
url="http://httpbin.org/ip"
#使用request.ProxyHandler传入一个代理,为一个字典,字典的key是HTTP或者HTTPS,依赖于代理服务器能##够接收的类型,值是IP+Port
hander=request.ProxyHandler({"HTTP":"171.35.222.87:9999"})
#使用上一步创建的hander,用request.build_opener创建一个opener对象
opener=request.build_opener(hander)
#使用opener.open来发出请求
resp=opener.open(url)
#resp=request.urlopen(url)
print(resp.read())
Cookie
主要是解决爬取需要登录的网站内容的东西之一
实例:爬取人人网,需要先登录,然后寻找Cookie之后
url="http://www.renren.com/974116704/newsfeed/photo"
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36ver",
"Cookie":"anonymid=k8d9ntgz-chlbj3; depovince=HLJ; _r01_=1; ick_login=9b597f59-f7c6-4c67-bd41-5dd6d912dd0c; taihe_bi_sdk_uid=6d875d3a66282173dc97b8e1279ece88; taihe_bi_sdk_session=c1fcbe37d94c6f6fe04b1865243d9ecd; _de=4F52035F7FAC50D09573810E2D51E8D56DEBB8C2103DE356; t=3313ba90a117522e95365655eb151b304; societyguester=3313ba90a117522e95365655eb151b304; id=974116704; xnsid=d8d77737; ver=7.0; loginfrom=null; jebe_key=69ef23b7-8212-4e97-aefd-b649328d9ecd%7Cd7bf2a181c8c14da74b98711ecbe222c%7C1585499903436%7C1%7C1585499902474; wpsid=15826951404051; wp_fold=0; jebecookies=b3652280-54d9-4137-bb9f-00bf4a108d10|||||"}
req=request.Request(url,headers=headers)
resp=request.urlopen(req)
#print(resp.read().decode('utf-8'))
with open('renern.html','w',encoding='utf-8') as fp:
#write函数必须写入一个str的数据类型
#resp.read()读出来的是一个bytes数据类型
#bytes->decode->str
#str->encode->bytes
fp.write(resp.read().decode('utf-8'))
#如果没有Cookie,输出是登陆的界面
#加上了Cookie则为登录之后的页面
实例:爬取人人网,不需要登录,程序自动登录,然后自动寻找Cookie
from urllib import request
from http.cookiejar import CookieJar
from urllib import parse
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36ver"}
def get_opener():
#1.登录
#1.1创建一个cookiejar的对象
cookiejar=CookieJar()
#1.2使用cookiejar创建一个HTTPCookieProcess对像
handers=request.HTTPCookieProcessor(cookiejar)
#1.3使用上一步创建的hander创建一个opener
opener=request.build_opener(handers)
return opener
def log_renern(opener):
data={
"email":"",
"password":""
}
login_url="http://www.renren.com/SysHome.do"
req=request.Request(login_url,data=parse.urlencode(data).encode('utf-8'),headers=headers)
opener.open(req)
def visit_renern(opener):
denglu_url="http://www.renren.com/974116704/newsfeed/photo"
req=request.Request(denglu_url,headers=headers)
#此时的opener 已经包含了cookie信息
resp=opener.open(req)
with open("renern.html",'w',encoding='utf-8') as fp:
fp.write(resp.read().decode('utf-8'))
if __name__=="__main__":
opener=get_opener()
log_renern(opener)
visit_renern(opener)
保存cookie到本地
from http.cookiejar import MozillaCookieJar
from urllib import request
cookiejar=MozillaCookieJar("cookie.txt")
hander=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(hander)
resp=opener.open("http://httpbin.org/cookies/set?course=abc")
cookiejar.save()
cookie.txt里面没有任何内容,因为这个cookie是过期的
from http.cookiejar import MozillaCookieJar
from urllib import request
cookiejar=MozillaCookieJar("cookie.txt")
hander=request.HTTPCookieProcessor(cookiejar)
opener=request.build_opener(hander)
resp=opener.open("http://httpbin.org/cookies/set?course=abc")
cookiejar.save(ignore_discard=True)
从本地加载cookie
cookiejar=MozillaCookieJar("cookie.txt")
cookiejar.load(ignore_discard=True)
# hander=request.HTTPCookieProcessor(cookiejar)
# opener=request.build_opener(hander)
# resp=opener.open("http://httpbin.org/cookies/set?course=abc")
#cookiejar.save(ignore_discard=True)
for cookie in cookiejar:
print(cookie)