如何在scrapy的CrawlSpider中点击javascript onclick链接?

25 投票
2 回答
11101 浏览
提问于 2025-04-15 20:29

我想让scrapy去爬一些页面,这些页面的下一步链接是这样显示的:

<a href="#" onclick="return gotoPage('2');"> Next </a>

请问scrapy能理解里面的javascript代码吗?

通过使用livehttpheaders这个扩展,我发现点击“下一页”会生成一个POST请求,里面有一大堆“垃圾”数据,开头是这样的:

encoded_session_hidden_map=H4sIAAAAAAAAALWZXWwj1RXHJ9n

我正在尝试基于CrawlSpider类来构建我的爬虫,但我实在搞不清楚该怎么写代码。之前用BaseSpider时,我用parse()方法处理第一个网址,那是一个登录表单,我在这里做了一个POST请求,内容是:

def logon(self, response):
    login_form_data={ 'email': 'user@example.com', 'password': 'mypass22', 'action': 'sign-in' }
    return [FormRequest.from_response(response, formnumber=0, formdata=login_form_data, callback=self.submit_next)]

然后我定义了一个submit_next()方法来告诉爬虫接下来该做什么。但我不知道怎么告诉CrawlSpider在处理第一个网址时用哪个方法?

在我的爬虫请求中,除了第一个请求,其他的都是POST请求。它们交替进行两种请求:一种是提交一些数据,另一种是点击“下一页”去到下一个页面。

2 个回答

-1

我做了一个简单的爬虫,它可以通过selenium来执行JavaScript代码。你可以随意复制或修改这个项目,链接在这里:https://github.com/rickysahu/seleniumjscrawl

3

具体的方法步骤如下:

  1. 像你现在这样,先发送请求去访问网页。
  2. 从这个请求的回复中提取出下一页的链接。
  3. 如果可以的话,简单地请求下一页,或者在适用的情况下再次使用表单请求。

所有这些步骤都需要与服务器的响应机制配合,比如:

  • 你可以尝试在 FormRequest.from_response 中使用 dont_click = true
  • 或者你可能需要处理服务器返回的重定向(302),在这种情况下,你需要在元数据中说明你需要处理重定向请求,并将其发送到回调。

那么如何搞定这一切: 可以使用像 Fiddler 这样的网页调试工具,或者使用 Firefox 的 FireBug 插件,或者在 IE 9 中直接按 F12;检查用户在网站上实际发出的请求,看看这些请求是否与你爬取网页的方式一致。

撰写回答