Борьба с Scrapy нумерацией страниц - PullRequest
0 голосов
/ 15 марта 2020

На данный момент есть немного кода Франкенштейна (состоящего из частей Beautifulsoup и Scrapy), который, кажется, выполняет свою работу с точки зрения чтения информации с URL-адресов страницы 1. Попробуем повторить все в Scrapy, как только решится проблема с нумерацией страниц.

Итак, что коды должны делать:

  1. Читать все подкатегории (часть BeautifulSoup)

Остальные части кода Scrapy

Используя приведенные выше URL, прочитайте подкатегории.

Извлеките номер последней страницы и l oop поверх вышеуказанных URL.

Извлеките необходимую информацию о продукте из указанных выше URL.

Кажется, все, кроме части 3, похоже, работает.

Попытались использовать приведенный ниже код для извлечения номера последней страницы, но не конечно, как интегрировать его в основной код

def parse_paging(self, response):
        try:
            for next_page in ('?pn=1' + response.xpath('//ul[@class="pagination pull-left"]/noscript/a/text()').extract()[-1]):
                print(next_page)
#                yield scrapy.Request(url=response.urljoin(next_page))
        except:
            pass

Ниже приведен основной код.

import requests
from bs4 import BeautifulSoup
import pandas as pd
import scrapy
from scrapy.crawler import CrawlerProcess

category_list = []
sub_category_url = []

root_url = 'https://uk.rs-online.com/web'
page = requests.get(root_url)
soup = BeautifulSoup(page.content, 'html.parser')
cat_up = [a.find_all('a') for a in soup.find_all('div',class_='horizontalMenu sectionUp')]
category_up = [item for sublist in cat_up for item in sublist]
cat_down = [a.find_all('a') for a in soup.find_all('div',class_='horizontalMenu sectionDown')]
category_down = [item for sublist in cat_down for item in sublist]
for c_up in category_up:
    sub_category_url.append('https://uk.rs-online.com' + c_up['href'])
for c_down in category_down:
    sub_category_url.append('https://uk.rs-online.com' + c_down['href'])
#   print(k)


class subcategories(scrapy.Spider):
    name = 'subcategories'

    def start_requests(self):
        urls = sub_category_url
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)
    def parse(self, response):
        products = response.css('div.card.js-title a::href').extract() #xpath("//div[contains(@class, 'js-tile')]/a/@href").
        for p in products:
            url = urljoin(response.url, p)
            yield scrapy.Request(url, callback=self.parse_product)
    def parse_product(self, response):
        for quote in response.css('tr.resultRow'):
            yield {
                'product': quote.css('div.row.margin-bottom a::text').getall(),
                'stock_no': quote.css('div.stock-no-label a::text').getall(),
                'brand': quote.css('div.row a::text').getall(),
                'price': quote.css('div.col-xs-12.price.text-left span::text').getall(),
                'uom': quote.css('div.col-xs-12.pack.text-left span::text').getall(),
            }
process = CrawlerProcess()
process.crawl(subcategories)
process.start()

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

Дайте мне знать, если у вас есть какие-либо вопросы.

1 Ответ

1 голос
/ 15 марта 2020

Я бы посоветовал вам извлечь номер следующей страницы, используя это, а затем создать URL следующей страницы, используя этот номер.

next_page_number = response.css('.nextPage::attr(ng-click)').re_first('\d+')

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