Мой сценарий scrapy, похоже, не вызывает метод parse_item - PullRequest
0 голосов
/ 05 июля 2018

Я новичок в области скрапинга, и мое первое упражнение - почистить определенную страницу на сайте 18:00:

  1. Получить URL каждого продукта на начальной странице
  2. Введите ссылку и очистите информацию о продукте (ссылка, описание, цена и т. Д.)
  3. Вернитесь на начальную страницу и перейдите к следующему продукту и т. Д.

Похоже, я получаю URL-адреса продуктов с начальной страницы, и тогда я не могу вызвать метод get parse_item, который нужно вызвать. Я пытался читать и находить похожие проблемы, но, возможно, потому что я новичок в этом, я не мог понять, почему это не работает. Я пытался использовать метод правила и с теми же результатами. Может кто-нибудь, пожалуйста, помогите мне? Я пытался решить эту проблему в течение 3 дней. Благодарю.

Вот копия моего сценария:

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Spider
from scrapy.spiders import Spider
from esourcing.items import EsourcingItem
from scrapy.http import Request
import re


class SixpmSpider(scrapy.Spider):
    name = 'sixpmsouq'
    allowed_domains = ['web']
    start_urls = ('https://www.6pm.com/a2-by-aerosoles-women- 
shoes/CK_XAVoC0iPAAQHiAgQBCxgykgMLWzcwIFRPIDEwMF0.zso?
s=recentSalesStyle/desc/',)


    def parse(self, response):
        html = response.body

        for href in response.xpath('//*[@itemprop="url"]/@href'):
            url = "http://www.6pm.com"+ href.extract()
            yield scrapy.Request(url, callback=self.parse_item)


    def parse_item(self, response):
        item = EsourcingItem()
        item['reference'] = response.xpath('//*[text()="SKU: #"]/text() [2]').extract()
        yield item

1 Ответ

0 голосов
/ 05 июля 2018

Кажется, что ваш атрибут allowed_domains отфильтровывает запросы, которые вы генерируете в self.parse.

Если вы проверите свои журналы пауков, вы увидите сообщение о том, что OffsiteMiddleware отфильтровал ваш запрос, например:

DEBUG: Filtered offsite request to 'www.6pm.com': <GET ....>

Исправьте это, изменив такой атрибут на: ['6pm.com']

class SixpmSpider(scrapy.Spider):
    name = 'sixpmsouq'
    allowed_domains = ['6pm.com']

Если вам интересно, почему первый запрос (из start_urls) был успешным, то это потому, что URL-адреса из start_urls (или start_requests) не подпадают под такие фильтры.

...