urllib.parse这个模块,定义了处理url的标准接口,例如实现部分url的抽取,合并以及链接转换
支持好多协议的url处理:file、ftp、gopher、hdl、http、https、imap、mailto、 mms、news、nntp、prospero、rsync、rtsp、rtspu、sftp、shttp、 sip、sips、snews、svn、svn+ssh、telnet、wais
模块下的方法:
urlparse()
from urllib.parse import urlparse
result=urlparse('http://baidu.com')
print(type(result),result)
返回结果是一个 ParseResult 类型的对象,它包含了六个部分,
分别是 scheme、netloc、path、params、query、fragment。
scheme代表协议,netloc,域名,params代表参数,
scheme://netloc/path;params?query#fragment
urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)
urlstring,是必填项,即待解析的 URL。
scheme,是默认的协议(比如http、https等),假如这个链接没有带协议信息,会将这个作为默认的协议。
from urllib.parse import urlparse
result = urlparse('http://www.baidu.com/index.html;user?id=5#comment', allow_fragments=False)
print(result)
urlunparse()
有了 urlparse() 那相应地就有了它的对立方法 urlunparse()。
它接受的参数是一个可迭代对象,但是它的长度必须是 6,否则会抛出参数数量不足或者过多的问题。
from urllib.parse import urlunparse
data = ['http', 'www.baidu.com', 'index.html', 'user', 'a=6', 'comment']
print(urlunparse(data))
urlsplit()
与上述类似但是只能接受五个参数
from urllib.parse import urlsplit
result = urlsplit('http://www.baidu.com/index.html;user?id=5#comment')
print(result)
urlunsplit()与上述urlunparse类似一样的用法
urljoin链接的合并
利用 urljoin() 方法我们可以提供一个 base_url(基础链接),新的链接作为第二个参数,方法会分析 base_url 的 scheme、netloc、path 这三个内容对新链接缺失的部分进行补充,作为结果返回。第二个的URL的参数的优先级比较高要是都有的默认后面的覆盖前面的
from urllib.parse import urljoin
print(urljoin('http://www.baidu.com', 'FAQ.html'))
print(urljoin('http://www.baidu.com', 'https://pythonsite.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://pythonsite.com/FAQ.html'))
print(urljoin('http://www.baidu.com/about.html', 'https://pythonsite.com/FAQ.html?question=2'))
print(urljoin('http://www.baidu.com?wd=abc', 'https://pythonsite.com/index.php'))
print(urljoin('http://www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu.com', '?category=2#comment'))
print(urljoin('www.baidu.com#comment', '?category=2'))
urllencode()
常用的urlencode()方法,在构建data的时候用到过,构造请求参数
data={
'name'='zhangsan','passsword'='password'
} 输出格式为name=zhangsan&password=password
parse_qs()反序列化 可以上上面的请求格式转化成字典格式
运行之后变成[('name','password'),('zhangsan','password')]
quote()
quote() 方法可以将内容转化为 URL 编码的格式,有时候 URL 中带有中文参数的时候可能导致乱码的问题,所以我们可以用这个方法将中文字符转化为 URL 编码,实例如下:
from urllib.parse import quote
word = '请问'
url = 'https://www.baidu.com/s?md=' + quote(keyword)
print(url)
unquote()将实现url编码的逆转换
Robots协议
Robots协议也被称为爬虫协议,机器人协议,网络爬虫排除标准,用来告诉爬虫和搜索引擎哪些
页面可以抓取,哪些页面不可以抓取.通常是一个robots.txt的文件,放到网站的根目录下
当搜索爬虫访问一个站点时候,它首先会检查下这个站点的根目录下是否存在robots.txt文件
如果存在,搜索爬虫会根据其中定义的爬取范围来爬取,如果没有找到这个文件,那么搜索爬虫的
会直接访问所有可以可直接访问的页面
User-agent: *
Disallow: /
Allow: /public/
在这里将值设置为 *,则代表该协议对任何的爬取爬虫有效。User-agent: Baiduspider对百度爬虫是有效的
Disallow 指定了不允许抓取的目录,比如上述例子中设置为/则代表不允许抓取所有页面。
Allow 一般和 Disallow 一起使用,一般不会单独使用,用来排除某些限制,现在我们设置为 /public/ ,起到的作用是所有页面不允许抓取,但是 public 目录是可以抓取的。
User-agent: *
Disallow: / 禁止爬虫访问所有的目录
robotparser模块解析robots.txt 文件
robotparser模块提供了一个类,叫做RobotFileParser.可以根据txt文件来判断
一个爬虫是否有权限
urllib.robotparser.RobotFileParser(url='robots.txt的链接')
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 的时间。
from urllib.robotparser import RobotFileParser
rp=RobotFileParser()
rp.set_url('http://www.baidu.com/search?q=python&page=1#connection')
rp.read()
rp.parse(urlopen('url').read().decode('utf-8').split('\n'))
rp.can_fetch(User_agent,'url')