2017-01-31 8 views
0

Я пытаюсь просканировать категорию форума craiglist.org (https://forums.craigslist.org/). Мой паук:Запрос на игнорирование Scrapy для определенного домена

class CraigslistSpider(scrapy.Spider): 
    name = "craigslist" 
    allowed_domains = ["forums.craigslist.org"] 
    start_urls = ['http://geo.craigslist.org/iso/us/'] 

    def error_handler(self, failure): 
     print failure 

    def parse(self, response): 
     yield Request('https://forums.craigslist.org/', 
        self.getForumPage, 
        dont_filter=True, 
        errback=self.error_handler) 

    def getForumPage(self, response): 
     print "forum page" 

У меня есть это сообщение по ошибке обратного вызова:

[например Failure: TraceBack:: /usr/local/lib/python2.7/site-packages/twisted /internet/defer.py:455:callback /usr/local/lib/python2.7/site-packages/twisted/internet/defer.py:563:_startRunCallbacks /usr/local/lib/python2.7/site -packages/twisted/internet/defer.py: 649: _runCallbacks /usr/local/lib/python2.7/site-packages/twisted/internet/defer.py:1316:gotResult --- --- /usr/local/lib/python2.7/site-packages/twisted/internet/defer.py:1258:_inlineCallbacks /usr/local/lib/python2.7/site-packages/ twisted/python/failure.py: 389: throwExceptionIntoGenerator /usr/local/lib/python2.7/site-packages/scrapy/core/downloader/middleware.py:37:process_request /usr/local/lib/python2. 7/сайт-пакеты/скрученный/интернет/defer.py: 649: _runCallbacks /usr/local/lib/python2.7/site-packages/scrapy/downloadermiddlewares/robotstxt.py:46:process_request_2 ]

Но у меня есть эта проблема только с секцией форума Craigslist. Возможно, это связано с тем, что https для раздела форума противоречит остальной части сайта. Итак, невозможно получить ответ ...

Идея?

ответ

0

Я размещаю решение, которое я нашел для решения проблемы.

Я использовал библиотеку urllib2. Посмотрите:

import urllib2 
from scrapy.http import HtmlResponse 

class CraigslistSpider(scrapy.Spider): 
name = "craigslist" 
allowed_domains = ["forums.craigslist.org"] 
start_urls = ['http://geo.craigslist.org/iso/us/'] 

def error_handler(self, failure): 
    print failure 

def parse(self, response): 
    # Get a valid request with urllib2 
    req = urllib2.Request('https://forums.craigslist.org/') 
    # Get the content of this request 
    pageContent = urllib2.urlopen(req).read() 
    # Parse the content in a HtmlResponse compatible with Scrapy 
    response = HtmlResponse(url=response.url, body=pageContent) 
    print response.css(".forumlistcolumns li").extract() 

С помощью этого решения вы можете разобрать хороший запрос в действительном запросе Scrapy и использовать эту нормаль. Существует, вероятно, лучший метод, но этот функциональный.

0

Я думаю, вы имеете дело с robots.txt. Попробуйте запустить свой паук с

custom_settings = { 
    "ROBOTSTXT_OBEY": False 
} 

Вы также можете проверить его с помощью параметров командной строки: scrapy crawl craigslist -s ROBOTSTXT_OBEY=False.