Как перемещаться по нумерации на основе js / ajax (href = "#") с помощью Scrapy? - PullRequest
0 голосов
/ 18 февраля 2020

Я хочу перебрать все URL-адреса категорий и удалить содержимое каждой страницы. Хотя urls = [response.xpath('//ul[@class="flexboxesmain categorieslist"]/li/a/@href').extract()[0]] в этом коде я пытался получить только URL первой категории, но моя цель - получить все URL и содержимое внутри каждого URL.

Я использую библиотеку scrapy_selenium. Источник страницы Selenium не передается в функцию scrap_it. Пожалуйста, просмотрите мой код и дайте мне знать, если в нем что-то не так. Я новичок в области терапии.

Ниже приведен код моего паука -

# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
from scrapy import Selector
from scrapy_selenium import SeleniumRequest
from ..items import CouponcollectItem

class Couponsite6SpiderSpider(scrapy.Spider):
    name = 'couponSite6_spider'
    allowed_domains = ['www.couponcodesme.com']
    start_urls = ['https://www.couponcodesme.com/ae/categories']

    def parse(self, response):   
        urls = [response.xpath('//ul[@class="flexboxesmain categorieslist"]/li/a/@href').extract()[0]]
        for url in urls:
            yield SeleniumRequest(
                url=response.urljoin(url),
                wait_time=3,
                callback=self.parse_urls
            ) 

    def parse_urls(self, response):
        driver = response.meta['driver']
        while True:
            next_page = driver.find_element_by_xpath('//a[@class="category_pagination_btn next_btn bottom_page_btn"]')
            try:
                html = driver.page_source
                response_obj = Selector(text=html)
                self.scrap_it(response_obj)
                next_page.click()
            except:
                break
        driver.close()

    def scrap_it(self, response):
        items = CouponcollectItem()
        print('Hi there')
        items['store_img_src'] = response.css('#temp1 > div > div.voucher_col_left.flexbox.spaceBetween > div.vouchercont.offerImg.flexbox.column1 > div.column.column1 > div > div > a > img::attr(src)').extract()
        yield items  

Я добавил следующий код в файл settings.py -

DOWNLOADER_MIDDLEWARES = {
    'scrapy_selenium.SeleniumMiddleware': 800
}

#SELENIUM
from shutil import which

SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver')
SELENIUM_DRIVER_ARGUMENTS=['-headless']  # '--headless' if using chrome instead of firefox

Я прикрепляю Terminal_output Снимок экрана. Спасибо за ваше время! Пожалуйста, помогите мне решить эту проблему.

1 Ответ

1 голос
/ 25 февраля 2020

Проблема в том, что вы не можете совместно использовать драйвер среди асинхронно работающих потоков, и вы также не можете запустить более одного параллельно. Вы можете взять доход, и он будет делать их по одному:

Вверху:

from selenium import webdriver
import time

driver = webdriver.Chrome()

, а затем в вашем классе:

def parse(self, response):
  urls = response.xpath('//ul[@class="flexboxesmain categorieslist"]/li/a/@href').extract()
  for url in urls:
    self.do_category(url)

def do_page(self):
  time.sleep(1)
  html = driver.page_source
  response_obj = Selector(text=html)
  self.scrap_it(response_obj)

def do_category(self, url):
  driver.get(url)
  self.do_page()
  next_links = driver.find_elements_by_css_selector('a.next_btn')
  while len(next_links) > 0:
    next_links[0].click()
    self.do_page()
    next_links = driver.find_elements_by_css_selector('a.next_btn')

И если это слишком медленно для вас, я рекомендую перейти на Puppeteer.

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