3

私は非常に単純なWebクローラーを作成し、'robots.txt'ファイルを解析しようとしています。私は標準ライブラリでモジュールを見つけましたrobotparser。これはまさにこれを行うはずです。Python2.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'pathhosturl'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への特定の追加を処理できず、空白行に問題があります。たとえば、Stack OverflowやPython.orgからファイルを読み込みますが、Google、YouTube、またはステートメントや空白行を含む元のUdacityファイルは読み込みません。私より賢い人がこれを確認したり説明したりできれば、それでもありがたいです!'robots.txt'SitemapSitemap

4

2 に答える 2

2

この外部ライブラリを使用して「robots.txt」ファイルを解析することで、この問題を解決しました。(しかし、元の質問には答えていません!) ターミナルでさらに時間を過ごした後、robotparser は Sitemap などの「robots.txt」仕様への特定の追加を処理できず、空白行に問題があると推測されます。Stack Overflow や Python.org などのファイルを読み込みますが、Google、YouTube、または Sitemap ステートメントと空白行を含む元の Udacity ファイルは読み込みません。私よりも賢い人がこれを確認または説明してくれるとありがたいです!

于 2012-04-14T22:15:46.790 に答える
0

解決策はreppyモジュールを使用することです

pip install reppy

以下にいくつかの例を示します。

In [1]: import reppy

In [2]: x = reppy.fetch("http://google.com/robots.txt")

In [3]: x.atts
Out[3]: 
{'agents': {'*': <reppy.agent at 0x1fd9610>},
 'sitemaps': ['http://www.gstatic.com/culturalinstitute/sitemaps/www_google_com_culturalinstitute/sitemap-index.xml',
  'http://www.google.com/hostednews/sitemap_index.xml',
  'http://www.google.com/sitemaps_webmasters.xml',
  'http://www.google.com/ventures/sitemap_ventures.xml',
  'http://www.gstatic.com/dictionary/static/sitemaps/sitemap_index.xml',
  'http://www.gstatic.com/earth/gallery/sitemaps/sitemap.xml',
  'http://www.gstatic.com/s2/sitemaps/profiles-sitemap.xml',
  'http://www.gstatic.com/trends/websites/sitemaps/sitemapindex.xml']}

In [4]: x.allowed("/catalogs/about", "My_crawler") # Should return True, since it's allowed.
Out[4]: True

In [5]: x.allowed("/catalogs", "My_crawler") # Should return False, since it's not allowed.
Out[5]: False

In [7]: x.allowed("/catalogs/p?", "My_crawler") # Should return True, since it's allowed.
Out[7]: True

In [8]: x.refresh() # Refresh robots.txt, perhaps a magic change?

In [9]: x.ttl
Out[9]: 3721.3556718826294

出来上がり!

于 2013-03-11T18:27:59.653 に答える