Urllib和Urllib2是python2中提供的一个用于操作url的模块,但是提供了不同的功能。
在python2中,有urllib库和urllib2库。在python3中,urllib2被合并到urllib库中,在我们爬取网页的时候,经常用到这个库。
但是urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这就是为何urllib常和urllib2一起使用的原因,如下:
postdata = urllib.urlencode(postdata)(把字典形式的postdata编码一下)
应用场景:一部分网页为了防止别人恶意采集其信息所以进行了一些反爬虫的设置。
解决办法:设置一些Headers信息(User-Agent),模拟成浏览器去访问这些网站。
import urllib.request import urllib.parse url = 'http://www.baidu.com' header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36' } request = urllib.request.Request(url, headers=header) reponse = urllib.request.urlopen(request).read() fhandle = open("./baidu.html", "wb") fhandle.write(reponse) fhandle.close()应用场景:使用同一个IP去爬取同一个网站上的网页,久了之后会被该网站服务器屏蔽。
解决办法:使用代理服务器。 (使用代理服务器去爬取某个网站的内容的时候,在对方的网站上,显示的不是我们真实的IP地址,而是代理服务器的IP地址)。
def use_proxy(proxy_addr,url): import urllib.request proxy=urllib.request.ProxyHandler({'http':proxy_addr}) opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler) urllib.request.install_opener(opener) data=urllib.request.urlopen(url).read().decode('utf8') return data proxy_addr='61.163.39.70:9999' data=use_proxy(proxy_addr,'http://www.baidu.com') print(len(data))应用场景:HTTPS是无连接的状态协议,但是客户端和服务器端需要保持一些互相信息,比如cookie,有了cookie,服务器才知道刚才是这个用户登录了网站,才会给予客户端访问一些页面的权限。所以我们需要保存cookie,之后附带cookie再来访问网站,才能达到效果。这里就需要Python的cookie和urllib2等的配合,将cookielib绑定到urllib2在一起,就能够在请求网页的时候附带cookie。在构造req请求之前可以获取一个保存cookies的对象,并把该对象和http处理器、http的handler资源以及urllib3的对象绑定在一起。
cj = cookielib.LWPCookieJar() cookie_support = urllib2.HTTPCookieProcessor(cj) # 创建一个opener,将保存了cookie的http处理器,还有设置一个handler用于处理http的URL的打开 opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) # 将包含了cookie、http处理器、http的handler的资源和urllib2对象板顶在一起 urllib2.install_opener(opener)其主要功能为:
国际化域名和URLsKeep-Alive&连接池持久的Cookie会话类浏览器的SSL加密认证基本/摘要式的身份认证优雅的键/值 Cookies自动解压Unicode编码的响应体多段文件上传连接超时支持.netrc适用于Python 2.6-3.4线程安全
