Scrapy/Selenium 两次跳转到下一页,然后中断(元素不可点击)。此外,除了第一页外,没有提取任何数据

Posted

技术标签:

【中文标题】Scrapy/Selenium 两次跳转到下一页,然后中断(元素不可点击)。此外,除了第一页外,没有提取任何数据【英文标题】:Scrapy/Selenium jumps twice to the next page, then breaks (element not clickable). Plus no data is extracted except on the first page 【发布时间】:2021-03-29 10:21:08 【问题描述】:

我正在尝试抓取一个网站,为此我需要程序跳转到下一页直到最后并提取每个网站上的数据。到目前为止,从起始页提取数据有效,也可以在第 2 页和第 3 页自动跳转。

    前两次跳转后,程序停止,因为 元素点击被拦截:元素 ... 在点 (904, 603) 处不可点击。其他元素会收到点击。我不明白,因为前 2 次点击效果很好。

    程序只在第一页提取需要的数据(回调),而不是在下面。知道为什么吗?

    def parse(self, response):
     url = 'xxxx'
     self.driver = webdriver.Chrome('/Users/xxxx/chromedriver')
     self.driver.maximize_window() # For maximizing window
     self.driver.implicitly_wait(10) # gives an implicit wait for 10 seconds
     self.driver.get(url)
    
     while self.driver.find_elements_by_css_selector("body > div.container-fluid.main-container.bg-white.py-5 > section.maincontent.row > div > nav:nth-child(11) > ul > li:nth-child(7) > a"):
    
         sel = Selector(text=self.driver.page_source)
    
         single_joboffer = response.xpath(".//div[@class='col-12 col-md-10']/p[@class='inserattitel h2 mt-0']/a/@href")
    
         for joboffer in single_joboffer:
             url1 = response.urljoin(joboffer.extract())
             yield scrapy.Request(url1, callback = self.parse_dir_contents)
    
         element = self.driver.find_element_by_css_selector("body > div.container-fluid.main-container.bg-white.py-5 > section.maincontent.row > div > nav:nth-child(11) > ul > li:nth-child(7) > a")
         self.driver.execute_script("window.scrollBy(0,4000)","", element)
         sel = Selector(text=self.driver.page_source)
         sleep(5)
         self.driver.find_element_by_css_selector("body > div.container-fluid.main-container.bg-white.py-5 > section.maincontent.row > div > nav:nth-child(11) > ul > li:nth-child(7) > a").click()
     self.driver.close()
    

我第一次尝试使用 xpaths 作为下一个按钮,但这不起作用,因为几个页面按钮具有相同的 xpath,所以它在页面之间不停地随机跳转。 css-selector 似乎是去这里的方式。我也玩过睡眠时间,但似乎对此没有影响。

【问题讨论】:

【参考方案1】:
    问题已修复:在前两页之后,css 结构发生了变化。从前两页的结构来看: ["|>|"] 它改变了从第三页开始到 ["|>|"]。我必须将 nth-child() 更改为 nth-last-child(2),才能始终获得“下一个”按钮。

【讨论】:

以上是关于Scrapy/Selenium 两次跳转到下一页,然后中断(元素不可点击)。此外,除了第一页外,没有提取任何数据的主要内容,如果未能解决你的问题,请参考以下文章

layui中上一页,下一页,跳转到第几页,确定如何变为英文?

MERN应用支付成功后如何跳转到下一页?

用js实现两个按钮效果,上一页 下一页,点上一页按钮页面跳转到上一页,点下一页按钮页面跳转到下一页。

Laravel 提交按钮不跳转到下一页和上一页

如何跳转到 PrintDocument 的下一页?

导航到下一页时,Chrome (iOS) 中的奇怪自动滚动/跳转行为