Экспорт скрапа с содержанием селенового соскоба - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь очистить сайт с помощью Scrapy и Selenium, и все работает просто отлично, за исключением части кода «yield item».

В части "def parse_product (self, response)" я использую Selenium find_element_by_css_selector, чтобы заполнить список, а затем использую подход "for element in zip (list1, list2 и т. Д.)" Для генерации моегоПредметы. Я также настроил конвейер для экспорта результата в csv.

Проблема в том, что, хотя мой паук чистит объекты правильно (я проверял это с некоторыми отпечатками по пути), часть создания элементане работает, и я получаю пустой CSV.

Я пробовал другой подход, который работает, но слишком медленно. Он заключается в определении промежуточного программного обеспечения для передачи запроса через Selenium, загрузки исходного кода страницы и возврата HtmlResponse. Затем я просто использую метод response.css () для заполнения списков, тот же подход для генерации элементов и тот же конвейер для его экспорта как csv.

spider.py

def __init__(self):
    #Headless Option
    opt = Options()
    opt.headless = True

    ## get the Firefox profile object
    prf = FirefoxProfile()
    ## Disable CSS
    prf.set_preference('permissions.default.stylesheet', 2)
    ## Disable images
    prf.set_preference('permissions.default.image', 2)

    self.browser = webdriver.Firefox(firefox_options = opt, firefox_profile = prf)

def parse(self, response):
    self.browser.get(response.url)
    print('Current URL: ' + response.request.url)

    # Find the total number of pages

    # Go to last page (click on '>>')
    self.browser.find_element_by_css_selector('li.ais-pagination__item:nth-child(9) a:nth-child(1)').click()

    n = self.browser.find_element_by_css_selector('li.ais-pagination__item:nth-child(7) a:nth-child(1)').get_attribute('text')
    pages = int(n.strip())

    # Go back to first page (click on '<<')
    self.browser.find_element_by_css_selector('li.ais-pagination__item:nth-child(1) a:nth-child(1)').click()

    # Scrape product links
    pdcts = []
    href = []
    i=1
    while i<=n:

        # Append Product Links
        atag = self.browser.find_elements_by_css_selector('div[class*="ph-proucts"] a')
        for a in atag:
            href.append(a.get_attribute('href'))

        prd = list(set(href))

        for p in prd:
            pdcts.append(p)

        # Load new page of products (Click '>')
        self.browser.find_element_by_css_selector('li.ais-pagination__item:nth-child(8) a:nth-child(1)').click()

        i+=1

    for link in pdcts:
        yield scrapy.Request(url = link, callback = self.parse_product)

def parse_product(self, response):
    self.browser.get(response.url)
    print("Current URL: " + response.request.url)

    #Item Initializator
    name = []

    #Item Filling
    try:
        n = self.browser.find_element_by_css_selector('div[class="flex xs12 sm12 md12"] h1').text
        name.append(string.capwords(n))
    except:
        n1 = response.request.url
        n = n1.split('products/')[1].replace('-',' ')
        name.append(string.capwords(n))       

    #Item Creation
    for i in zip(name):
        self.browser.quit()

        item = ProjectItem()

        item['name'] = i[0]

        yield item

Ожидаемый результат - CSV с очищенной информацией, но вместо этого я получаю пустую.

Может ли кто-нибудь помочь мне с этим, пожалуйста? Я был бы очень признателен.

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