1 urllib
Python内置的HTTP请求库,包含4个模块:
- request 模拟发送请求
- error 异常处理,保证程序不会异常终止
- parse URL处理,包括拆分、解析、合并等
- robotparser 识别网站的robots.txt文件,判断哪些网站可以爬
1.1 urllib.request.urlopen基本使用
urlopen的API,urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
1.1.1 GET
1 | import urllib.request |
1.1.2 POST
- 添加data参数。如果是字节流编码格式的内容,即bytes类型,需要通过
bytes()
方法转化
1 | import urllib.parse |
- 返回结果可以看到我们传递的参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19{
"args": {},
"data": "",
"files": {},
"form": {
"word": "hello"
},
"headers": {
"Accept-Encoding": "identity",
"Content-Length": "10",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "Python-urllib/3.7",
"X-Amzn-Trace-Id": "Root=1-5fde1150-77771d313337109b23a16596"
},
"json": null,
"origin": "153.3.60.156",
"url": "http://httpbin.org/post"
}
1.1.3 设置超时
- 设置timeout,如果
timeout=0.1
则意味着服务器0.1秒内无相应则超时,测试代码如下
1 | import urllib.request |
- 这段代码执行后会报urllib.error.URLError:
,这个异常属于urllib.error,因此需要进行异常处理
1 | import socket |
1.2 Request类 构建更完整的请求
urlopen()
可以发起最基本的请求,借助Request类可以构建更完整的请求,Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
- url为必传参数
- headers是请求头,添加请求头最常用的方法是通过修改User-Agent来伪装浏览器,默认是Python-urllib,可以修改。比如要伪装火狐浏览器可以设为Mozilla/s.o (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11
- origin_req_host指定请求方的host名称或者IP
- unverifiable表示请求是否是无法验证的。True表示用户没有足够的权限来选择接受请求的结果,比如我们请求HTML文档中的图片,但是我们没有自动抓取图像的权限
- method表示请求使用的方法,比如GET/POST/PUT
1 | from urllib import request, parse |
返回结果为
1 | { |
成功设置了data、headers、method
1.3 获取Cookies
1.3.1 输出到控制台
- 首先声明一个
CookieJar
对象 - 利用
HTTPCookieProcessor
构建一个handler - 利用
build_opener
构建opener,执行open函数
1 | import http.cookiejar |
返回结果中有每条cookie的名称和值
1 | BAIDUID = 74596F1DEF3244E28A23ECA2168D97F4:FG=1 |
1.3.2 生成Mozilla格式的Cookies文件
1 | import http.cookiejar |
1 | # Netscape HTTP Cookie File |
1.3.3 生成libwww-perl(LWP)格式的Cookies文件
只修改cookie行即可1
cookie = http.cookiejar.LWPCookieJar(filename)
1 | #LWP-Cookies-2.0 |
1.4 利用生成的Cookies文件
- 利用MozillaCookieJar的Cookies文件
1 | import http.cookiejar |
- 利用LWPCookieJar格式的Cookies,输出网页的源代码
1 | cookie = http.cookiejar.LWPCookieJar() |
1.5 处理异常
1.5.1 URLError
URLError类来自urllib库的error模块,继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以通过捕获这个类来处理。它具有一个属性reason,即返回错误的原因。
1 | from urllib import request, error |
返回Not Found
1.5.2 HTTPError
URLError的子类,专门用于处理HTTP请求错误,具有三个属性:code返回HTTP状态码,reason同父类,headers返回请求头。
1 | from urllib import request, error |
返回结果
1 | Not Found |
1.5.3 更好的异常处理方法
- 先捕获HTTPError再捕获URLError,最后用else处理正常逻辑
1 | from urllib import request, error |
- 有时reason属性返回的不是字符串,而是一个对象。这时我们可以用
isinstance()
方法来判断其类型,做出更详细的异常判断
1 | from urllib import request, error |
返回结果是_ssl.c:1074: The handshake operation timed out
,修改代码
1 | from urllib import request, error |
输出
1 | <class 'socket.timeout'> |
1.6 解析链接
1.6.1 urllib.parse.urlparse
urlparse的API
urllib.parse.urlparse(urlstring, scheme=’’, allow_fragments=True)
其中scheme是协议信息,若链接中不带协议信息则以输入的scheme为默认,否则以链接中的有效
allow_fragments表示是否解析fragments
利用
urlparse
方法解析一个URL1
2
3
4from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment')
print(type(result), result, sep='\n')返回结果为
1 | <class 'urllib.parse.ParseResult'> |
1.6.2 urllib.parse.urlencode
可以将字典序列化成GET请求参数
1 | from urllib.parse import urlencode |
输出http://www.baidu.com?name=germey&age=22
1.7 Robots协议
urllib.robotparser.RobotFileParser
类,可以根据某网站的robots.txt文件判断一个爬虫是否有权限爬取这个网页。
1 | from urllib.robotparser import RobotFileParser |
2 requests
2.1 get
- 基本用法
1 | import requests |
- 用Cookies维持登录状态
1 | import requests |
- 跳过SSL证书验证并忽略警告
1 | import requests |