urllib.request优缺点
优点
- 将proxy,cookie,重定向等功能做成插件式,并对这些插件排序管理,用于在网络访问时各个功能按次使用
- 集成http、https、ftp等应用层协议
- 默认自动处理 http 300 系列重定向响应
- 采用【connection:close】方式来作为数据接收完成的信号,不再用底层的 http.client 的 【Content-Length】来作为数据接收完成的判断
缺点
- 【connection:close】是把双刃剑,每访问一次,就要建立-关闭一次连接,耗费资源
- 对 http 300 重定向的缺省处理,有时对爬虫来说并不需要重定向操作。如通过响应的报文头中的location便可以获取想要的信息
cookie切换
- 在此,有必要记录一下urllib.request的插件式工作原理。urllib.request发起请求的基础为OpenerDirector,由他管理着一系列插件,如proxyhandler,httpcookieprocessor,httpredirecthandler等,通过openerdirector.add_handler()插入,这些插件都有相应的序号,方便openerdirector按个调用。这些插件都维护着基本格式的方法接口,<protocol>_open(), <protocol>_error_<nnn>(), <protocol>_request(), <protocol>_response() 方法,openerdirector便是找这些插件调用这些方法。如httpredirectorhandler在重定向前需要http_error_30x()重构req以便再次访问
- openerdirector不止维护着一个handlers序列,还维护着四个集合用于后续open处理,分别为hand_open, hand_error process_request, process_response,此四个序列所关联的全是各handler插件
- python原生模块提供对http协议cookie的支持,在 http.cookiejar 中,在urllib.request.HttpCookieProcessor插件中封装cookiejar HTTPCookieProcessor(CookieJar()) ,提供api。
- 要在爬取过程中切换cookie,则只需要在HttpCookieProcessor插件的内置cookiejar实例在一定条件下清空所保存的cookie,该cookiejar便会重新获取cookie用于下次访问
def cookie_switch(self):
if hasattr(self, 'httpCookieProcessor'):
self.cookie_used_times += 1
if self.cookie_used_times > self.max_cookie_used_times+1:
self.httpCookieProcessor.cookiejar.clear