目录
一:ProxyHandler处理器(代理设置)
许多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数过多,就会禁用这个iP,我们可以设置一些代理服务器,每隔一段时间换一个IP,就算IP被禁止,也可以换一个IP。
urllib中通过ProxyHandler来设置使用代理服务器,下面代码说明如何使用自定义opener来使用代理。
我们使用httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。
我们直接访问这个http://httpbin.org/ip页面会返回一个ip这个ip地址就是我们本机在外网中的地址。
我们使用代码设置代理的方式来访问看怎么做。
from urllib import request
url="http://httpbin.org/ip"
#不使用代理
res= request.urlopen(url)
print("代理之前",res.read())
#使用代理
#1:使用ProxyHandler,传入代理,得到代理handler
#handler=request.ProxyHandler({"http":"223.241.78.43:8010"})
#2:使用上面的handler创建一个opener
#opener=request.build_opener(handler)
#3:使用自定义的opener发起请求
#使用代理
#1使用ProxyHandler,传入代理构建一个handler
handler= request.ProxyHandler({"http":"113.195.200.33:9999"})
#2使用上面创建的handler构建一个opener
opener=request.build_opener(handler)
#3使用opener发送一个请求
req = request.Request('https://blog.csdn.net/A7_A8_A9/article/details/107299437')
resp=opener.open(req)
print(resp.read().decode("utf-8"))
这里设置代理之后我请求自己的博客,因为请求: http://httpbin.org/ip一直报如下错误:
File "D:\Python\python-3.8\lib\urllib\request.py", line 1322, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。>
没有得到解决。后续了解的更多的话再来解决。如果某位大佬看到知道如何解决请指点一二。
二:cookie设置自动登陆
在网站中,http是无状态的。也就是说即使第一次和服务器链接并登陆成功之后,第二次访问服务器,服务器仍不知道当前用户是哪一个,cookie的出现就是为了解决这个问题的。第一次登陆服务器返回一些(cookie)数据给浏览器,然后浏览器保存在本地,当该用户发送第二次发送请求给服务器的时候,就携带此cookie,这样服务器就知道是那个用户了。
Cookie的格式:
Set-Cookie: NAME=VALUE; Expires/Max-age=DATE; Path=PATH; Domain=DOMAIN_NAME; SECURE
参数意义:
NAME:cookie的名字。
VALUE:cookie的值。
Expres: cookie的过期时间。
Path:cookie作用的路径。
Domain: cookie作用的域名。
SECURE:是否在https协议下作用。
使用cookielib库和HTTPCookieProcessor模拟登陆:
我们以人人网为例,如果我们直接访问人人网,如果之前没有登陆过,肯定让我们先进行登陆。比如如下代码:
from urllib import request
url="http://www.renren.com/332038891/profile"
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}
req=request.Request(url,headers=header)
resStr=request.urlopen(req)
#print(resStr.read().decode("utf-8"))
with open("index.html","w",encoding="utf-8") as fp:
#write写入的必须是str类型的,而resStr是字节byte
#byte->decode->str
#str->encode->byte
fp.write(resStr.read().decode("utf-8"))
我们看生成的index.html如下:
设置cookie信息
登陆访问个人照片墙代码如下:
from urllib import request
from urllib import parse
from http.cookiejar import CookieJar
def get_opener():
# 1.登陆
#1.1 创建一个cookiejar对象
cookiejar=CookieJar()
#1.2 使用cookiejar创建一个HTTPCOOKIEProcess对象
handler=request.HTTPCookieProcessor(cookiejar)
#1.3 使用上一步的handler创建一个opener
opener=request.build_opener(handler)
return opener
def login(opener):
#1.4使用opener发送登陆的请求(人人网的邮箱和密码)
header={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"}
data={"email":"18238903856","password":"*****94"}
login_url="http://www.renren.com/PLogin.do"
req=request.Request(login_url,data=parse.urlencode(data).encode("utf-8"),headers=header)
opener.open(req)
def access_picturewall(opener):
#2.访问主页
#获取个人主页的页面时候不要新创建一个opener,还使用上面的那个,因为那个里面包含了cookie
#个人照片墙地址
picture_url="http://www.renren.com/974784400/newsfeed/photo"
resp=opener.open(picture_url)
with open("pciture.html","w", encoding="utf-8") as fp:
fp.write(resp.read().decode("utf-8"))
if __name__ == '__main__':
opener=get_opener()
login(opener)
access_picturewall(opener)
密码我就不明示了,这样就可以访问到照片墙,虽然我的照片墙啥也没有,如下:
三:cookie保存到本地
from urllib import request
from http.cookiejar import MozillaCookieJar
#1.使用MozillaCookieJar可以把cookie保存到本地,参数为保存的文件名
cookiejar= MozillaCookieJar("cookie.txt")
#2.创建handler
handler= request.HTTPCookieProcessor(cookiejar=cookiejar)
#3.构建opener
opener= request.build_opener(handler)
#4.发起请求
opener.open("https://blog.csdn.net/A7_A8_A9/article/details/107299437")
#5.保存cookie,ignore_discard=True表示即使cookie过期了也要保存下来
cookiejar.save(ignore_discard=True)
保存内容如下:
有保存,就有读取。读取操作如下:
from urllib import request
from http.cookiejar import MozillaCookieJar
#指定加载的文件
cookiejar=MozillaCookieJar("cookie.txt")
#如果创建cookiejar的时候不指定文件,load的时候也可以指定,ignore_discard=True参数和保存的时候参数一样
#过期的cookie是否加载进来
cookiejar.load(ignore_discard=True)
handler=request.HTTPCookieProcessor(cookiejar)
opener= request.build_opener(handler)
opener.open("http://www.baidu.com")
for cookie in cookiejar:
print(cookie)
看到打印的cookie,不仅有文件里面的cookie信息,还有请求百度返回的cookie信息,说明正常加载。这样我们后面可以把登陆的cookie保存本地,下次直接读取文件中的cookie,就不用再登陆了。