- ProxyHandler处理器(代理设置)
很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP访问。我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP进行爬取。通过ProxyHandler
设置使用代理服务器。
例:使用自定义opener使用代理
http://httpbin.org :这个网站可以方便的查看http请求的一些参数
from urllib import request
# 没有使用代理
# resp = request.urlopen("http://httpbin.org/get")
# print(resp.read().decode("utf-8"))
# 使用代理
# 1.使用ProxyHandler,传入代理,构建一个handler
handler = request.ProxyHandler({"http":"218.66.161.88:31769"})
# 2.使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
req = request.Request("http://httpbin.org/ip")
# 3.使用opener去发送请求
resp = opener.open(req)
print(resp.read())
常用代理
- cookie
http请求是无状态的,第一次和服务器连接并且登录成功后,第二次请求服务器不能知道当前请求是哪个用户。cookie
出现就是为了解决这个问题,第一次登录后服务器返回一些数据(cookie)给浏览器,浏览器保存在本地,当用户发送第二次请求的时候,就会自动把上次请求存储的cookie
数据自动携带给服务器,服务器通过浏览器携带的数据就能判断当前用户是哪个。cookie
存储的数据量有限,不同浏览器有不同的存储大小,但一般不超过4KB。因此,使用cookie可以存储一些小量的数据。 - 使用cookielib库和HttpCookieProcessor模拟登录
- 使用浏览器访问,将cookie信息赋值下来,放到headers中
from urllib import request # url为一个需要登录访问的网页 url = "" headers = { 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36", "Cookie":"" } req = request.Request(url=url, headers=headers) resp = request.urlopen(req) print(resp.read().decode('utf-8'))
- http.cookiejar模块
主要的类有CookieJar,FileCookieJar,MozillaCookie.jar,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,police=None):从FileCookieJar派生而来,创建与Mozilla浏览器cookies.txt兼容的FileCookieJar实例。
- LWPCookieJar(filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-per标准的Set-Cookie3文件格式兼容的FileCookieJar实例。
利用http.cookiejar
和request.HTTPCookieProcessor
登录人人网。相关示例代码如下:
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/75.0.3770.100 Safari/537.36"}
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发送登录的请求(账号密码)
data = {
'email': "",
'password': ""
}
login_url = ""
req = request.Request(login_url, data=parse.urlencode(data).encode('utf-8'), headers=headers)
opener.open(req)
def visit_profile(opener):
# 2. 访问个人主页
url = ""
# 获取个人主页的页面的时候,不要新建一个opener,而应该使用之前的opener,因为之前的opener已经包含了登录需要的信息
req = request.Request(url, headers=headers)
resp = opener.open(req)
print(resp.read())