2017-07-24 31 views
1

我有一个巨大的URL列表,重定向到不同的URL。 我将它们从列表中提供给for循环,并尝试打印重定向的URL无法在Python中获取重定向的URL。尝试使用请求,urllib,urllib2和机械化

第一个重定向的URL可以正常打印。 但是从第二个 - 请求只是停止给我重定向的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 
+0

你有没有看着'r.status_code'和'河text'?也许其他网站不喜欢你的'用户代理'字符串 - 即他们不想要机器人的请求。 – Imran

+0

当我使用机械化 - 我试过br.set_handle_robots(False)。 –

+0

请查看'r.status_code'和'r.text'来查看是否有消息表明您被阻止。 'br.set_handle_robots(False)'只是指示'mechanize'忽略网站的'robots.txt'。它不会影响该网站是否会阻止您。 – Imran

回答

0

这没有什么错的代码片断您所提供的,但是当你在你的评论中提到获得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) 
+0

谢谢。实际上,当我使用机械化时,我传递了br.addheaders = [(“Chrome/59.0”)]和一个cookie值。我会尝试请求并确认。 –

+0

没有。还是一样。有没有办法关闭会话或在获取第一个重定向的URL之后等待某个时间,然后再获取下一个请求? –

+0

如果您不使用cookies,则根本不需要会话。如果所有的'urls'都是不同的域名,那么你并不在乎你在这两者之间等待了多少时间。您应该只关心您请求相同域名的频率。但是要在请求之间等待,只需简单地'import time'并在'loop'的某处放置'time.sleep(n)',其中'n'是您想要等待的秒数。这只会在服务器决定解除阻止之后才起作用,当然。 – Imran

1

尝试HEAD请求,也不会进行重定向或下载整个身体:

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

试过了。不行。 –

+0

虽然我想出了一些东西。好像在请求了n次之后 - 我得到了重定向的URL。所以我创建了一个函数(见下文)并调用该函数。 –

+0

'code'高清get_redirected_links(链接): 尝试=尝试#到这里 而尝试: 尝试: OPEN_LINK = urllib2.urlopen(链接) 休息 除了异常的错误: 尝试 - = 1个 回报OPEN_LINK .geturl() –

相关问题