Scrapy не получает данные с некоторых страниц - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь изучить более продвинутые варианты scrapy, работая с response.meta и анализируя данные со следующей страницы.Написанный код работает, он посещает все намеченные страницы, но не собирает данные со всех из них.

Я попытался изменить правила для перехода по ссылкам внутри LinkExtractor и ограничить пути xpath для разных областей веб-сайта, но это не меняетповедение скрапа.Я также пытался НЕ использовать регулярное выражение 'r/', но это ничего не меняет, кроме скрапа, блуждающего по всей странице.

РЕДАКТИРОВАТЬ: Я думаю, что проблема заключается в def category_page, где я делаю next_pageнавигация по странице категории.Если я удаляю эту функцию и следую из ссылок, scrapy получает все результаты со страницы.

Что я пытаюсь сделать, это:

  1. Посетите страницу категории в start_urls
  2. Извлечение всех определенных элементов из /product/view и /pref_product/view, следующих со страницы категории.Далее следуйте из них к /member/view
  3. Извлеките все определенные элементы на /member/view странице
  4. Перейдите далее к next_page в категории от start_urls

Scrapy делает все эти вещи, но пропускает большую часть данных!

Например, образец журнала.Ни одна из этих страниц не была списана.

DEBUG: Crawled (200) <GET https://www.go4worldbusiness.com/product/view/275725/car-elevator.html> (referer: https://www.go4worldbusiness.com/suppliers/elevators-escalators.html?region=worldwide&pg_suppliers=5)
DEBUG: Crawled (200) <GET https://www.go4worldbusiness.com/product/view/239895/guide-roller.html> (referer: https://www.go4worldbusiness.com/suppliers/elevators-escalators.html?region=worldwide&pg_suppliers=5)
DEBUG: Crawled (200) <GET https://www.go4worldbusiness.com/product/view/289815/elevator.html> (referer: https://www.go4worldbusiness.com/suppliers/elevators-escalators.html?region=worldwide&pg_suppliers=5)

Вот код, который я использую

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.selector import HtmlXPathSelector
from urlparse import urljoin
from scrapy import Selector

from go4world.items import Go4WorldItem


class ElectronicsSpider(CrawlSpider):
    name = "m17"
    allowed_domains = ["go4worldbusiness.com"]
    start_urls = [
        'https://www.go4worldbusiness.com/suppliers/furniture-interior-decoration-furnishings.html?pg_suppliers=1',
        'https://www.go4worldbusiness.com/suppliers/agri-food-processing-machinery-equipment.html?pg_suppliers=1',
        'https://www.go4worldbusiness.com/suppliers/alcoholic-beverages-tobacco-related-products.html?pg_suppliers=1',
        'https://www.go4worldbusiness.com/suppliers/bar-accessories-and-related-products.html?pg_suppliers=1',
        'https://www.go4worldbusiness.com/suppliers/elevators-escalators.html?pg_suppliers=1' 
    ]

    rules = (
        Rule(LinkExtractor(allow=(r'/furniture-interior-decoration-furnishings.html?', 
                                  r'/furniture-interior-decoration-furnishings.html?',
                                  r'/agri-food-processing-machinery-equipment.html?',
                                  r'/alcoholic-beverages-tobacco-related-products.html?',
                                  r'/bar-accessories-and-related-products.html?',
                                  r'/elevators-escalators.html?'
        ), restrict_xpaths=('//div[4]/div[1]/div[2]/div/div[2]/div/div/div[23]/ul'), ),
             callback="category_page",
             follow=True),
        Rule(LinkExtractor(allow=('/product/view/', '/pref_product/view/'), restrict_xpaths=('//div[4]/div[1]/..'), ),
             callback="parse_attr",
             follow=False),
        Rule(LinkExtractor(restrict_xpaths=('/div[4]/div[1]/..'), ),
             callback="category_page",
             follow=False),
         )

    BASE_URL = 'https://www.go4worldbusiness.com'

    def category_page(self,response):
         next_page = response.xpath('//div[4]/div[1]/div[2]/div/div[2]/div/div/div[23]/ul/@href').extract()

         for item in self.parse_attr(response):
             yield item

         if next_page:
             path = next_page.extract_first()
             nextpage = response.urljoin(path)
             yield scrapy.Request(nextpage,callback=category_page)

    def parse_attr(self, response):
      for resource in response.xpath('//div[4]/div[1]/..'):
        item = Go4WorldItem()
        item['NameOfProduct'] = response.xpath('//div[4]/div[1]/div[1]/div/h1/text()').extract()
        item['NameOfCompany'] = response.xpath('//div[4]/div[1]/div[2]/div[1]/span/span/a/text()').extract()
        item['Country'] = response.xpath('//div[4]/div[1]/div[3]/div/div[1]/text()').extract()
        company_page = response.urljoin(resource.xpath('//div[4]/div[1]/div[4]/div/ul/li[1]/a/@href').extract_first())
        request = scrapy.Request(company_page, callback = self.company_data)
        request.meta['item'] = item
        yield request

    def company_data(self, response):
        item = response.meta['item']
        item['CompanyTags'] = response.xpath('//div[4]/div[1]/div[6]/div/div[1]/a/text()').extract()
        item['Contact'] = response.xpath('//div[4]/div[1]/div[5]/div/address/text()').extract()
        yield item

Я хочу, чтобы scrap собирал данные со всех просканированных ссылок.Я не могу понять, в чем заключается ошибка, из-за которой скрап не удаляет некоторые страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...