我要爬爬虫(3)-解析链接,Robots协议

解析链接


我们经常需要对url进行合并,提取,转换等操作,urllib下的parse模块了解一下~

解析链接

urlparse()
把url解析为一个6元素的列表,包括scheme,netloc,path,params,query,fragment.
urlunparse()
urlparse的逆操作,把列表转化成url.
urlsplit()
和urlparse()函数类似,区别在于解析为5个元素,params不单解析出来。
urlunsplit()
urlparse()的逆操作。

链接拼接

urljoin()
把两个url合并,接受两个url参数,以第二个为基准,主要判定scheme,netloc,path三个元素,第二个参数缺啥就用第一个参数补齐。

参数序列化

urlencode()
我要爬爬虫(1)已经学习过,是将参数(可迭代对象)解析成字符串的函数,是一个序列化的过程。
parse_qs()
逆序列化操作,将字符串转换成字典。
parse_qsl()
逆序列化操作,将字符串转换成元组构成的列表。

中文转url

quote()
url带有中文,有可能导致乱码,所以要先转换成url编码。
unquote()
quote()函数的逆操作。

代码操作

Python 3.5.2 |Anaconda 4.2.0 (64-bit)| (default, Jul  5 2016, 11:41:13) [MSC v.1900 64 bit (AMD64)] on win32
from urllib.parse import urlparse
url='http://www.baidu.com/index.heml;user?id=5#comment'
result=urlparse(url)
result
Out[5]: 
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.heml', params='user', query='id=5', fragment='comment')

result.scheme
Out[6]: 
'http'

urlparse(url)
Out[7]: 
ParseResult(scheme='http', netloc='www.baidu.com', path='/index.heml', params='user', query='id=5', fragment='comment')

from urllib.parse import urlunparse
urlunparse(result)
Out[10]: 
'http://www.baidu.com/index.heml;user?id=5#comment'

from urllib.parse import urljoin
urljoin('http://www.baidu.com','https://zdz.com/index')
Out[12]: 
'https://zdz.com/index'

from urllib.parse import urlencode
params={
    'user':'Tom',
    'pw':123
}
urlencode(params)
Out[15]: 
'user=Tom&pw=123'

from urllib.parse import parse_qs
param=urlencode(params)
parse_qs(param)
Out[18]: 
{'pw': ['123'], 'user': ['Tom']}

from urllib.parse import quote
keyword='中文'
quote(keyword)
Out[21]: 
'%E4%B8%AD%E6%96%87'

Robots协议

在网站的根目录下会存放一个Robots.txt文件,类似于这样的内容:

#这条协议对所有爬虫有效
User-Agent:*
#不允许爬虫访问所有目录
Disallow:/
#允许爬虫访问/public/目录
Allow:/public/

这是百度的Robots文件,可以看到它规定了一些不能爬取的目录。
这里写图片描述
一般在Robots.txt的末尾,都要由这样一句协议:

User-Agent:*
Disallow:/

这样使得除了以上的提到的爬虫和目录外,其他任何爬虫都不能访问本站任何目录。

解析Robots协议

利用robotparser模块下的RobotFileParser()函数来解析Robots协议,参数即为该网站的Robots.txt的路径。
robot=RobotFileParser(url/robots.txt')
这样就实例化一个解析该网站Robots协议的解析器。
必要的,调用解析器的read()方法,对协议进行解析。
robot.read()
最后使用解析器的can_fetch()方法:
robot.can_fetch(爬虫名,该网站下要爬的url)

from urllib.robotparser import RobotFileParser
rp=RobotFileParser('https://www.baidu.com/robots.txt')
rp.read()
print(rp.can_fetch('Baiduspider','https://www.baidu.com/s?wd=python'))
print(rp.can_fetch('Baiduspider','http://www.baidu.com/duty/'))

结果:

False
True

对比上方的百度Robots协议,可以看到BaiduSpider在/s?目录下是禁止访问的;而在/duty目录下可以访问。
顺便说一下,爬虫名不区分大小写。

猜你喜欢

转载自blog.csdn.net/qq_18831501/article/details/80370835