- 一、Handler处理器和自定义Opener
- 1 opener是 urllib.request.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构建好的)。
- urllib.request.urlopen()函数不支持验证、cookie或者其它HTTP高级功能。要支持这些功能,必须使用build_opener()函数创建自定义Opener对象:
- build_opener ()返回的对象具有open()方法与urlopen()函数的功能相同。
- 1)使用相关的 Handler处理器 来创建特定功能的处理器对象;
- 2)然后通过 urllib.request.build_opener()方法使用这些处理器对象,创建自定义opener对象;
- 3)使用自定义的opener对象,调用open()方法发送请求。
- build_opener(handler) 参数handler是Handler实例,常用的有HTTPBasicAuthHandler、HTTPCookieProcessor、ProxyHandler等。
- 2.简单的自定义opener()
- from urllib.request import HTTPHandler,Request,build_opener
- # 构建一个HTTPHandler 处理器对象,支持处理HTTP请求
- http_handler = HTTPHandler()
- opener = build_opener(http_handler)
- # 构建 Request请求
- request = Request("http://baidu.com/")
- # 调用自定义opener对象的open()方法,发送request请求
- response = opener.open(request)
- # 获取服务器响应内容
- print(response.read().decode("utf-8"))
- 如果在 HTTPHandler()增加 debuglevel=1参数,还会将 Debug Log 打开,这样程序在执行的时候,会把收包和发包的报头在屏幕上自动打印出来,方便调试
- https和http使用不同的Handler https使用HTTPSHandler
- 3.代理设置
- 使用代理IP,这是爬虫/反爬虫的第二大招,通常也是最好用的。很多网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。
- 所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
- from urllib.request import ProxyHandler,build_opener,Request
- # 构建了两个代理Handler,一个有代理IP,一个没有代理IP
- httpproxy_handler = ProxyHandler({"http" : "119.28.152.208:80"})
- nullproxy_handler = ProxyHandler({})
- proxySwitch = True #定义一个代理开关
- # 通过 urllib.build_opener()方法使用这些代理Handler对象,创建自定义opener对象# 根据代理开关是否打开,使用不同的代理模式
- if proxySwitch:
- opener = build_opener(httpproxy_handler)
- else:
- opener = build_opener(nullproxy_handler)
- request = Request("http://www.baidu.com/")
- response = opener.open(request)
- print(response.read().decode("utf-8"))
- 随机代理ip 免费代理ip 可以在代理网站上获取
- # 随机选择一个代理
- proxy_list = [
- {"http" : "122.72.18.35:80"},
- {"http" : "122.72.18.34:80"},
- {"http" : "203.174.112.13:3128"},
- ]
- proxy = random.choice(proxy_list)
- httpproxy_handler = ProxyHandler(proxy)
- proxy_list = [
- 私密代理(付费的)
- proxy = {'http': '用户名:密码@ip:端口'}
- 4.ProxyBasicAuthHandler() 验证代理服务器授权的用户名和密码
- from urllib.request import Request,build_opener,HTTPPasswordMgrWithDefaultRealm,ProxyBasicAuthHandler
- passwdmgr = HTTPPasswordMgrWithDefaultRealm()
- passwdmgr.add_password(None, ip:端口, 用户名, 密码)
- proxyauth_handler = ProxyBasicAuthHandler(passwdmgr)
- .....
- 5.Cookie
- Cookie 是在 HTTP 协议下,服务器或脚本可以维护客户工作站上信息的一种方式。Cookie 是由 Web 服务器保存在用户浏览器(客户端)上的小文本文件,它可以包含有关用户的信息。无论何时用户链接到服务器,Web 站点都可以访问 Cookie 信息。
- 目前有些 Cookie 是临时的,有些则是持续的。临时的 Cookie 只在浏览器上保存一段规定的时间,一旦超过规定的时间,该 Cookie 就会被系统清除
- 1.在浏览器中登录京东后,复制浏览器的请求头信息
- 2.通过代码Request 添加请求头信息(除去"Accept-Encoding",和第一行),就可以通过代码查看登录后的页面
- 6.cookielib库 和 HTTPCookieProcessor处理器
- from urllib.request import HTTPCookieProcessor,build_opener
- from http.cookiejar import CookieJar,MozillaCookieJar
- # 构建一个CookieJar对象实例来保存cookie
- cookiejar = CookieJar()
- # 使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
- handler = HTTPCookieProcessor(cookiejar=cookiejar)
- # 通过 build_opener() 来构建opener
- opener = build_opener(handler)
- # 以open方法访问页面,访问之后会自动保存cookie到cookiejar中
- response = opener.open("http://www.baidu.com/")
- print("response==",response.read())
- # 可以按标准格式将保存的Cookie打印出来,最后没有分号
- cookie_str = ""
- for item in cookiejar:
- cookie_str = cookie_str +item.name+"="+item.value+";"
- cookie_str = cookie_str[:-1]#把最后一个分好干掉
- print(cookie_str)
- 我们使用以上方法将Cookie保存到cookiejar对象中,然后打印出了cookie中的值,也就是访问百度首页的Cookie值。
- 保存cookie 信息到文件
- filename = 'cookie.txt'
- cookiejar = MozillaCookieJar(filename)
- handler = HTTPCookieProcessor(cookiejar=cookiejar)
- opener = build_opener(handler)
- response = opener.open("http://www.baidu.com/")
- print("response==",response.read())
- cookiejar.save() 保存cookie 到 cookie.txt 中
- 使用本地文件cookie信息访问网站
- cookiejar = MozillaCookieJar()
- # 从文件中读取cookie内容到变量
- cookiejar.load('cookie.txt')
- handler = HTTPCookieProcessor(cookiejar=cookiejar)
- opener = build_opener(handler)
- response = opener.open("http://www.baidu.com/")
- print("response==",response.read())
- 1 opener是 urllib.request.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构建好的)。
- 二、URLError,HTTPError
- from urllib.request import Request,urlopen,HTTPError,URLError
- try:
- requset = Request('http://192.168.31.124:8080')
- respose = urlopen(requset)
- #捕获HTTPError ,由于HTTPError的父类是URLError,所以父类的异常应当写到子类异常的后面
- except HTTPError as e:
- print("捕获HTTPError异常e.code==", e.code) #HTTPError是URLError的子类,我们发出一个请求时,服务器上都会对应一个response应答对象,其中它包含一个数字"响应状态码"。
- print("捕获HTTPError异常e==",e)
- except URLError as e:
- print("捕获URLError异常e==", e)
- else:
- print(respose.read())
- print("两个错误的没有出现,正常执行")
- URLError 产生的原因主要有:
- 1、没有网络连接
- 2、服务器连接失败
- 3、找不到指定的服务器
网络爬虫 Handler处理器和自定义Opener,URLError和HTTPError
最新推荐文章于 2023-07-15 20:13:37 发布