无法在Python中获取重定向的URL。尝试使用请求、urllib、urllib2和mechanize

无法在Python中获取重定向的URL。尝试使用请求、urllib、urllib2和mechanize,python,python-requests,urllib2,mechanize,urllib,Python,Python Requests,Urllib2,Mechanize,Urllib,我有一个巨大的URL列表,可以重定向到不同的URL。 我从列表中为它们提供for循环,并尝试打印重定向的URL 第一个重定向的URL打印得很好。 但从第二个一-请求只是停止给我重定向的URL,只是打印给定的URL 我尝试使用urllib、urllib2和mechanize实现 它们对第一个重定向的url进行罚款,然后在第二个url抛出错误并停止 谁能告诉我为什么会这样 下面是伪代码/实现: for given_url in url_list: print ("Given URL: " +

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

第一个重定向的URL打印得很好。 但从第二个一-请求只是停止给我重定向的URL,只是打印给定的URL

我尝试使用
urllib
urllib2
mechanize
实现

它们对第一个重定向的url进行罚款,然后在第二个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 

您提供的代码片段没有问题,但是正如您在评论中提到的,您将得到
htp400
401
响应<代码>HTTP 401意味着
未经授权
,这意味着该站点正在阻止您
HTTP 400
表示
错误的请求
,这通常意味着站点不理解您的请求,但当您被阻止时,它也可以被返回,我怀疑在那些站点上也是如此

当我为ABC网站运行您的代码时,我被正确重定向,这使我相信他们正在阻止您的ip地址,因为他们在短时间内发送了太多请求和/或没有
用户代理设置

由于您提到可以在浏览器中正确打开链接,因此您可以尝试将
用户代理
字符串设置为与浏览器的字符串匹配,但这并不一定有效,因为这是网站用于检测您是否是机器人的多个参数之一

例如:

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

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

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

你看过
r.status\u code
r.text
了吗?可能其他网站不喜欢你的
用户代理
字符串-也就是说,他们不想要来自机器人的请求。当我使用Mechanize时,我尝试了br.set\u handle\u robots(False)。请查看
r.status\u code
r.text
以查看是否有任何消息表明你被阻止
br.set\u handle\u robots(False)
只是指示
mechanize
忽略站点的
robots.txt
。它对网站是否会阻止你没有影响。只是尝试了r.status\u代码和r.text。当我在浏览器中打开400和401条消息时,我可以在不同的选项卡中同时打开所有重定向的链接。我也试着传递cookie值,没有成功。有没有办法避免代码400和401。这是我们的API,我们应该可以访问它。不知道为什么我在获取第一个重定向URL后收到该消息,谢谢。实际上,当我使用mechanize时,我传递了br.addheaders=[(“Chrome/59.0”)]和一个cookie值。我将尝试请求并确认。否。还是一样。有没有办法在获取第一个重定向URL之后,在我收到下一个URL的请求之前关闭会话或等待一段时间?如果你不使用cookies,那么你根本不需要会话。如果所有的
url
都是不同的域,那么你就不在乎其间等待了多长时间。您应该只关心请求同一域的频率。但要在请求之间等待,只需输入
time
并将
time.sleep(n)
放在循环中的某个地方,其中
n
是您希望等待的秒数。当然,这只有在服务器决定取消阻止你后才能起作用。明白了!我正在尝试下面的链接。我会让你知道它是否有效。不是100%确定,只是想试试。它是随机化ip和请求,但不将cookie值作为参数。似乎对重定向url的请求确实需要cookie。因为我收到了缺少密钥对Id查询参数或cookie值的消息,所以我发现了一些问题。似乎在请求n次之后-我得到了重定向的URL。因此,我创建了一个函数(见下文)并调用该函数。
code
def get_redirected_links(link):尝试次数=#尝试次数在这里,而尝试次数:try:open_link=urllib2.urlopen(link)中断,例外情况除外:错误:尝试次数-=1返回open_link.geturl()因此,当我以给定的_url作为参数调用函数时,我会为所有不同的给定链接获得相同的第一个重定向url。没有400或401错误,但我得到了相同的重定向url。