Python web基础的补充

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')

猜你喜欢

转载自blog.csdn.net/qq_37312720/article/details/83037353