【问题标题】:Unable to get the redirected URLs in Python. Tried using requests, urllib, urllib2, and mechanize无法在 Python 中获取重定向的 URL。尝试使用 requests、urllib、urllib2 和 mechanize
【发布时间】:2017-12-29 12:25:02
【问题描述】:

我有一个巨大的 URL 列表,它们重定向到不同的 URL。 我在 for 循环中从列表中提供它们,并尝试打印重定向的 URL

第一个重定向的 URL 打印正常。 但是从第二个开始 - requests 只是停止给我重定向的 URL,而只是打印给定的 URL

我尝试使用urlliburllib2mechanize 实现。

他们给第一个重定向的 url 很好,然后在第二个时抛出一个错误并停止。

谁能告诉我为什么会这样?

以下是伪代码/实现:

for given_url in url_list:
    print ("Given URL: " + given_url)
    s = requests.Session()
    r = requests.get(given_url, allow_redirects=True)
    redirected_url = r.url
    print ("Redirected URL: " + redirected_url)

输出:

Given URL: www.xyz.com 
Redirected URL: www.123456789.com 
Given URL: www.abc.com 
Redirected URL: www.abc.com 
Given URL: www.pqr.com 
Redirected URL: www.pqr.com 

【问题讨论】:

  • 你看过r.status_coder.text吗?也许其他网站不喜欢您的 User-Agent 字符串 - 即他们不想要来自机器人的请求。
  • 当我使用 Mechanize - 我试过 br.set_handle_robots(False)。
  • 请查看r.status_coder.text 以查看是否有任何消息提示您被阻止。 br.set_handle_robots(False) 只是指示mechanize 忽略该站点的robots.txt。它对网站是否会阻止您没有影响。
  • 刚试过 r.status_code 和 r.text。我收到 400 和 401 条消息
  • 当我在浏览器中打开它们时 - 我可以在不同的选项卡中同时打开所有重定向的链接。我也尝试传递 cookie 值,不行。有什么办法可以避免代码 400 和 401。这是我们的 API,我们应该可以访问。不知道为什么我在获取第一个重定向 URL 后收到该消息

标签: python python-requests urllib2 mechanize urllib


【解决方案1】:

尝试 HEAD 请求,它不会跟随重定向或下载整个正文:

r = requests.head('http://www.google.com/')
print r.headers['Location']

【讨论】:

  • 我想出了一些办法。似乎在请求 n 次之后 - 我得到了重定向的 URL。所以我创建了一个函数(见下文)并调用该函数。
  • code def get_redirected_links(链接):尝试=尝试次数在这里,而尝试:尝试:open_link = urllib2.urlopen(链接)中断,但异常为错误:尝试-= 1返回open_link。 geturl()
  • 因此,当我使用 given_url 作为参数调用函数时,我会为所有不同的给定链接获得相同的第一个重定向 url。没有 400 或 401 错误,但我得到了相同的重定向 url。
【解决方案2】:

您提供的代码 sn-p 没有任何问题,但正如您在 cmets 中提到的,您收到了 HTTP 400401 响应。 HTTP 401 表示Unauthorized,表示该站点正在阻止您。 HTTP 400 表示Bad Request,这通常表示该站点不理解您的请求,但也可以在您被阻止时返回,我怀疑这些也是这种情况。

当我为 ABC 网站运行您的代码时,我得到了正确的重定向,这让我相信他们正在阻止您的 IP 地址,因为在短时间内发送了太多请求和/或没有设置User-Agent

既然您提到您可以在浏览器中正确打开链接,您可以尝试将您的User-Agent 字符串设置为与浏览器的字符串匹配,但这不能保证有效,因为它是网站可能使用的众多参数之一检测你是否是机器人。

例如:

headers = {'User-agent': 'Mozilla/5.0'}
r = requests.get(url, headers=headers)

【讨论】:

  • 谢谢。实际上,我在使用 mechanize 时传递了 br.addheaders = [("Chrome/59.0")] 和一个 cookie 值。我会尝试请求并确认。
  • 不。还是一样。在获取第一个重定向的 URL 之后,在我收到下一个 URL 的请求之前,有没有办法关闭会话或等待一段时间?
  • 如果您不使用 cookie,那么您根本不需要会话。如果所有的urls 都是不同的域,那么你就不会关心你在这之间等待了多少时间。您应该只关心请求同一域的频率。但是要在请求之间等待只需import time 并将time.sleep(n) 放在循环中的某个位置,其中n 是您要等待的秒数。当然,这只会在服务器决定取消阻止您之后才有效。
  • 明白了!我正在从下面的链接尝试一些东西。我会让你知道它是否有效。不是100%肯定,只是想试试。 github.com/pgaref/HTTP_Request_Randomizer
  • 它正在随机化 ip 和请求,但不将 cookie 值作为参数。似乎对该重定向网址的请求肯定需要一个cookie。因为我收到此消息 Missing Key-Pair-Id query parameter or cookie value
猜你喜欢
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
相关资源
最近更新 更多