如何用Python Mechanize自动添加Google Alerts
我知道这里有一个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一起使用。
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
有很好的实现)。