【问题标题】:How to handle redirects with python/urllib status code still 200?如何处理 python/urllib 状态码仍为 200 的重定向?
【发布时间】:2012-07-25 13:17:08
【问题描述】:

我在使用 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 的等价物)另外,我怎样才能防止这种情况发生?

【问题讨论】:

  • 你可能想检查页面是否有 rel="canonical"

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


【解决方案1】:

一件事看起来不对

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

看看这是否会抛出任何令人费解的东西......

【讨论】:

  • @That1Guy 是的 - Javascript 有时对于这样的事情来说是一种痛苦!
猜你喜欢
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多