使用Selenium和Scrapy通过onclick刮取显示的数据

时间:2019-02-21 01:40:33

标签: python selenium scrapy

我正在使用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请求之后。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,按照@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 Dev Tools查找响应请求时的响应不完全相同。我还没有考虑所有表单数据(〜10/25),即使它们根据id不变也需要所有表单数据吗?

谢谢!