urllib
urllib包含4个模块:
- request 基本的http请求模块,用来模拟发送请求。
- error 异常处理模块,用于捕获异常保证程序不会意外终止
- parse 工具模块,提供了许多URL的处理方法
- robotparser 主要用来识别网站中的robots.txt文件,判断哪些网页可以用来爬
request
urlopen()
API—-> urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
data
添加该参数之后,请求方法即为POST;如果其内容为字节流编码格式(bytes类型)的内容,需要通过bytes()方法进行转换1
2
3
4
5
6import urllib.request as requset
import urllib.parse as parse
data = bytes(parse.urlencode({'world':'hello'}),encoding='utf-8')
reponse = requset.urlopen('http://httpbin.org/post',data=data)
print(reponse.read())timeout
用于设置超时时间,单位:秒,超出这个时间没有相应,就会抛出异常,支持http、https、ftp请求1
2
3import urllib.request as requset
reponse = requset.urlopen('http://httpbin.org/get',timeout=1)context
用来指定ssl设置,必须是ssl.SSLContext类型- cafile和capath
用来指定CA证书和它的路径,在https链接时会用到 - cadefault
该参数已经弃用,默认为False
Request
如果请求中需要添加header头信息,就需要使用Request类来构建请求。
API—-> class urllib.request.Request(ur1, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
- url
用于请求URL,必传参数 - data
bytes(字节流)类型 - headers
一个字典,也就是请求头,可以通过headers参数直接构造请求头,也可以通过请求实例的add_header()方法添加 - origin_req_host
指的是请求方的host名称或者IP地址 - unverifiable
标识这个请求是够是无法验证的,默认是False,也就是用户没有权限来选择接受这个请求的结果 - method
指示请求使用的方法,POST、GET、PUT等
高级用法
需要更高级的操作(Cookie处理、代理设置等)的时候,使用更加强大的工具Handler,简单的可以理解为各种处理器。
BaseHandler是其他所有Handler的父类,提供了最基本的方法。
- HTTPDefaultErrorHandler
用于处理HTTP响应错误 - HTTPRedirectHandler
用于处理重定向 - HTTPCookieProcesser
用于处理Cookie - ProxyHandler
用于设置代理,默认代理为空 - HTTPPasswordMgr
用于管理密码,维护了用户名和密码的表 - HTTPBasicAuthHandler
用于管理认证
parse
parse 模块,它定义了处理 URL 的标准接口,例如实现URL各部分的抽取、合并以及链接转换。 它支持如下协议的 URL 处理:file 、http、gopher、hdl、http、https、imap 、mailto、mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、sip、sips、snews、svn、svn+ssh、telnet和wais。
urlparse()
可以实现URL的识别和分段,解析为6部分: scheme(协议)、netloc(域名)、path(访问路径)、params(参数)、query(查询条件)和fragment(锚点)。
API—-> urllib.parse.urlparse(urlstring, scheme=”, allow_fragments=True)
- urlstring
必填项,待解析的URL - scheme
默认的协议,如果链接没有带协议信息,会以此作为默认协议 - allow_fragments
是够忽略 fragement。设置为false,fragement部分就会被忽略,解析为path、parameters、或者query的一部分
urlunparse()
接受一个可迭代的且长度为6的对象作为参数,构造一个URL
1 | import urllib.parse as parse |
urlsplit()
与urlparse()类似,不过不再单独解析params部分,将其合并到path中
urlunsplit()
与urlunparse()类似,接受一个可迭代的且长度为5的对象作为参数,构造一个URL
urljoin()
提供一个base_url(基础链接)作为第一个参数,将新的链接作为第二个参数,该方法会分析base_url的scheme、netloc和path这3个内容并对新链接缺失的部分进行补充,最后返回结果。
base_url提供了三项内容scheme、netloc和path。如果这3项在新的链接里不存在,就予以补充;如果新的链接存在,就使用新的链接的部分。而base_url中的params、query和fragment是不起作用的。
urlencode()
通过序列化将字典转换为GET请求参数
parse_qs()
通过反序列化将GET请求参数转换为字典
parse_qsl()
将参数转化为元组组成的列表
quote()
将内容转化为URL编码的格式
unquote()
将URL编码格式的内容解码
robotparser
bobots协议
Robots协议也称作爬虫协议/机器人协议,全程网络爬虫排除协议(Robots Exclusion Protocol),通常为一个robots.txt文本文件,存放于网站的根目录之下。
1 | User-agent: * |
常见的爬虫名称
爬虫名称 | 名称 | 网站 |
---|---|---|
BaiduSpider | 百度 | www.baidu.com |
Googlebot | 谷歌 | www.google.com |
360Spider | 360搜索 | www.so.com |
YodaoBot | 有道 | www.youdao.com |
ia_archiver | Alexa | www.alexa.cn |
Scooter | altavista | www.altavista.com |
robotparser
一些常用方法:
- set_url(): 用来设置robots.txt文件的链接。如果在创建RobotFileParser对象时传入了链接,那么就不需要再使用这个方法设置了 。
- read(): 读取 robots.txt文件并进行分析。注意,这个方法执行一个读取和分析操作,如果不调用这个方法,接下来的判断都会为 False,所以一定记得调用这个方法。这个方法不会返回任何内容,但是执行了读取操作。
- parse(): 用来解析robots.txt文件,传人的参数是robots.txt某些行的内容,它会按照 robots.txt的语法规则来分析这些内容。
- can_fetch(): 该方法传人两个参数,第一个是 User-agent,第二个是要抓取的URL。返回的内容是该搜索引擎是否可以抓取这个URL,返回结果是True或False
- mtime(): 返回的是上次抓取和分析robots.txt的时间,这对于长时间分析和抓取的搜索爬虫是很有必要的,你可能需要定期检查来抓取最新的robots.txt。
- modified() :它同样对长时间分析和抓取的搜索爬虫很有帮助,将当前时间设置为上次抓取和分析robots.txt的时间 。
requests
GET请求
1 | import requests |
POST请求
1 | import requests |
正则表达式
爬取猫眼top100
1 |
|
参考资料
崔庆才大佬的《python3网络爬虫开发实战》