如何用Python Mechanize自动添加Google Alerts

2 投票
2 回答
1684 浏览
提问于 2025-04-17 00:22

我知道这里有一个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()

根据我的观察,它成功登录并进入了添加提醒的主页,但当我输入查询并“点击”提交时,它把我带到一个页面,上面写着“请输入有效的电子邮件地址”。我是不是漏掉了什么认证步骤?我也不太明白怎么更改谷歌自定义下拉菜单上的值?有什么想法吗?

谢谢

2 个回答

2

Mechanize这个工具不支持JavaScript,而那些下拉菜单是用JavaScript做的。如果你想要进行自动化操作,而这些操作涉及到JavaScript,我建议你使用Selenium。Selenium也可以和Python一起使用。

http://seleniumhq.org/

2

自定义下拉菜单是用JavaScript做的,所以正确的解决办法是弄清楚网址参数,然后尝试重现这些参数(这可能就是现在它不能正常工作的原因——你漏掉了一些通常在浏览器访问网站时由JavaScript设置的必要网址参数)。

一个简单的解决方案是使用galerts这个库,它看起来正好能满足你的需求。

这里有一些关于未来项目的提示,涉及到mechanize(或者一般的网页抓取):

  • 使用Fiddler,这是一个非常有用的HTTP调试工具。它可以捕捉大多数浏览器的HTTP流量,让你看到浏览器到底请求了什么。然后你可以手动构造所需的请求,如果不成功,你只需要进行对比。像Firebug或谷歌浏览器的开发者工具也很有用,特别是处理很多异步请求时。(你需要在浏览器对象上调用set_proxies来与Fiddler一起使用,具体可以查看文档)
  • 为了调试,可以做类似for f in self.forms(): print f的事情。这会显示出mechanize在页面上识别的所有表单,以及它们的名称。
  • 处理cookies是重复的工作,所以——惊喜!——有个简单的方法可以自动化这个过程。只需在你的浏览器类构造函数中加上self.set_cookiejar(cookielib.CookieJar())。这样就能自动跟踪cookies了。
  • 我很长时间以来一直依赖像BeautifulSoup这样的自定义解析(在一些特殊情况下我仍然使用它),但在大多数情况下,网页抓取的最快方法是使用XPath(例如,lxml有很好的实现)。

撰写回答