【发布时间】:2012-03-12 14:41:57
【问题描述】:
我目前正在尝试使用 CasperJS 和 PhantomJS(这两个出色的工具,感谢 n1k0 和 Ariya)来抓取 Google 关键字工具,但我无法让它工作。
这是我目前的流程:
- 使用我的 Google 帐户登录(以避免关键字工具中出现验证码)。
- 导航到关键字工具页面。
- 填写搜索表格并按
Search。
我被困在第 3 步:搜索表单不是常规的 HTML 表单,我不能使用 Casper#fill(),所以我直接访问这些字段。以下是我尝试更改 Word or phrase 字段值的一些语法:
this.evaluate(function() {
// Trying to change the value...
document.querySelector('textarea.sP3.sBFB').value = 'MY SUPER KEYWORDS';
document.querySelector('textarea.sP3.sBFB').setAttribute('value', 'MY SUPER KEYWORDS');
document.querySelector('textarea').value = 'MY SUPER KEYWORDS'; // there's only one <textarea> on the page
// Trying to change other attributes...
document.querySelector('textarea.sP3.sBFB').textContent = 'MY SUPER KEYWORDS';
document.querySelector('textarea').style.backgroundColor = 'yellow';
});
没有任何作用。我正在做一个Casper#capture() 以查看该字段包含的内容。 As you can see,它确认我在正确的页面上并且我已登录,但 <textarea> 是空的。
奇怪的是,我可以访问 DOM 的其他部分:我可以通过执行以下操作将显示 Advanced Options and Filters 的链接的文本更改为 ___VINCE SAYS HELLO___(请参阅捕获):
this.evaluate(function() {
document.querySelector('a.sLAB').textContent = '___VINCE SAYS HELLO___';
});
附言。我知道抓取 Google 关键字工具是违反 TOS 的,但我认为这个问题可能会引起任何试图抓取 JavaScript/Ajax 重网站的人的兴趣。
【问题讨论】:
-
您可能必须等待这个文本区域被加载并可用。查看documentation for waitForSelector()
-
感谢 NiKo 的及时回复。我已经尝试过你的建议。实际上,您在此处看到的代码包含在
WaitFor()语句中。由于__utils__.exists(),我尝试了一个WaitForSelector('textarea.sP3.sBFB')和一个WaitFor(),它具有测试该字段是否存在的功能,但都没有奏效。
标签: javascript screen-scraping web-scraping phantomjs