基本库的使用
使用urllib:官方文档https://docs.python.org/3/library/urllib.html
urllib分为四个模块:
1、request:它是最基本的HTTP请求模块,可以用来模拟发送请求;
2、error:异常处理模块,如果出现请求错误,我们可以捕获这些异常,然后进行重试或其他操作以保证程序不会意外终止;
3、parse:一个工具模块,提供了许多URL处理方法,比如拆分、解析、合并等;
4、robotparse:主要是用来识别网站的robots.txt文件,然后判断哪些网站可以爬,哪些网站不可以爬。
1.urlopen方法:
urllib.request.urlopen(url,data=None,[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
data参数:可选的,必须是bytes类型,如果是字典,可以先用urllib.parse模块的urlencode()编码
timeout参数:设置超时时间,单位为秒,请求超出了设置的这个时间,还没有得到响应,就会抛出异常。
2.Request
如果请求中需要加入Headers等信息,就可以利用更强大的Request类来构建。
class urllib.request.Request(url,data=None,headers={},origin_req_host=None,unverifiable=False,method=None)
headers:字典,它是一个请求头,可以在构造请求时通过headers参数直接构造,也可以通过调用请求实例的add_header()方法添加。添加请求头最常用的方法是通过修改User-Agent来伪装浏览器,默认的User-Agent是python-urllib,我们可以通过修改它来伪装浏览器。
origin_req_host:请求方的host名称或者IP地址。
unverifiable:这个请求是否无法验证,如果我们请求一个HTML文档,但是我们没有自动抓取图像的权限,这时为True
method:method的一个字符串,指示请求的方法,比如GET、POST和PUT等。
高级用法
Handler:类似于各种处理器。BaseHandler类,是所有Handler的父类。
1、HTTPDefaultErrorHandler:用于处理HTTP响应错误,错误都会抛出HTTPError类型的异常
2、HTTPRedirectHandler:用于处理重定向;
3、HTTPCookieProcessor:用于处理Cookies;
4、ProxyHandler:用于设置代理,默认代理为空。
5、HTTPPasswordMgr:用于密码管理,它维护了用户名和密码的表;
6、HTTPBasicAuthHandler:用于管理认证,如果一个连接打开时需要认证,那么可以用它来解决认证问题。
A.验证
B.代理
C.Cookies
处理异常
1.URLError:URLError类型来自urllib库的error模块,它继承自OSError,是error异常模块的基类,由request模块生成的异常都可以由这个基类捕获
2.HTTPError:是URLError的子类,专门用来请求HTTP请求错误。
有3个属性:code:返回HTTP状态码,比如404表示网页不存在,500表示服务器内部错误;
reason:同父类一样,用于返回错误的原因;
headers:返回请求头
解析链接
urllib库提供了parse模块,它定义了处理URL的标准接口
1.urlparse():该方法实现了URL的识别和分段。
一个标准的链接格式:
scheme://netloc/path;params?query#fragment
http://www.baidu.com/index.html;user?id=5#comment
scheme:协议;netloc:域名;path:访问路径;
params:代表参数;query:查询条件;fragment:锚点,直接定位页面内部的下拉位置。
urlparse(urlstring,scheme=' ',allow_fragments=True)
urlstring:必填,即待解析的URL;
scheme:默认的协议,假如这个链接没有待协议,那么用这个作为默认协议。
allow_fragments:是否忽略fragments,如果设置为False,fragment部分就会被忽略,它会被解析为path、parameters或者query的一部分,而fragment部分为空。
2.urlunparse():接受的参数是一个可迭代对象,长度必须是6,否则会抛出参数数量不足或者过多的问题。
3.urlsplit():与urlparse类似,但是不解析params这一部分,path与params为一个整体。
4.urlunsplit():将链接的各个部分组合成完整链接的方法,传入的参数是一个可迭代的对象,长度必须是5.
5.urljoin():将基本链接作为第一个参数,新的链接作为第二个参数。该方法会分析基本谅解的scheme、netloc和path这三个内容,并对新链接缺失的部分进行补充,并作为结果返回。
6.urlencode():将字典等序列化为URL参数。
7.parse_qs():反序列化为字典。
8.parse_qsl():将参数转化为元组组成的列表。
9.quote():可以将内容转化为URL编码格式
10.unquote():URL解码
分析Robots协议
Robots协议:爬虫协议、机器人协议,全名叫做网络爬虫排除标准,用来告诉爬虫和搜索引擎哪些页面可以抓取,哪些不可以抓取。它通常是一个叫做robots.txt的文本文件,一般是放在网站的根目录下。
User-agent描述了搜索爬虫的名称,设置为*则代表协议对任何爬虫爬取有效。
Disallow指定了不允许抓取的目录;Allow一般和Disallow一起使用,排除某些限制,一般Disallow指定大范围不可爬取,Allow则指定哪些范围是例外,可以爬取。
1、robotparser模块
该模块用来解析robots.txt,提供了一个RobotFileParser,可以根据网站的robots.txt来判断一个爬取爬虫是否有权限爬取这个网页。
调用:urllib.robotparser.RobotFileParser(url =’ ’),声明时不传入,默认为空,最后再使用set_url()方法设置一下。
a)set_url():用来设置robots.txt文件的链接;
b) read():读取robots.txt文件并进行分析
c)parse():用来解析robots.txt文件,传入的参数是robots.txt某些行的内容,它会按照robots.txt的语法规则来分析这些内容
d) can_fetch():该方法传人两个参数, 第一个是Use r-age nt ,第二个是要抓取的URL 。返回的内容是该搜索引擎是否可以抓取这个URL ,返回结果是True 或False。
e) mtime():返回的是上次抓取和分析robots.txt 的时间,这对于长时间分析和抓取的搜索爬虫是很有必要的,你可能需要定期检查来抓取最新的robots.txt 。
f) modified () :它同样对长时间分析和抓取的搜索爬虫很有帮助,将当前时间设置为上次抓取和分析robots.txt 的时间。