我目前正在尝试审核大量重定向网址句柄,以确保其目标仍然有效。
我正在使用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。但是,我真的很想知道超时的最终地址。
有什么想法吗?
答案 0 :(得分:2)
唯一的方法是通过allow_redirects=False
停用重定向并手动执行重定向。
答案 1 :(得分:0)
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
答案 2 :(得分: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
根据docs,url
和real_url
之间的区别在于real_url是原始请求的原始字符串,未剥离。