如何使用python / urllib状态代码处理重定向仍然是200?

时间:2012-07-26 21:02:36

标签: python-2.7 web-scraping beautifulsoup urllib http-status-code-302

我在使用Python处理某个重定向时遇到问题。我正在请求一个显然加载并立即重定向到ww1.www.com的页面。我假设是这种情况,因为我已经尝试了所有我知道的返回标头/状态代码的方法,并且总是得到适当的结果(状态代码:200,适当的主机/引用程序参数等)。

这就是我所拥有的:

from BeautifulSoup import BeautifulSoup
import urllib
import psycopg2
import psycopg2.extras

db = psycopg2.connect(
                     host = 'myIP'
                     database = 'myDATABASE'
                     user = 'myUSERNAME'
                     password = 'myPASSWORD'
                     )

cursor = db.cursor(cursor_factory = psycopg2.extras.RealDictCursor)
cursor.execute("SELECT info FROM table")

for row in cursor:
    url = 'http://www.website.com/' + row['info']
    file_pointer = urllib.urlopen(url)
    html_object = BeautifulSoup(file_pointer)

    if file_pointer.getcode() != 200:
        continue

如果状态代码不等于200,if语句应该阻止执行任何进一步的代码,但是在本节之后我在代码中得到索引错误,并且在调查提供错误的url之后,我发现它重定向没有给我一个状态代码:302。

为什么我会在重定向时获得200状态代码响应的任何想法? (我也尝试过urllib2和httplib的等价物)另外,我怎样才能防止这种情况发生呢?

1 个答案:

答案 0 :(得分:2)

一件看起来不正确的事情

html_object = BeautifulSoup(file_pointer)应该对来自urlopen的数据进行操作,而不是对句柄进行操作: - 所以 - html_object = BeautifulSoup(file_pointer.read())就是这里所需要的......

进行调试

安装requests如果你还没有 - 这是一个很棒的库,可用于这些事情。

然后:

import requests
for row in cursor:
    page = requests.get('your url')
    for hist in page.history:
        print hist.status_code, hist.url

看看是否会抛出任何令人费解的事情......