2013-03-11 2 views
5

크롤러를 작성 중이므로 robots.txt 파서를 구현하고 있습니다. 표준 라이브러리를 사용하고 있습니다. robotparser.Robotparser가 올바르게 구문 분석되지 않는 것 같습니다.

robotparser하지 내가 구글의 robots.txt를 사용하여 내 크롤러를 디버깅하고, 올바르게 구문 분석 것 같다.

또한 페이스 북과 유래에서의 robots.txt와 같은 시도, 때로는 "작업"에 보인다 때로는 실패 할 것 때문에

In [1]: import robotparser 

In [2]: x = robotparser.RobotFileParser() 

In [3]: x.set_url("http://www.google.com/robots.txt") 

In [4]: x.read() 

In [5]: x.can_fetch("My_Crawler", "/catalogs") # This should return False, since it's on Disallow 
Out[5]: False 

In [6]: x.can_fetch("My_Crawler", "/catalogs/p?") # This should return True, since it's Allowed 
Out[6]: False 

In [7]: x.can_fetch("My_Crawler", "http://www.google.com/catalogs/p?") 
Out[7]: False 

그것은 재미 (다음 예는 IPython에서이다). 이것은 robotpaser 모듈의 버그입니까? 아니면 여기서 뭔가 잘못하고있는 걸까요? 그렇다면, 무엇? this 버그 내가 robotparser 문제에 대해 아무것도 찾지 못했습니다 몇 Google 검색 후 관련 아무것도

+0

또한 Linux 컴퓨터에서 Python 2.7.3을 사용하고 있습니다 (Arch Linux) –

답변

2

이 있다면

궁금 해서요. 나는 다른 무언가 결국, 나는 몇 가지 테스트를했다 reppy라는 모듈을 발견하고는 매우 강력한 것 같다. 당신은 를 통해 설치할 수 있습니다; 여기

pip install reppy 

구글의 robots.txt

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 

In [10]: # It also has a x.disallowed function. The contrary of x.allowed 
2

흥미로운 질문을 사용하여 다시 reppy를 사용하여 (IPython에) 몇 가지 예입니다. 나는 소스에 모습 (난 단지 파이썬 2.4 원본을 사용할 수 있습니다,하지만 난이 변경되지 않았습니다 내기)했고, 코드가 실행하여 테스트되고있는 URL normalises :

urllib.quote(urlparse.urlparse(urllib.unquote(url))[2]) 

의 원인 문제 : "?"

>>> urllib.quote(urlparse.urlparse(urllib.unquote("/foo"))[2]) 
'/foo' 
>>> urllib.quote(urlparse.urlparse(urllib.unquote("/foo?"))[2]) 
'/foo' 

이 그래서 파이썬의 라이브러리의 버그 중 하나, 또는 구글을 포함하여있는 robot.txt 사양을 파괴하는 규칙의 문자 (약간 특이한).

는 [가 분명하지 않다 단지의 경우, 내가 다른 방법으로 다시 말할 것이다. 위의 코드는 url을 검사하는 과정에서 robotparser 라이브러리가 사용합니다. 그래서 url이 "?" 그 캐릭터는 드롭됩니다. 당신이 /catalogs/p?을 검사 할 때 이렇게 실행 실제 시험은 /catalogs/p 위해이었다. 그러므로 당신의 놀라운 결과.]

나는 파이썬 사람들과 filing a bug을 제안했다. (설명의 일부로 여기에 링크를 게시 할 수있다) [편집 : 감사]. 다음은 발견 된 다른 라이브러리 ... 일주일에 약

+0

고마워요! 당신 말이 맞아요, 내가 찾은 불행히도 그들은 같은 일을, 로봇 parser보다 잘 작동하지만, 동일한 문제가 동일하게 검사를 했어. 나는 버그를보고했다. -> http://bugs.python.org/issue17403 –

1

를 사용하여 전에 우리는이 문제의 원인이 버그로 커밋 합병했다. 우리는 버전 0.2.2를 정확하게 밀어 넣어이 문제에 대한 회귀 테스트를 포함하여 repo에서 마스터 링했습니다.

버전 0.2은 약간의 인터페이스 변경을 포함 - 지금 당신은 reppy 원래 있던 정확한 인터페이스를 포함하는 RobotsCache 개체를 만들어야합니다. 이는 주로 캐싱을 명시 적으로 지정하고 동일한 프로세스 내에서 다른 캐시를 가질 수있게하기위한 것입니다.그러나 이제는 다시 작동합니다!

from reppy.cache import RobotsCache 
cache = RobotsCache() 
cache.allowed('http://www.google.com/catalogs', 'foo') 
cache.allowed('http://www.google.com/catalogs/p', 'foo') 
cache.allowed('http://www.google.com/catalogs/p?', 'foo') 
+1

고마워! 멋지다! Reppy의 경우 +10, 빠른 이슈를 수행했으며 24 시간 이내에 해결되었습니다! 다시 한 번 감사드립니다! –

4

이것은 해석상의 차이점이 아니라 버그입니다.

이 URL에 대한 액세스가 허용되는 경우, 로봇 을 선 허용의 경로를 일치 금지하려고합니다 평가하기 : (승인하지 않으며이 될 가능성이 높습니다 않았다)를 draft robots.txt specification에 따르면, URL은 순서로 레코드에서 발생합니다. 발견 된 첫 번째 일치 항목이 사용됩니다. 과 일치하는 항목이 없으면 기본 가정은 URL이 허용된다는 것입니다.

(3.2.2의 허용 및 허용 안 라인), 그 해석을 사용

"/ 카탈로그/P?" 이전에 "Disallow :/catalogs"지시문이 있기 때문에 거부해야합니다.

어느 시점에서 Google은 robots.txt를 해당 사양과 다르게 해석하기 시작했습니다. 그들의 방법은 것으로 나타납니다

Check for Allow. If it matches, crawl the page. 
Check for Disallow. If it matches, don't crawl. 
Otherwise, crawl. 

문제는 robots.txt에의 해석에 관한 공식적인 합의가 없다는 것입니다. 나는 1996 년 초안 표준을 사용하는 Google 방법을 사용하는 크롤러를 보았습니다. 크롤러를 운영 할 때 크롤링해서는 안되는 페이지를 크롤링했기 때문에 크롤러를 운영 할 때 웹 해석자를 사용했을 때, 다른 해석을 사용하면 다른 사람들로부터 역겨운 정보를 얻을 수 있습니다. 왜냐하면 그들이 색인을 생성해야한다고 생각했기 때문입니다.

관련 문제