python - 从 url 派生协议
问题描述
我确实有一个 URL 列表,例如["www.bol.com ","www.dopper.com"]
格式。为了在 scrappy 上作为起始 URL 输入,我需要知道正确的 HTTP 协议。
例如:
["https://www.bol.com/nl/nl/", "https://dopper.com/nl"]
如您所见,协议可能会有所不同,https
甚至http
有或没有www.
不确定是否有任何其他变化。
- 有没有可以确定正确协议的python工具?
- 如果不是,我必须自己构建逻辑,我应该考虑哪些情况?
对于选项 2,这是我目前所拥有的:
def identify_protocol(url):
try:
r = requests.get("https://" + url + "/", timeout=10)
return r.url, r.status_code
except requests.HTTPError:
r = requests.get("http//" + url + "/", timeout=10)
return r.url, r.status_code
except requests.HTTPError:
r = requests.get("https//" + url.replace("www.","") + "/", timeout=10)
return r.url, r.status_code
except:
return None, None
还有其他我应该考虑的可能性吗?
解决方案
无法直接从片段中确定协议/完整域,信息根本不存在。为了找到它,您需要:
- 正确协议/域的数据库,您可以在其中查找域片段
- 发出请求,看看服务器告诉你什么
如果您这样做(2),您当然可以逐步建立自己的数据库以避免将来需要请求。
在许多 https 服务器上,如果您尝试使用 http 连接,您将被重定向到 https。如果不是,那么您可以可靠地使用 http. 如果 http 失败,那么您可以使用 https 再试一次,看看它是否有效。
这同样适用于域:如果站点通常会重定向,您可以使用原始域执行请求并查看重定向到的位置。
使用示例requests
:
>>> import requests
>>> r = requests.get('http://bol.com')
>>> r
<Response [200]>
>>> r.url
'https://www.bol.com/nl/nl/'
如您所见,请求对象url
参数包含最终目标 URL 以及协议。
推荐阅读
- javascript - 无法从 WebWorker 内部访问某些函数和变量
- mysql - mySQL - 根据另一列中的重复项查找唯一列
- ruby - 如何让 AWS lambda 在我的函数中找到 grpc 依赖项?
- r - 替换 R 中多个变量的值
- android - Dagger 模块依赖于另一个模块
- javascript - 如何使用 javascript 中的变量创建 for 循环?
- azure - 来自 .AddAzureADB2CBearer 的 Azure SignalR Hub 授权
- sql - 如何在 django 视图中设置分页?
- python - DRF:如何在序列化程序中不允许 create()
- java - 从 odesign Sirius 文件中导出图表/节点