Python爬虫学习(三)urllib进阶使用
urllib中包括了四个模块:
-
urllib.request
可以用来发送request和获取request的结果 -
urllib.error
包含了urllib.request
产生的异常 -
urllib.parse
用来解析和处理URL -
urllib.robotparse
用来解析页面的robots.txt文件
上节,我们已经初步试用了urllib,本节再补充一些知识,如果你想更加了解这个库,当然推荐阅读官方文档哦。
在之前内容中,我们只涉及一些相对简单的操作,但是现实操作中,可能会有更高要求的使用,比如Cookies处理,代理设置等等,我们该怎么办呢?
代理设置
爬虫固然很好用,但是一般网站都会采取一些反爬措施,这时候就有必要了解一下代理了,HTTP协议(三)之代理。
了解了基本原理后,我们就直接上代码
from urllib.request import ProxyHandler, build_opener
proxy_handler = ProxyHandler({
'http': 'http://122.72.32.74:80',
})
opener = build_opener(proxy_handler)
response = opener.open('http://www.baidu.com')
print(response.read())
我们在:http://www.xicidaili.com/ 找个可用的代理
然后,使用ProxyHandler
生成一个代理处理器,在处理器的基础上新建一个Opener
,使用opener的open
方法发送一个请求,和之前使用的 urlopen
方法类似。
于是,我们同样可以得到:
如果你的IP被某个网站封了,不妨采用这种方法再试试!
Cookies
import http.cookiejar, urllib.request
cookies = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookies)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for cookie in cookie:
print(cookie.name + "="+ cookie.value)
首先声明一个CookieJar对象,接下来我们就需要利用HTTPCookieProcessor来构建一个handler,最后利用build_opener()方法构建出opener,执行open()函数。
执行结果如下:
输出了Cookies.
关于urllib.request模块的更多内容,可以查看:https://docs.python.org/3.6/library/urllib.request.html#module-urllib.request
异常处理
URLError
通常引起URLError的原因是:无网络连接(没有到目标服务器的路由)、访问的目标服务器不存在。在这种情况下,异常对象会有reason属性(是一个(错误码、错误原因)的元组)。
import urllib.request
import urllib.error
try:
response = urllib.request.urlopen('http://nd.com') # 不存在
except urllib.error.URLError as e:
print(e.reason)
else:
html = response.read().decode('utf-8')
print(html)
捕获到了错误:
HTTPError
每一个从服务器返回的HTTP响应都有一个状态码。其中,有的状态码表示服务器不能完成相应的请求,默认的处理程序可以为我们处理一些这样的状态码(如返回的响应是重定向,urllib会自动为我们从重定向后的页面中获取信息)。有些状态码,urllib模块不能帮我们处理,那么urlopen函数就会引起HTTPError异常,其中典型的有404/401。
HTTPError异常的实例有整数类型的code属性,表示服务器返回的错误状态码。
urllib模块默认的处理程序可以处理重定向(状态码是300范围),而且状态码在100-299范围内表示成功。因此,能够引起HTTPError异常的状态码范围是:400-599.
当引起错误时,服务器会返回HTTP错误码和错误页面。你可以将HTTPError实例作为返回页面,这意味着,HTTPError实例不仅有code属性,还有read、geturl、info等方法。
至于urllib.parse
模块,推荐大家自己去看。
以上。