【问题标题】:Selenium, Scrapy Iteration (click next) only extract href of items from first pageSelenium,Scrapy Iteration(单击下一步)仅从第一页提取项目的 href
【发布时间】:2020-11-05 07:43:41
【问题描述】:

我尝试提取每个项目的href(每页六个)。要转到下一页,我使用 next_click()。 Selenium webdriver 打开并单击所有页面(到目前为止还不错)。但只从第一页中提取项目。那是五次(与存在的页面一样多)。看起来,它识别出正确数量的项目,但只重新提取第一页的项目。注意:如果您单击下一页,则 url 保持不变。非常感谢您的帮助!

import scrapy
from pprint import pprint
import time
from scrapy.linkextractors import LinkExtractor
from selenium import webdriver
class contentSpider(scrapy.Spider):
    name = "university"
    start_urls = [
            'http://unisg.prospective.ch/index.cfm'   
        ]
    
    def __init__(self):
        self.driver = webdriver.Firefox()
    
    def parse(self, response):
        self.driver.get(response.url)
        
        while True:
            next = self.driver.find_element_by_xpath('//a[@id="btn-forward"]')

            try:
                next.click()
   
                time.sleep(3)

                items = response.xpath('//div[@class="section group jobContent countJobRecords"]')
                for i in items:
                    list_div = s.xpath('.//div')
                    link = list_div.xpath('.//a/@href').extract_first()
                    yield joblink_item(link=link)

            except:
                    break
                   

【问题讨论】:

    标签: python selenium-webdriver scrapy


    【解决方案1】:

    response 是由 scrapy 创建的,而self.driver 是一个 selenium 对象。
    两者互不了解,更新一个不会自动更新另一个。
    因此,您只需一遍又一遍地从相同的响应中提取相同的数据。

    有几种方法可以解决您的问题:

    1. 在 scrapy 中做所有事情
    2. 在 selenium 中做所有事情
    3. 从 selenium 获取更新的 html 并创建新的 scrapy 选择器

    由于有问题的网站似乎根本不需要硒(单击下一步按钮只是发送一个发布请求),我会推荐第一个选项。

    Scrapy-only方法说明:

    如果您在单击下一页按钮时查看浏览器开发人员工具的网络选项卡,您将看到包含以下详细信息的请求:

    要得到你想要的数据,你只需要修改并执行这个请求。
    测试表明,甚至可以使用单个请求获取所有数据:

    >>> request = scrapy.FormRequest(
    ...     url="http://unisg.prospective.ch/index.cfm",
    ...     formdata={"offset": "0", "limit": "30", "lang": "de", "query": ""},
    ... )
    >>> fetch(request)
    2020-11-05 11:36:17 [scrapy.core.engine] DEBUG: Crawled (200) <POST http://unisg.prospective.ch/index.cfm> (referer: Non
    e)
    >>> len(response.css('.jobContent'))
    30
    

    【讨论】:

    • 谢谢!问题是,我找不到解决方案或示例代码,如何单击下一步按钮。非常感谢一段代码,如何只用scrapy点击并执行post请求。
    • 谢谢!它现在可以使用 scrapy start_request 方法和 formdata
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 2023-03-30
    • 2021-05-13
    相关资源
    最近更新 更多