Scrapy с использованием start_requests с правилами - PullRequest
2 голосов
/ 23 июня 2019

Я не могу найти никакого решения для использования start_requests с правилами, также я не видел ни одного примера в Интернете с этими двумя. Моя цель проста, я хочу переопределить функцию start_request, чтобы получить возможность перехватывать все исключения из запросов и использовать мета в запросах. Это код моего паука:

класс TestSpider (CrawlSpider): имя = «тест» allow_domains = ['www.oreilly.com'] start_urls = ['https://www.oreilly.com/library/view/practical-postgresql/9781449309770/ch04s05.html']

# Base on scrapy doc
def start_requests(self):
    for u in self.start_urls:
        yield Request(u, callback=self.parse_item, errback=self.errback_httpbin, dont_filter=True)

rules = (
    Rule(LinkExtractor(), callback='parse_item', follow=True),
)

def parse_item(self, response):
    item = {}
    item['title'] = response.xpath('//head/title/text()').extract()
    item['url'] = response.url
    yield item

def errback_httpbin(self, failure):
    self.logger.error('ERRRRROR - {}'.format(failure))

Этот код очищает только одну страницу. Я пытаюсь изменить его и вместо:

def parse_item(self, response):
    item = {}
    item['title'] = response.xpath('//head/title/text()').extract()
    item['url'] = response.url
    yield item

Я пытался использовать это, основываясь на этом ответе

def parse_item(self, response):
    item = {}
    item['title'] = response.xpath('//head/title/text()').extract()
    item['url'] = response.url
    return self.parse(response) 

Кажется, это работает, но ничего не трогает, даже если я добавлю функцию разбора на моего паука. Кто-нибудь знает, как использовать start_request и правила вместе? Буду рад любой информации по этой теме. Приятного кодирования!

Ответы [ 3 ]

0 голосов
/ 27 июня 2019

Я нашел решение, но, честно говоря, я не знаю, как оно работает, но оно серьезно делает это.

class TSpider(CrawlSpider):
    name = 't'
    allowed_domains = ['books.toscrapes.com']
    start_urls = ['https://books.toscrapes.com']
    login_page = 'https://books.toscrapes.com'

    rules = (
        Rule(LinkExtractor(), callback='parse_item', follow=True),
    )

    def start_requests(self):
        yield Request(url=self.login_page, callback=self.login, errback=self.errback_httpbin, dont_filter=True)

    def login(self, response):
        return FormRequest.from_response(response)

    def parse_item(self, response):
        item = {}
        item['title'] = response.xpath('//head/title/text()').extract()
        item['url'] = response.url
        yield item

    def errback_httpbin(self, failure):
        self.logger.error('ERRRRROR - {}'.format(failure))
0 голосов
/ 12 июля 2019

Вот решение для обработки ошибки в LinkExtractor

Спасибо, чувак!

0 голосов
/ 24 июня 2019

Чтобы поймать ошибки из вашего rules, вам нужно определить errback для вашего Rule(). Но, к сожалению, сейчас это невозможно.

Вам нужно разобрать и yield request самостоятельно (таким образом вы можете использовать errback) или обработать каждый response, используя middleware.

...