【问题标题】:Scrape displayed data through onclick using Selenium and Scrapy使用 Selenium 和 Scrapy 通过 onclick 抓取显示的数据
【发布时间】:2019-02-21 01:40:33
【问题描述】:

我正在使用 Scrapy 在 python 中编写脚本,以便使用身份验证从网站上抓取数据。 我正在抓取的页面真的很痛苦,因为主要是用 javascript 和 AJAX 请求制作的。页面的所有正文都放在<form> 中,允许使用submit 按钮更改页面。 URL 不变(它是一个 .aspx)。

我已经成功地从第一页抓取了我需要的所有数据,然后使用此代码单击此输入按钮更改页面:

            yield FormRequest.from_response(response,
            formname="Form",
            clickdata={"class":"PageNext"},
            callback=self.after_login)

after_login 方法正在抓取数据。 但是,在单击具有onclick 属性的容器后,我需要出现在另一个 div 中的数据。我需要执行一个循环,以便单击每个容器、显示数据、抓取它们,然后我将转到下一页并执行相同的过程。

问题是我找不到如何制作“脚本”只需使用 Selenium 单击容器的过程(登录时,如果没有,我无法访问此页面)然后 Scrapy 正在抓取数据在发出 XHR 请求之后。

我在互联网上做了很多研究,但无法尝试任何解决方案。

谢谢!

【问题讨论】:

  • 您是否已将 Selenium 集成到您的项目中(即使只是部分集成)?处理 Javascript 的另一种方法是使用 Scrapy Splash。
  • 另外,您是否调查过这些容器中的每一个是否都执行 Web 请求?就像一个正确的 API 调用,甚至只是返回一个 HTML sn-p?还是他们只是切换已经加载的内容?
  • 确实有一个表单发送数据来做AJAX请求。我已成功找到表单数据和 ID 值来执行 FormRequest,但数据显示在仅使用 Javascript 出现的弹出窗口中。也许表单正在发送要在某处显示的数据,例如 .json 格式,但我真的不知道在哪里看。关于 Splash,您是否有使用 Scrapy Splash 请求来模拟 onclick 行为的教程?谢谢!
  • 不能 Scrapy 执行 javascript 函数并且只更新它得到响应的 html 正文?
  • Scrapy 只获取数据。如果您手动触发的 AJAX 表单提交返回 JSON,您当然可以解析它。但它不会运行任何 Javascript 来更新页面。您可以使用浏览器的 Inspector 工具 (Firefox/Chrome) 检查表单提交请求。 Here is a tutorial 来自创建 Splash 的公司。 here is a guide 使用浏览器的开发工具检查请求。

标签: python selenium scrapy


【解决方案1】:

好的,按照@malberts 的建议,我几乎得到了我想要的东西。 我使用这种代码来获取 Ajax 响应请求:

yield scrapy.FormRequest.from_response(
            response=response,
            formdata={
                    'param1':param1value,
                    'param2':param2value,
                    '__VIEWSTATE':__VIEWSTATE,
                    '__ASYNCPOST':'true',
                   'DetailsId':'123'},
            callback=self.parse_item)

def parse_item(self, response):
    ajax_response = response.body
    yield{'Response':ajax_response}

响应应该是 HTML 格式。问题是响应与我通过 Chrome 开发工具查找响应请求时的响应不完全相同。我还没有考虑到所有的表单数据(~10 / 25),它是否需要所有的表单数据,即使它们不根据 id 改变?

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多