Scrapy ползет, но не царапает

Проблема в том, что если я добавлю URL продукта непосредственно в start_urls, все будет работать нормально. Но когда страница продукта появляется во время сканирования (все просканированные страницы возвращают '200'), она не соскабливается.... Я запускаю паука через:

scrape crawl site_products -t csv -o Site.csv

Код паука:

#-*- coding: utf-8 -*-
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from site.items import SiteItem
import datetime


class SiteProducts(CrawlSpider):
    name = 'site_products'
    allowed_domains = ['www.example.com']
    start_urls = [
        #'http://www.example.com/us/sweater_cod39636734fs.html',
        #'http://www.example.com/us/sweater_cod39693703uh.html',
        #'http://www.example.com/us/pantaloni-5-tasche_cod36883777uu.html',
        #'http://www.example.com/fr/robe_cod34663996xk.html',
        #'http://www.example.com/fr/trousers_cod36898044mj.html',
        'http://www.example.com/us/women/onlinestore/suits-and-jackets',
    ]

    rules = (
        # Extract links matching 'item.php' and parse them with the spider's method parse_item
        Rule(LinkExtractor(allow=('http://www.example.com/us/', 'http://www.example.com/fr/', )), follow=True),
        Rule(LinkExtractor(allow=('.*_cod.*\.html', )), callback='parse_item'),
    )

    def parse_item(self, response):
        self.logger.info('Hi, this is an item page! %s', response.url)
        item = SiteItem()
        item['name'] = response.xpath('//h2[@class="productName"]/text()').extract()
        item['price'] = response.xpath('//span[@class="priceValue"]/text()')[0].extract()
        if response.xpath('//span[@class="currency"]/text()')[0].extract() == '$':
            item['currency'] = 'USD'
        else:
            item['currency'] = response.xpath('//span[@class="currency"]/text()')[0].extract()
        item['category'] = response.xpath('//li[@class="selected leaf"]/a/text()').extract()
        item['sku'] = response.xpath('//span[@class="MFC"]/text()').extract()
        if response.xpath('//div[@class="soldOutButton"]/text()').extract() == True or response.xpath('//span[@class="outStock"]/text()').extract() == True:
            item['avaliability'] = 'No'
        else:
            item['avaliability'] = 'Yes'
        item['time'] = datetime.datetime.now().strftime("%Y.%m.%d %H:%M")
        item['color'] = response.xpath('//*[contains(@id, "color_")]/a/text()').extract()
        item['size'] = response.xpath('//*[contains(@id, "sizew_")]/a/text()').extract()
        if '/us/' in response.url:
            item['region'] = 'US'
        elif '/fr/' in response.url:
            item['region'] = 'FR'
        item['description'] = response.xpath('//div[@class="descriptionContent"]/text()')[0].extract()
        return item

Что мне не хватает?

1 ответ

Решение

Я проверил, и кажется, что этот веб-сайт блокирует всех нестандартных агентов пользователя (возвращая 403). Так что попробуйте установить user_agent Класс Paremeter для чего-то общего, как:

class SiteProducts(CrawlSpider):
    name = 'site_products'
    user_agent = 'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0'

или просто установить его в проектах settings.py:

USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0'

Вы можете найти больше строк пользовательского агента в Интернете, например, официальную документацию mozzila.

РЕДАКТИРОВАТЬ:
При дальнейшей проверке я вижу, что ваша логика LinkExtractor неисправна. Linkextractors извлекается в определенном порядке правил, и ваши экстракторы перекрываются, это означает, что первый linkextractor с последующими также извлекает страницы продукта, а также означает, что у вас есть экстрактор ссылки на продукт, который будет сканировать страницы, которые уже были сканированы ранее, и фильтроваться на предмет дублирования.

Вам нужно переделать свой первый линкэкстрактор, чтобы избежать страниц с продуктами. Вы можете сделать это, просто скопировав allow параметр из вашего linkextractor в deny параметр вашего первого линкэкстрактора.

Другие вопросы по тегам