【问题标题】:How to Load more/show more pagination with scrapy-selenium如何使用scrapy-selenium加载更多/显示更多分页
【发布时间】:2021-06-20 11:31:15
【问题描述】:

得到响应但什么都没刮!!

import scrapy
from scrapy.selector import Selector
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep

class ProductSpider(scrapy.Spider):

    name = "card"

    allowed_domains = ['moneyfacts.co.uk']

    start_urls = ['https://moneyfacts.co.uk/credit-cards/balance-transfer-credit-cards/?fbclid=IwAR05-Sa1hIcYTRx8DXYYQd0UfDRjWF-jD2-u51jiLP-WKlkxSddKjzUcnWA']

    def __init__(self):
        self.driver = webdriver.Chrome()

    def parse(self, response):
        self.driver.get(response.url)
        actions = ActionChains(self.driver)

        while True:
            next = self.driver.find_elements_by_css_selector("button#show-more")

            if next:
                last_height = self.driver.execute_script("return document.body.scrollHeight")
                self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
                actions.move_to_element(next[0]).click().perform()
                
                
                lists= Selector(text=self.driver.page_source)
                
                for list in lists.xpath('//ul[@id="finder-table"]/li'):
                    yield{
                        'Name': list.xpath('.//*[@class="table-item-heading-product-name"]/span/strong/text()').get(),
                        'Title': list.xpath('.//*[@class="table-item-heading-product-name"]/span/text()').get()
                    }

            else:
                break

        self.driver.close()

【问题讨论】:

    标签: selenium scrapy selenium-chromedriver scrapy-selenium


    【解决方案1】:

    我想您需要先滚动到“显示更多”按钮,然后再单击它,因为在您向下滚动屏幕之前它不在屏幕的可视区域上。
    此外,最好根据类名而不是文本来定位元素。
    此外,如果没有更多的“显示更多”按钮,您的代码将引发异常。所以我使用find_elements 而不是你写的来获取元素列表。这不会抛出异常。如果没有找到任何元素,它将返回一个空列表,您的代码将正常退出。如果找到元素,您将使用返回列表中的第一个元素。
    这就是我最终重新构建您的代码:

    
    import scrapy
    
    from selenium import webdriver
    from selenium.webdriver.common.action_chains import ActionChains
    from time import sleep
    
    class ProductSpider(scrapy.Spider):
    
        name = "card"
    
        allowed_domains = ['moneyfacts.co.uk']
    
        start_urls = ['https://moneyfacts.co.uk/credit-cards/balance-transfer-credit-cards/?fbclid=IwAR05-Sa1hIcYTRx8DXYYQd0UfDRjWF-jD2-u51jiLP-WKlkxSddKjzUcnWA']
    
        def __init__(self):
            self.driver = webdriver.Chrome()
    
        def parse(self, response):
            self.driver.get(response.url)
            actions = ActionChains(self.driver)
    
            while True:
                next =  driver.find_elements_by_css_selector("button#show-more")
    
                if next:
                    last_height = driver.execute_script("return document.body.scrollHeight")
                    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
                    actions.move_to_element(next[0]).click().perform()
    
                    lists = self.driver.find_elements_by_xpath(
                        '//ul[@id="finder-table"]/li')
                    for list in lists:
                        yield{
                            'Name': list.xpath('.//*[@class="table-item-heading-product-name"]/span/strong/text()').get(),
                            'Title': list.xpath('.//*[@class="table-item-heading-product-name"]/span/text()').get()
                        }
    
                else:
                    break
    
            self.driver.close()
    
    

    【讨论】:

    • 感谢漂亮的解释,很抱歉,由于属性错误,它仍然无法正常工作,如下所示:“function”对象没有属性“perform”并且还有一些“self”错误。
    • 再试一次我在那里更新的内容。 Actions 对象必须用 selenium webdriver 对象初始化,通常称为 driver。所以这就是我在那里经过的。在您的配置中,它似乎使用self.driver 而不是driver。所以这就是我现在改变的
    • 您好,感谢您的好评。我之前给 self 注入了驱动程序,问题不在这里。主要问题是“执行()”。它显示 spider_exceptions: 'function' object has no attribute 'perform'
    • 啊,当然。我现在已经修好了。点击忘记()。看看它现在是否有效
    • 现在显示另一个 AttributeError: 'WebElement' object has no attribute 'xpath'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多