如何使用scrapy中的CrawlSpider单击带有javascript onclick的链接?

Posted

技术标签:

【中文标题】如何使用scrapy中的CrawlSpider单击带有javascript onclick的链接?【英文标题】:How to use CrawlSpider from scrapy to click a link with javascript onclick? 【发布时间】:2011-01-28 03:21:38 【问题描述】:

我想让 scrapy 抓取下一个链接如下所示的页面:

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

scrapy 是否能够解释其中的 javascript 代码?

通过 livehttpheaders 扩展,我发现单击 Next 会生成一个 POST,其中包含一个非常大的“垃圾”,如下所示:

encoded_session_hidden_map=H4sIAAAAAAAAALWZXWwj1RXHJ9n

我正在尝试在 CrawlSpider 类上构建我的蜘蛛,但我真的不知道如何对其进行编码,使用 BaseSpider 我使用 parse() 方法来处理第一个 URL,这恰好发生在是一个登录表单,我在其中做了一个 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 在第一个 URL 上使用哪种方法?

我爬取的所有请求,除了第一个,都是 POST 请求。它们交替使用两种类型的请求:粘贴一些数据,然后单击“下一步”进入下一页。

【问题讨论】:

给我更多的上下文,scrapy 无法解释 javascript,但如果你能找到(encoded_session_hidden_​​map)作为隐藏的表单字段或其他东西,你可以模仿 javascript 发送的 POST 消息. 【参考方案1】:

实际的方法如下:

    发布您的请求以访问该页面(正如您所做的那样) 从该特定响应中提取指向下一页的链接 如果可能,简单请求下一页或在适用的情况下再次使用 FormRequest

所有这些都必须通过服务器响应机制进行简化,例如:

您可以尝试在FormRequest.from_response 中使用dont_click = true 或者您可能想要处理来自服务器的重定向 (302)(在这种情况下,您必须在元数据中提及您需要将句柄重定向请求也发送到回调。)

现在如何弄清楚: 使用像 fiddler 这样的网络调试器,或者你可以使用 Firefox 插件 FireBug,或者在 IE 9 中直接按 F12;并检查用户在网站上实际发出的请求是否与您抓取网页的方式相匹配。

【讨论】:

【参考方案2】:

我构建了一个通过 selenium 执行 JS 的快速爬虫。随意复制/修改https://github.com/rickysahu/seleniumjscrawl

【讨论】:

以上是关于如何使用scrapy中的CrawlSpider单击带有javascript onclick的链接?的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy - 了解 CrawlSpider 和 LinkExtractor

Scrapy框架中的CrawlSpider

18python网路爬虫之Scrapy框架中的CrawlSpider详解

Python网络爬虫之Scrapy框架(CrawlSpider)

爬虫学习 16.Python网络爬虫之Scrapy框架(CrawlSpider)

scrapy框架之(CrawlSpider)