3

我目前正在尝试审核大量重定向 URL 句柄,以确保它们的目的地仍然有效。

我正在使用 aiohttp 浏览大量数据以生成报告。

try:
    with aiohttp.Timeout(timeout):
        async with session.get(url) as resp:
            return {"Handle URL": url,
                    "Status Code": resp.status,
                    "Redirects": resp.url != url,
                    "Resolving URL": resp.url,
                    "Success": resp.status == 200,
                    "Message": ""}
except asyncio.TimeoutError:
        return {"Handle URL": url,
                "Success": False,
                "Message": "Handle server timed out. >{} seconds".format(timeout)}

在大多数情况下,这对于识别哪个 URL 重定向不再发送到有效 URL 是很好的。但是,我真的很想知道超时的最终地址。

有任何想法吗?

4

3 回答 3

4

唯一的方法是禁用重定向allow_redirects=False并手动执行重定向。

于 2016-07-07T09:57:06.210 回答
2
async with aiohttp.ClientSession() as session:
    async with session.get(URL, allow_redirects=False) as response:
        Location = str(response).split("Location': \'")[1].split("\'")[0]
            return Location
于 2018-03-04T02:27:14.673 回答
0

我认为不再需要为位置解析该字符串。这是一个小例子。

带有重定向的本地烧瓶服务器:

from flask import Flask, redirect

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'Hello World!'

@app.route('/redirect')
def redir():
    return redirect('/')


if __name__ == '__main__':
    app.run()

对该重定向的 aiohttp 请求:

# coding: utf-8
import asyncio
import aiohttp


async def fetch(URL):
    async with aiohttp.ClientSession() as session:
        async with session.get(URL, allow_redirects=False) as response:
            print(response.url, response.real_url, 'location' in str(response).lower())

        async with session.get(URL, allow_redirects=True) as response:
            print(response.url, response.real_url, 'location' in str(response).lower())

url = "http://127.0.0.1:5000/redirect"

async def main():
    await fetch(local_url)

loop = asyncio.new_event_loop()
loop.run_until_complete(main())

印刷:

http://127.0.0.1:5000/redirect http://127.0.0.1:5000/redirect True
http://127.0.0.1:5000/ http://127.0.0.1:5000/ False

根据文档url,和之间的区别在于real_urlreal_url 是原始请求的原始字符串,而不是被剥离。

于 2019-02-27T12:46:14.780 回答