从零开始学Python爬虫:(二)使用基本库urllib(下)
一、异常处理
关于某些情况下,可能会出现异常,如果不处理它们,会发生很多错误。
而urllib库提供了error模块来处理这些异常,该模块包括以下功能:
(1)URLError
该类含有一个属性reason,可以返回错误原因
示例:
from urllib import error,request
try:
a=request.urlopen("某个不存在的页面")
except error.URLError as b:
print(b.reason)
系统输出:
Not Found
程序未报错,而是直接输出了错误的原因
(2)HTTPError
该类含有三个属性:code(状态码)、reason(错误原因)、headers(请求头)
示例:
from urllib import error,request
try:
a=request.urlopen("某个不存在的页面")
except error.HTTPError as b:
print(b.code,b.reason,b.headers)
如此,会输出响应的状态码、错误原因、请求头
(注:如果以上两个的网址要找某个存在网址的不存在页面才能输出)
二、网址处理
这里采用urllib库中的parse模块,
包括功能:
(1)urlparse
用于识别和分段url
来看一个例子:
它将一个网址分为了若干部分(注:空为没有)
netloc表示域名、path是访问路径、params是参数、query是查询条件、fragment是锚点(定位页面下拉位置)
当然,以上只是urlparse的一个参数
它的完整形态是:
urlparse(网址,scheme,allow_fragments)
网址就是上面所说的一堆,
scheme则是协议,http还是https
allow_fragments是是否忽略锚点
(2)urlunparse
用于构造url
(注:参数必须包含网址、netloc域名、path访问路径、params参数、query查询条件、fragment锚点这六部分)
示例:
与这两个类似的还有urlsplit、urlunsplit和urljoin,大家可以自行了解。
(3)urlencode
用于构造GET请求参数
举个例子:
首先构建一个字典,存储参数。
然后使用urlencode方法将其转化为真正的参数
就可以看到该参数成功进入了网址中
当然,有字典转化为参数,就有参数转化为字典,这里就可以用parse_qs
(4)quote
将内容转化为URL编码格式
有编码就有解码,解码可以采用unquote方法
三、Robots协议
这个协议通常用来区分,哪些网站可以爬,哪些网站不可以爬。
它通常是一个名为robots.txt的文本文件
在爬虫时,如果访问到存在该文件,就会根据其中规定的范围内爬取
如果没有,则全页面可爬。
(1)样例
User-agent: *
Disallow: /
Allow: /public/
如上便是一个简单样例,
- public一行表示限定了搜索爬虫只能爬取public目录
- 其中的 * 一行表示对所有爬虫都有效(如果将 * 改为Baiduspider 则表示只对百度爬虫有效)
- Disallow则指明了不允许爬取的目录
附:常见爬虫名称及对应网站
-
Baiduspider
对应网站:百度(baidu.com)
说明:Baiduspider 是百度搜索引擎使用的爬虫,用于抓取网站内容并将其索引。 -
Googlebot
对应网站:谷歌(google.com)
说明:Googlebot 是 Google 搜索引擎的爬虫,负责抓取和索引全球范围内的网页内容。 -
Bingbot
对应网站:必应(bing.com)
说明:Bingbot 是微软必应搜索引擎的爬虫,用于抓取和索引互联网上的网页。 -
Yandexbot
对应网站:Yandex(yandex.com)
说明:Yandexbot 是俄罗斯搜索引擎 Yandex 使用的爬虫。 -
Sogou Spider
对应网站:搜狗(sogou.com)
说明:搜狗爬虫用于抓取互联网上的信息,用于搜狗搜索引擎。 -
360Spider
对应网站:360搜索(so.com)
说明:360Spider 是360搜索引擎的爬虫,负责抓取网站数据。 -
Yahoo! Slurp
对应网站:Yahoo(yahoo.com)
说明:Yahoo! Slurp 是 Yahoo 搜索引擎的爬虫,用于抓取和索引网页。 -
DuckDuckBot
对应网站:DuckDuckGo(duckduckgo.com)
说明:DuckDuckBot 是 DuckDuckGo 搜索引擎使用的爬虫,旨在获取网页内容进行索引。 -
SeznamBot
对应网站:Seznam(seznam.cz)
说明:SeznamBot 是捷克搜索引擎 Seznam 的爬虫,负责抓取网页内容。
(2)使用robotparser
依旧是urllib库里的模块。
常用方法有:
-
RobotFileParser()
- 功能:创建一个
RobotFileParser
对象。
- 功能:创建一个
-
set_url(url)
- 功能:设置
robots.txt
文件的 URL 地址,通常是网站根目录下的robots.txt
。
- 功能:设置
-
read()
- 功能:读取并解析指定 URL 的
robots.txt
文件内容。
- 功能:读取并解析指定 URL 的
-
can_fetch(useragent, url)
- 功能:判断给定的爬虫用户代理(user-agent)是否可以抓取指定 URL。如果
robots.txt
文件允许抓取该页面,则返回True
,否则返回False
。
- 功能:判断给定的爬虫用户代理(user-agent)是否可以抓取指定 URL。如果
-
mtime()
- 功能:获取
robots.txt
文件的修改时间(如果存在的话)。返回值为时间戳。
- 功能:获取
-
modified()
- 功能:检查
robots.txt
文件是否已被修改。如果文件已经被修改,则返回True
,否则返回False
。
- 功能:检查
-
default_entry
- 功能:设置默认条目。如果没有明确的规则匹配某个 user-agent,使用此默认条目进行判断。
举个代码示例来看一下:
from urllib import robotparser
#创建一个对象
a=robotparser.RobotFileParser()
#设置网址地址
a.set_url(robots.txt文件的链接)
#读取
a.read()
#判断
print(a.can_fetch('爬虫名称(如Baiduspider)' ,'要爬取的url'))
然后运行,返回看返回的是True还是False即可判断是否限制爬取。