目录
4.1 Urllib库
4.2 快速使用
4.3 模拟浏览器 – Headers 属性
4.4 超时设置
4.5 HTTP 协议请求实战
4.6 代理服务器设置
4.7 DebugLog开启
4.8 异常处理神器 - URLError
Python2.x时代,操作URL的库是Urllib,分为Urllib和Urllib2;Python3.x时代合并到Urllib库中。
4.1 Urllib库
- 抓取网页用的
- 升级合并后,模块中包的位置变化较多
时代变迁下的比较:
Python2.x时代 | Python3.x时代 |
---|---|
import urllib2 | import urllib.request,urllib.error |
import urllib | import urllib2.request,urllib.error,urllib.parse |
import urlparse | import urllib.parse |
urllib2.urlopen | urllib.request.urlopen |
urllib.urlencode | urllib.parse.urlencode |
urllib.quote | urllib.request.quote |
cookielib.CookieJar | http.CookieJar |
urllib2.Request | urllib.request.Request |
4.2 快速使用
1 | //导入模块 |
爬取网页并保存到本地文件:
- 爬取网页,赋给变量
- 变量写入本地文件,*.html
- 关闭文件
1 | >>> fhandle=open("/User/linking/Dev/Python/py-books-study/deep-in-python-web-crawler/baidu.html") |
URL标准中一般只允许一部分ASCII字符,如数字、字母、部分符号等。若是特殊字符,如中文、:、或者&等,需要编码。编码格式:
1 | >>> urllib.request.quote("http://www.baidu.com") |
解码格式:
1 | >>> urllib.request.unquote("http%3A//www.baidu.com") |
编码在Python中十分重要,因为平台及历史原因等,需要特别注意。
4.3 模拟浏览器 – Headers 属性
问题:爬取时出现 403错误,由于网页做了反爬虫设置。
解决方式:设置Headers信息,模拟浏览器登录。
浏览器检查工具可以查看到User-Agents,两种方法:
1 | # 法1:build_opener()修改报头 |
4.4 超时设置
超时时间设置,服务器响应时间,速度快慢,性能考量,超时抛出异常。
1 | import urllib.request |
上述,循环发100个请求,1秒比较频繁,出现异常。
4.5 HTTP 协议请求实战
1. GET请求
1 | import urllib.request |
保存的网页打开后,看到的效果与百度搜索“hello”效果一样。
这是英文,如果是搜索中文呢?如keywd=”呵呵”,出现了
1 | # out: |
编码出现问题,需要用前面讲到的urllib.request.quote(keywd)来编码。
1 | import urllib.request |
2. POST请求实例
1 | import urllib.request |
登陆后得到的数据返回跟正常登陆返回一样的。
4.6 代理服务器设置
4.7 DebugLog开启
1 | import urllib.request |
4.8 异常处理神器 - URLError
1 | import urllib.request |
没看到403,forbidden错误;怀疑是Python最新版做了模拟浏览器登陆。
还有HTTPError这个URLError的子类
1 | import urllib.request |
有则输出,没有则忽略:
1 | import urllib.request |
- 本文作者: Linking
- 本文链接: https://linking.fun/2017/07/10/精通Python网络爬虫-第四章-Urllib库与URLError异常处理/
- 版权声明: 版权所有,转载请注明出处!