【问题标题】:Python - Get redirected url of links from Google Alerts feedsPython - 从 Google 警报提要中获取链接的重定向 url
【发布时间】:2014-12-09 02:35:18
【问题描述】:

如果您将 google 提醒创建为 rss 提要(不会自动发送到您的电子邮件地址),它会包含如下链接:https://www.google.com/url?rct=j&sa=t&url=http://www.statesmanjournal.com/story/opinion/readers/2014/10/13/gmo-labels-encourage-people-make-choices/17171289/&ct=ga&cd=CAIyGjkyZjE1NGUzMGIwZjRkNGQ6Y29tOmVuOlVT&usg=AFQjCNHrCLmbml7baTXaqySagcuKHp-KHA

这个链接显然是一个重定向(试试吧,你会在这里结束:http://www.statesmanjournal.com/story/opinion/readers/2014/10/13/gmo-labels-encourage-people-make-choices/17171289/),但我无法用 Python 获得这个最终 url(除非删除 url 的开头,这很丑陋)。

到目前为止,我已经尝试过使用 urllib2、httplib2 和 requests 包:

  • urllib2.urlopen 和 geturl() 来自返回值
  • httplib2 请求,follow_all_redirects=True 和返回值中的 'content-location'
  • requests.get 和 history 的返回值

有人已经遇到过这个问题吗? 谢谢!

【问题讨论】:

  • 您能否至少向我们展示您的一些代码以及输出的内容,以及您期望输出的内容?我不确定我是否按照您在这里的要求进行操作。
  • Google 的响应不会产生 30 倍重定向。它为您提供 JavaScript 代码。

标签: python rss google-alerts


【解决方案1】:

Google 确实为您提供 HTTP 重定向;返回 200 OK 响应,而不是 30x 重定向:

>>> import requests
>>> url = 'https://www.google.com/url?rct=j&sa=t&url=http://www.statesmanjournal.com/story/opinion/readers/2014/10/13/gmo-labels-encourage-people-make-choices/17171289/&ct=ga&cd=CAIyGjkyZjE1NGUzMGIwZjRkNGQ6Y29tOmVuOlVT&usg=AFQjCNHrCLmbml7baTXaqySagcuKHp-KHA'
>>> response = requests.get(url)
>>> response.url
u'https://www.google.com/url?rct=j&sa=t&url=http://www.statesmanjournal.com/story/opinion/readers/2014/10/13/gmo-labels-encourage-people-make-choices/17171289/&ct=ga&cd=CAIyGjkyZjE1NGUzMGIwZjRkNGQ6Y29tOmVuOlVT&usg=AFQjCNHrCLmbml7baTXaqySagcuKHp-KHA'
>>> response.text
u'<script>window.googleJavaScriptRedirect=1</script><script>var m={navigateTo:function(b,a,d){if(b!=a&&b.google){if(b.google.r){b.google.r=0;b.location.href=d;a.location.replace("about:blank");}}else{a.location.replace(d);}}};m.navigateTo(window.parent,window,"http://www.statesmanjournal.com/story/opinion/readers/2014/10/13/gmo-labels-encourage-people-make-choices/17171289/");\n</script><noscript><META http-equiv="refresh" content="0;URL=\'http://www.statesmanjournal.com/story/opinion/readers/2014/10/13/gmo-labels-encourage-people-make-choices/17171289/\'"></noscript>'

响应是一段 HTML 和 JavaScript,您的浏览器会将其解释为加载新 URL。您必须解析该响应以提取目标。

字符串拆分可以实现:

>>> response.text.partition("URL='")[-1].rpartition("'\"")[0]
u'http://www.statesmanjournal.com/story/opinion/readers/2014/10/13/gmo-labels-encourage-people-make-choices/17171289/'

如果我们假设正文中的URL 参数只是查询字符串中url 参数的直接反映,那么您也可以从那里提取它,我们甚至不必问谷歌执行重定向:

try:
    from urllib.parse import parse_qs, urlsplit
except ImportError:
    # Python 2
    from urlparse import parse_qs, urlsplit

target = parse_qs(urlsplit(url).query)['url'][0]

【讨论】:

  • 非常感谢,我会用这个!
  • 如果您最终从响应中提取 URL,那么最好从原始 URL 中提取它
  • @brainLoop:如果我们假设url 组件是相同的,那么可以肯定,然后甚至不用问谷歌。
猜你喜欢
  • 2022-09-30
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-08-17
  • 2015-07-18
  • 1970-01-01
  • 2016-06-06
相关资源
最近更新 更多