在Scrapy响应中执行内联JavaScript

4

我正在使用Scrapy登录网站,但是收到的响应是一个只包含内联JavaScript的HTML文档。JS重定向到我想要爬取数据的页面。但是Scrapy不执行JS,因此无法路由到我想要的页面。

我使用以下代码提交所需的登录表单:

    def parse(self, response):
      request_id =   response.css('input[name="request_id"]::attr(value)').extract_first()
      data = {
          'userid_placeholder': self.login_user,
          'foilautofill': '',
          'password': self.login_pass,
          'request_id': request_id,
          'username': self.login_user[1:]
      }
      yield   scrapy.FormRequest(url='https://www1.up.ac.za/oam/server/auth_cred_submit',   formdata=data,
                               callback=self.print_p)

打印_p回调函数如下:
def print_p(self, response):
    print(response.text)

我查看了scrapy-splash,但是我找不到一种方法可以使用scrapy-splash在响应中执行JS代码。


1
你尝试过手动访问JS重定向带你到的页面吗?也就是说,在print_p中抓取一个URL并生成对该页面的请求。 - Pablo
@Pablo JS构建一个URL,然后重定向到该URL。 - Craig
https://docs.scrapy.org/en/latest/topics/dynamic-content.html - Gallaecio
2个回答

5

我建议使用Splash作为渲染服务。个人觉得它比Selenium更可靠。使用脚本,您可以指示它与页面进行交互。


2

可能Selenium可以帮助您通过这个JS。

如果您还没有检查过,可以使用一些示例,例如此链接。如果您能够成功访问它,那么您可以使用以下代码获取页面URL:

self.driver.current_url

并在此之后进行数据爬取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接