【发布时间】:2014-05-23 21:44:48
【问题描述】:
我正在尝试使用 scrapy 来获取仅在单击 javascript: 链接后呈现的内容。由于链接似乎没有遵循系统编号方案,我不知道如何
1 - 激活 javascript: 链接以展开折叠面板
2 - 激活一个(现在可见的)javascript:链接以使弹出窗口被渲染,以便可以抓取其内容(摘要)
https://b-com.mci-group.com/EventProgramme/EHA19.aspx 网站包含指向将在我计划参加的会议上发表的摘要的链接。该站点的 PDF 导出是错误的,因为它在 PDF 生成时复制了大量数据。我没有处理这个错误,而是转而使用scrapy,只是意识到我在我的头上。我读过:
Can scrapy be used to scrape dynamic content from websites that are using AJAX?
和
How to scrape coupon code of coupon site (coupon code comes on clicking button)
但我认为我无法将这些点联系起来。我也看到过对 Selenium 的提及,但不确定我是否必须诉诸于此。
我没有取得什么进展,不知道我是否可以在正确的方向上推动,手头有以下信息:
为了发出将展开折叠面板(上面第 1 项)的 POST 请求,我跟踪到页面上的 JS javascript:ShowCollapsiblePanel(116114,1695,44,191);将导致向 TARGETURLOFWEBSITE/EventSessionAjaxService/GetSessionDetailsHtml 发出带有有效负载的 POST 请求:
{"eventSessionID":116114,"eventSessionWebSiteSetupViewID":191}
eventSessionID 和 eventSessionWebSiteSetupViewID 的参数在 javascript:ShowCollapsiblePanel 文本中很清楚。
如何使用 scrapy 遍历表单 javascript:ShowCollapsiblePanel 的所有链接?我尝试使用 SgmlLinkExtractor,但没有返回任何 javascript:ShowCollapsiblePanel() 链接——我怀疑它们不符合“链接”的标准。
更新
取得进展,我发现 SgmlLinkExtractor 不是正确的方法,而且要简单得多:
sel.xpath('//a[contains(@href, "javascript:ShowCollapsiblePanel")]').re('((\d+)\,(\d+)\,(\d+)\,( \d+)')
在 scrapy 控制台中返回每个 javascript:ShowCollapsiblePanel() 的所有数字参数(当然,现在它们都在一个长字符串中,但我只是在控制台中乱搞)。
下一步将获取第一个 javascript:ShowCollapsiblePanel() 并生成 POST 请求并分析响应以查看响应是否包含我在浏览器中单击链接时看到的内容。
【问题讨论】:
-
您需要使用开发人员工具调查页面,查看 ajax 请求的去向并为此内容发出请求。从对页面的简要调查来看,它正在发出 POST 请求以获取所有抽象详细信息,然后是另一个 POST 以获取特定摘要。你需要在你的蜘蛛中模仿这种行为。首先从伪链接中提取帖子参数,然后发出帖子请求。尝试实现这一点,如果您遇到困难,请使用您使用的代码更新您的问题(为此编写代码可能需要一段时间,所以请耐心等待)。
-
添加了更多信息 - 我仍然陷入困境,希望能朝着正确的方向前进。
标签: python ajax selenium web-scraping scrapy