我正在编写一个非常简单的网络爬虫并尝试解析'robots.txt'
文件。我robotparser
在标准库中找到了该模块,它应该可以做到这一点。我正在使用 Python 2.7.2。不幸的是,我的代码无法'robots.txt'
正确加载文件,我不知道为什么。
这是我的代码的相关片段:
from urlparse import urlparse, urljoin
import robotparser
def get_all_links(page, url):
links = []
page_url = urlparse(url)
base = page_url[0] + '://' + page_url[1]
robots_url = urljoin(base, '/robots.txt')
rp = robotparser.RobotFileParser()
rp.set_url(robots_url)
rp.read()
for link in page.find_all('a'):
link_url = link.get('href')
print "Found a link: ", link_url
if not rp.can_fetch('*', link_url):
print "Page off limits!"
pass
这page
是一个解析的BeautifulSoup对象,url
是一个存储为字符串的 URL。解析器读入一个空白'robots.txt'
文件,而不是指定 URL 处的文件,然后返回True
所有can_fetch()
查询。看起来它要么没有打开 URL,要么无法读取文本文件。
我也在交互式解释器中尝试过。这就是发生的情况,使用与文档页面相同的语法。
Python 2.7.2 (default, Aug 18 2011, 18:04:39)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import robotparser
>>> url = 'http://www.udacity-forums.com/robots.txt'
>>> rp = robotparser.RobotFileParser()
>>> rp.set_url(url)
>>> rp.read()
>>> print rp
>>>
该行print rp
应该打印'robots.txt'
文件的内容,但它返回空白。更令人沮丧的是,这些 示例都可以正常工作,但是当我尝试自己的 URL 时却失败了。我对 Python 很陌生,我不知道出了什么问题。据我所知,我使用该模块的方式与文档和示例相同。谢谢你的帮助!
更新 1:这里还有几行来自解释器,以防print rp
不是检查是否'robots.txt'
读入的好方法。path
、host
和url
属性是正确的,但来自的条目'robots.txt'
仍未被读入。
>>> rp
<robotparser.RobotFileParser instance at 0x1004debd8>
>>> dir(rp)
['__doc__', '__init__', '__module__', '__str__', '_add_entry', 'allow_all', 'can_fetch', 'default_entry', 'disallow_all', 'entries', 'errcode', 'host', 'last_checked', 'modified', 'mtime', 'parse', 'path', 'read', 'set_url', 'url']
>>> rp.path
'/robots.txt'
>>> rp.host
'www.udacity-forums.com'
>>> rp.entries
[]
>>> rp.url
'http://www.udacity-forums.com/robots.txt'
>>>
更新2:我已经通过使用这个外部库来解析'robots.txt'
文件解决了这个问题。(但我还没有回答最初的问题!)在终端上花费了更多时间后,我最好的猜测是它robotparser
无法处理'robots.txt'
规范中的某些添加,例如Sitemap
,并且有空行问题。它将读取来自 Stack Overflow 和 Python.org 等文件,但不会读取 Google、YouTube 或我的原始 Udacity 文件,其中包括Sitemap
语句和空行。如果比我聪明的人能证实或解释这一点,我仍然会很感激!