1、urllib和urllib2库在python2中的使用
Urllib和Urllib2是python2中提供的一个用于操作url的模块,但是提供了不同的功能。
在python2中,有urllib库和urllib2库。在python3中,urllib2被合并到urllib库中,在我们爬取网页的时候,经常用到这个库。
1.1 urllib2可以接受一个Request类的实例来设置URL请求的headers
代码如下:
req = urllib2.Request(
url = url,
data = postdata,
headers = headers
)
result = urllib2.urlopen(req)
1.2 urillb仅可以接受url,这意味着,不可以伪装自己的User Agent字符串等。
但是urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这就是为何urllib常和urllib2一起使用的原因,如下:
postdata = urllib.urlencode(postdata)
(把字典形式的postdata编码一下)
2、urllib库在python3中的使用
2.1 urillb2在python3中的变化。
- 在Pytho2.x中使用
import urllib2
——-对应的,在Python3.x中会使用import urllib.request
,urllib.error
。 - 在Pytho2.x中使用
import urllib
——-对应的,在Python3.x中会使用import urllib.request
,urllib.error
,urllib.parse
- 在Pytho2.x中使用
import urlparse
——-对应的,在Python3.x中会使用import urllib.parse
。 - 在Pytho2.x中使用
import urlopen
——-对应的,在Python3.x中会使用import urllib.request.urlopen
。 - 在Pytho2.x中使用
import urlencode
——-对应的,在Python3.x中会使用import urllib.parse.urlencode
。 - 在Pytho2.x中使用
import urllib.quote
——-对应的,在Python3.x中会使用import urllib.request.quote
。 - 在Pytho2.x中使用
cookielib.CookieJar
——-对应的,在Python3.x中会使用http.CookieJar
。 - 在Pytho2.x中使用
urllib2.Request
——-对应的,在Python3.x中会使用urllib.request.Request
。
2.2 urillb在python3中的使用。
2.2.1 快速抓取一个网页
import urllib.request
file=urllib.request.urlopen('http://www.baidu.com')
data=file.read() #读取全部
dataline=file.readline() #读取一行内容
fhandle=open("./1.html","wb") #将爬取的网页保存在本地
fhandle.write(data)
fhandle.close()
2.2.2 浏览器的模拟
应用场景:一部分网页为了防止别人恶意采集其信息所以进行了一些反爬虫的设置。
解决办法:设置一些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()
2.2.2 代理服务器的设置
应用场景:使用同一个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))
2.2.3 Cookie的使用
应用场景: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)
3、除了使用官方标准版的urllib,我们可以使用更好的第三方模块,如requests
其主要功能为:
- 国际化域名和URLs
- Keep-Alive&连接池
- 持久的Cookie会话
- 类浏览器的SSL加密认证
- 基本/摘要式的身份认证
- 优雅的键/值 Cookies
- 自动解压
- Unicode编码的响应体
- 多段文件上传
- 连接超时
- 支持.netrc
- 适用于Python 2.6-3.4
- 线程安全