2

我知道在这里出售的 Python API (http://oktaykilic.com/my-projects/google-alerts-api-python/),但我想了解为什么我现在这样做不工作。

这是我到目前为止所拥有的:

class GAlerts():

def __init__(self, uName = 'USERNAME', passWord = 'PASSWORD'):

    self.uName = uName
    self.passWord = passWord

def addAlert(self):

    self.cj = mechanize.CookieJar()
    loginURL = 'https://www.google.com/accounts/ServiceLogin?hl=en&service=alerts&continue=http://www.google.com/alerts'
    alertsURL = 'http://www.google.com/alerts'

    #log into google
    initialRequest = mechanize.Request(loginURL)
    response = mechanize.urlopen(initialRequest)

    #put in form info
    forms = ClientForm.ParseResponse(response, backwards_compat=False)
    forms[0]['Email'] = self.uName
    forms[0]['Passwd'] = self.passWord

    #click form and get cookies
    request2 = forms[0].click()
    response2 = mechanize.urlopen(request2)
    self.cj.extract_cookies(response, initialRequest)


    #now go to alerts page with cookies
    request3 = mechanize.Request(alertsURL)
    self.cj.add_cookie_header(request3)
    response3 = mechanize.urlopen(request3)

    #parse forms on this page
    formsAdd = ClientForm.ParseResponse(response3, backwards_compat=False)
    formsAdd[0]['q'] = 'Hines Ward'

    #click it and submit
    request4 = formsAdd[0].click()
    self.cj.add_cookie_header(request4)
    response4 = mechanize.urlopen(request4)
    print response4.read()


myAlerter = GAlerts()
myAlerter.addAlert()

据我所知,它成功登录并进入添加警报主页,但是当我输入查询并“单击”提交时,它会将我发送到显示“请输入有效的电子邮件地址”的页面。我缺少某种身份验证吗?我也不明白如何更改谷歌自定义下拉菜单的值?有任何想法吗?

谢谢

4

2 回答 2

2

自定义下拉菜单是使用 JavaScript 完成的,因此正确的解决方案是找出 URL 参数,然后尝试重现它们(这可能是它现在无法按预期工作的原因 - 您省略了所需的 URL当您在浏览器中访问网站时通常由 JavaScript 设置的参数)。

懒惰的解决方案是使用该galerts库,它看起来完全符合您的需要。

mechanize对涉及(或一般的屏幕抓取)的未来项目的一些提示:

  • 使用Fiddler,一个非常有用的 HTTP 调试工具。它捕获来自大多数浏览器的 HTTP 流量,并允许您查看浏览器的确切请求。然后,您可以手动制作所需的请求,如果它不起作用,您只需进行比较。Firebug 或Google Chrome 的开发者工具等工具也派上用场,尤其是对于大量异步请求。(您必须调用set_proxies您的浏览器对象才能将其与 Fiddler 一起使用,请参阅文档)
  • 出于调试目的,请执行类似for f in self.forms(): print f. 这将向您显示页面上识别的所有表单机械化及其名称。
  • 处理 cookie是重复的,所以 - 惊喜!- 有一个简单的方法来自动化它。只需在浏览器类构造函数中执行此操作:self.set_cookiejar(cookielib.CookieJar()). 这会自动跟踪 cookie。
  • 很长一段时间以来,我一直依赖于像 BeautifulSoup 这样的自定义解析(我仍然在一些特殊情况下使用它),但在大多数情况下,网页屏幕抓取的最快方法是使用XPath(例如,lxml有一个非常好的实现)。
于 2011-08-26T02:58:52.793 回答
2

Mechanize 不处理 JavaScript,那些下拉菜单是 JS。如果你想在涉及 JavaScript 的地方进行自动化,我建议使用 Selenium,它也有 Python 绑定。

http://seleniumhq.org/

于 2011-08-26T07:01:35.337 回答