本篇博客所有示例使用Jupyter NoteBook演示。
Python爬虫基础系列笔记基于:Python3网络爬虫开发实战-崔庆才 下载密码:wuuc
示例代码 下载密码:02f4
目录
一、简介
爬虫最初的操作便是模拟浏览器向服务器发送请求,这方面Python提供了功能齐全的类库帮我们完成这些请求。
最基础的HTTP请求库有urllib、httplib2、requests、treq等。
有了这些库,我们只需要关心请求的链接是什么,需要传什么参数,以及设置可选的请求头就行;不必了解底层的传输和通信,便可以通过请求和相应得到网页内容。
二、使用urllib
urllib有四个模块:
1)request:用来模拟发送请求。只需给方法传递url和其他参数,便可以模拟浏览器访问网页了。
2)error:异常处理模块,可以捕捉请求时出现的错误,然后进行重试或其他操作保证程序不会意外终止。
3)parse:提供了很多url的处理方法,如拆分、解析、合并等。
4)robotparser:识别网站robots.txt文件,判断哪些网站可以爬,哪些不可以。
1.使用urllib的request模块发送请求
- urlopen()
爬取Python官网:
得到网页源码后,我们想要的链接、文本、图片地址等信息就可以提取出来了。
利用type()查看返回的是什么:
可以发现返回的是一个HTTPResponse类型的对象,主要包含read(),readinto(),getheader(name),getheaders(),fileno()等方法;以及msg,version,status,reason,debuglevel,closed等属性。
调用read()可以得到网页源码,status属性可以得到请求状态码,200为成功,404为找不到网页:
urlopen()函数的API:
第一个参数时请求网页的url;data参数附加数据;timeout参数设置超出时间。
1)data参数:
可选参数。
如果要添加data参数,需要用bytes()将参数转码成字节流。
如果传递了data参数,请求方式就不再是GET,而是POST。
bytes方法的第一个参数需要是字符串类型,用urllib.parse模块中的urlencode()将参数字典转换为字符串;第二个参数指定编码格式utf-8.
url:http://httpbin.org/post可以测试POST请求,可以输出请求的一些信息,包含我们传递的data参数。
传递的参数出现在了form字段中,表明模拟表单提交的方式,以POST方式传输数据。
2)timeout参数
用于设置超时时间,单位秒。如果超过了设置的时间,还没有得到响应,就会抛出异常。
如果不指定,使用默认时间。
超时时间为0.1s,0.1s后,服务器没有响应,就会抛出URLError异常,它属于urllib.error模块,原因是超时。
可以设置超时时间来控制一个网页如果长时间没有响应,就跳过抓取其他网页:
3)其他参数
context参数:必须是ssl.SSLContext类型,指定SSL设置。
cafile和capath分别指定CA证书和路径,在请求HTTPS链接时会有用。
cadefault:弃用,默认值False
- Request()
urlopen()可以实现最基本的请求,但参数太简单。
如果请求中需要加入Headers等信息,需要用更强大的Request来创建:
依然调用urlopen()发送请求,只不过参数不再是简单的url,而是一个Request对象。
这样一方面可以将请求独立成一个对象;另一方面可以更灵活的配置参数。
Request的构造方法:
第一个参数必填,其他可选,=后为可选参数的默认值。
url:待请求网页的url
data:必须是字节流类型;如果是字典,先转换为字符串
headers:请求头,是一个字典;构造请求头时可以通过headers参数直接构造,也可以调用请求实例的add_header()添加;添加请求头一般通过修改User-Agent来伪装浏览器,默认值为Python-urllib,如要伪装火狐,可以把其值设置为:
origin_req_host:请求方的host名称或ip地址
unverifiable:请求是否无法验证,默认False,用户没有足够权限来选择接收这个请求的结果。如,我们请求一个HTML中的图片,我们没有自动抓取图像的权限,此时其值就是True。
method:一个字符串,表示请求的方法,如GET、POST、PUT
也可以通过下面的方式添加请求头:
- 高级用法
对于一些高级操作,如Cookies处理、代理设置等,我们需要使用Handler。
可以把它理解为各种处理器,有专门处理登陆验证的,有处理Cookies的,有处理代理的。
urllib.request模块中的BaseHandler类是所有Handler的父类,接下来是他的一些子类:
另一个重要的类是OpenerDirectory,成为Opener。Opener可以使用open方法,返回类型和urlopen()一样。
我们可以利用Handler来构建Opener。
具体用法:
1)验证
有些网站打开时,会提示你输入用户名和密码,验证成功后才可以查看:
此时需要借助HTTPBasicAuthHandler完成:
首先实例化HTTPBasicAuthHandler对象,参数为HTTPPasswordMgrWithDefaultRealm对象,他用add_password()添加用户名和密码,从而建立一个处理验证的Handler。
利用build_opener()为这个handler构建一个opener,opener发送请求时相当于验证成功。
利用opener的open()方法打开链接,完成验证,获取源码。
2)代理
添加代理可以这么做:
本地搭建一个代理,运行在9743端口上。
ProxyHandler参数是一个字典,键值为协议类型,名为代理链接,可以添加多个代理。
利用build_opener为这个handler构建一个opener,之后调用open()请求网页。
3)Cookies
获取网页的Cookies:
输出成文件格式:
文件内容:
保存为LWP格式的Cookie文件:
文件内容:
读取Cookie文件并利用:
2.处理异常
3.解析链接
4.分析Robots协议
二、使用requests
1.基本用法
2.高级用法
三、正则表达式
四、实战:使用Requests和正则表达式爬取猫眼电影排行