如何使用 Python Mechanize 自动添加 Google 警报
Posted
技术标签:
【中文标题】如何使用 Python Mechanize 自动添加 Google 警报【英文标题】:How Can I Automatically Add Google Alerts Using Python Mechanize 【发布时间】:2011-08-25 23:56:44 【问题描述】:我知道这里有一个 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()
据我所知,它成功登录并进入添加警报主页,但是当我输入查询并“单击”提交时,它会将我发送到显示“请输入有效的电子邮件地址”的页面”。我缺少某种身份验证吗?我也不明白如何更改谷歌自定义下拉菜单的值?有什么想法吗?
谢谢
【问题讨论】:
【参考方案1】:自定义下拉菜单是使用 javascript 完成的,因此正确的解决方案是找出 URL 参数,然后尝试重现它们(这可能是它现在无法按预期工作的原因 - 你是当您在浏览器中访问网站时,通常由 JavaScript 设置所需的 URL 参数)。
懒惰的解决方案是使用galerts
库,它看起来完全符合您的需要。
对涉及mechanize
(或一般的屏幕抓取)的未来项目的一些提示:
set_proxies
才能将其与 Fiddler 一起使用,请参阅文档)
出于调试目的,请执行for f in self.forms(): print f
之类的操作。这会向您显示页面上识别的所有表单以及它们的名称。
处理 cookie 是重复的,所以 - 惊喜! - 有一种简单的方法可以实现自动化。只需在浏览器类构造函数中执行此操作:self.set_cookiejar(cookielib.CookieJar())
。这会自动跟踪 cookie。
长期以来,我一直依赖于 BeautifulSoup 之类的自定义解析(我仍然在某些特殊情况下使用它),但在大多数情况下,网页屏幕抓取最快的方法是使用 XPath(对于例如,lxml
的实现非常好)。
【讨论】:
【参考方案2】:Mechanize 不处理 JavaScript,那些下拉菜单是 JS。如果你想在涉及 JavaScript 的地方进行自动化,我建议使用 Selenium,它也有 Python 绑定。
http://seleniumhq.org/
【讨论】:
以上是关于如何使用 Python Mechanize 自动添加 Google 警报的主要内容,如果未能解决你的问题,请参考以下文章
在 python mechanize 模块中写入文本输入的问题
如何配置 Ruby Mechanize 代理以通过 Charles Web 代理工作?