2013-03-11 13 views
5

मैं क्रॉलर लिख रहा हूं और इसके लिए मैं robots.txt पार्सर को कार्यान्वित कर रहा हूं, मैं मानक lib robotparser का उपयोग कर रहा हूं।रोबोटपार्सर सही ढंग से पार्स नहीं लग रहा है

ऐसा लगता है कि robotparserनहीं सही ढंग से पार्स करने, मैं अपने क्रॉलर डिबगिंग हूँ गूगल के robots.txt का उपयोग कर रहा है।

(निम्न उदाहरण IPython से हैं)

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 

यह क्योंकि कभी कभी यह "काम" करने लगता है और कभी कभी यह असफल रहा है अजीब है, मैं भी फेसबुक और Stackoverflow से robots.txt के साथ एक ही करने की कोशिश की। क्या यह robotpaser मॉड्यूल से एक बग है? या मैं यहाँ कुछ गलत कर रहा हूँ? यदि ऐसा है तो क्या?

मैं अगर this बग संबंधित कुछ

+0

इसके अलावा मैं एक लिनक्स मशीन (आर्क लिनक्स) पर पाइथन 2.7.3 का उपयोग कर रहा हूं –

उत्तर

2

कुछ गूगल खोजों के बाद मुझे robotparser मुद्दे के बारे में कुछ भी नहीं मिला था सोच रहा था। मैं कुछ और के साथ समाप्त हुआ, मुझे reppy नामक एक मॉड्यूल मिला जिसे मैंने कुछ परीक्षण किया और यह बहुत शक्तिशाली लगता है। आप इसे पीआईपी के माध्यम से स्थापित कर सकते हैं;

pip install reppy 

यहाँ कुछ उदाहरण (IPython पर) 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

दिलचस्प सवाल का उपयोग कर रहे हैं। मैं स्रोत पर एक नज़र (मैं केवल अजगर 2.4 स्रोत उपलब्ध है, लेकिन मैं शर्त लगा सकता है कि यह नहीं बदला है) था और कोड यूआरएल है कि क्रियान्वित करते हुए परीक्षण किया जा रहा को सामान्य:

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 चश्मा टूट रहा है एक एक नियम में चरित्र (जो थोड़ा असामान्य है)।

[बस अगर यह स्पष्ट नहीं है, तो मैं इसे फिर से अलग तरीके से कहूंगा। उपरोक्त कोड यूआरएल की जांच के हिस्से के रूप में रोबोटपार्सर लाइब्रेरी द्वारा उपयोग किया जाता है। तो जब यूआरएल "?" में समाप्त होता है वह चरित्र गिरा दिया गया है। इसलिए जब आपने /catalogs/p? के लिए चेक किया तो वास्तविक परीक्षण निष्पादित /catalogs/p था। इसलिए आपका आश्चर्यजनक परिणाम।]

मैं पाइथन लोगों के साथ filing a bug का सुझाव दूंगा (आप स्पष्टीकरण के हिस्से के रूप में यहां एक लिंक पोस्ट कर सकते हैं) [संपादित करें: धन्यवाद]। और फिर आपको मिली दूसरी लाइब्रेरी का उपयोग करके ...

+0

धन्यवाद! आप सही हैं, मैंने पाया कि मुझे मिली lib के साथ वही जांच हुई और दुर्भाग्यवश वे वही करते हैं, हालांकि यह रोबोटपार्सर से बेहतर काम करता है, लेकिन वे एक ही समस्या है। मैंने बग की सूचना दी -> http://bugs.python.org/issue17403 –

1

लगभग एक हफ्ते पहले हमने इसमें एक बग के साथ एक प्रतिबद्धता विलय कर दी जो इस मुद्दे को उत्पन्न कर रहा है। हमने वास्तव में इस मुद्दे के लिए एक रिग्रेशन टेस्ट सहित रिपो में संस्करण 0.2.2 को पाइप और मास्टर में धक्का दिया।

संस्करण 0.2 में थोड़ा अंतरफलक परिवर्तन होता है - अब आपको रोबोट कैश ऑब्जेक्ट बनाना होगा जिसमें सटीक इंटरफ़ेस होगा जो reppy मूल रूप से था। यह ज्यादातर कैशिंग को स्पष्ट बनाने और उसी प्रक्रिया के भीतर अलग-अलग कैश रखने के लिए संभव था।लेकिन देखो, अब यह फिर से काम करता है!

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

धन्यवाद! एक दम बढ़िया! रिपी के लिए +10, एक त्वरित मुद्दा किया, और 24 घंटे से भी कम समय में हल हो गया! एक बार फिर धन्यवाद! –

4

यह एक बग नहीं है, बल्कि व्याख्या में एक अंतर है।

मूल्यांकन करने के लिए एक यूआरएल के लिए उपयोग की अनुमति है, एक रोबोट को की अनुमति दें में पथ से मेल खाते हैं और के खिलाफ लाइनों की अनुमति रद्द करने का प्रयास करना चाहिए: draft robots.txt specification (जो अनुमोदित नहीं किया गया और न ही यह होने की संभावना है) के अनुसार यूआरएल, क्रम में वे रिकॉर्ड में होते हैं। पाया गया पहला मैच उपयोग किया जाता है। यदि मिलान नहीं मिला है, तो डिफ़ॉल्ट धारणा यह है कि यूआरएल की अनुमति है।

(धारा 3.2.2, की अनुमति दें और स्वीकार करें पंक्तियाँ)

कि व्याख्या, तो का उपयोग करना "/ सूची/p?" अस्वीकार कर दिया जाना चाहिए क्योंकि पहले "अस्वीकार:/कैटलॉग" निर्देश है।

किसी बिंदु पर, 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 की व्याख्या पर कोई औपचारिक समझौता नहीं है। मैंने उन क्रॉलर को देखा है जो 1 99 6 से ड्राफ्ट मानक का उपयोग करने वाले Google विधि और अन्य लोगों का उपयोग करते हैं। जब मैं क्रॉलर चला रहा था, तो मुझे वेबमास्टर्स से नाराज हो गया जब मैंने Google की व्याख्या का उपयोग किया क्योंकि मैंने उन पृष्ठों को क्रॉल किया जिन्हें उन्होंने सोचा था, और अगर मैंने दूसरी व्याख्या का उपयोग किया तो मुझे दूसरों से नाराज हो गया क्योंकि उन्हें लगता है कि सामान अनुक्रमित किया जाना चाहिए था।

संबंधित मुद्दे