【问题标题】:Is there a way in python to detect if a domain does not exist or error?python中有没有一种方法可以检测域是否不存在或错误?
【发布时间】:2022-11-23 11:26:35
【问题描述】:

我想问一下是否有可能检测到一个网站不可用或网站无法在 python 中访问?

还有一个网站显示“无法访问该网站”,在检查网络时显示状态“(失败)”

为了检测一个网站,我使用了这段代码。

import requests

exist=[]

for b in BNIPhishing:
    try:
        request = requests.get(b)
        if request.status_code == 200:
            exist.append(b)
            print('Exist')
        elif request.status_code == 204:
            print('user does not exist')
        elif request.status_code == 304:
            print('Not available')
        elif request.status_code == 504:
            print('Timeout')
        elif request.status_code == (failed):
            print('failed')
    except:
        print('Not Exist')

到目前为止,我用来检测网站的代码是这样的。我愿意就如何改进代码提出建议。

谢谢!

【问题讨论】:

  • 通常,2xx 代码表示成功 - 204 确实如此不是意思是“用户不存在”,通常 204 表示不需要呈现的成功响应(经典示例是单击“保存”按钮,唯一的响应是否成功)。这里有一个很好的 http 状态代码概述 developer.mozilla.org/en-US/docs/Web/HTTP/Status
  • 您是否正在寻求确定 FQDN 是否有效或网站是否可访问?
  • requests.get()正在寻找一个网络服务器在那个地址。这当然有可能主持人存在,但没有运行网络服务器.
  • @Grismar 我忘了删除它,我使用了一个特定的代码,其中可以通过检查网络 url 位置获得一个特殊的 url,如果状态为 204,则从那里显示来自网络的链接和状态代码,并且它有效.
  • @DavidMoruzzi 如果两者都有可能

标签: python jupyter-notebook python-requests


【解决方案1】:
import requests

sites_to_be_evaluated = [
    'http://example.com',
    'http://example.net',
    'http://example.gov'
]

sites_accessible = []
valid_dns = []

for site in sites_to_be_evaluated:
    try:
        fqdn = site.split('//')[1]
        if requests.get(f'https://dns.google/resolve?name={fqdn}&type=ANY').json()['Status'] == 0:
            valid_dns.append(fqdn)
        if requests.get(site).status_code == 200:  # 200 is the status code for a successful request
            sites_accessible.append(site)
    except requests.exceptions.ConnectionError:
        pass

print(f'The following sites are accessible: {sites_accessible}')
>> The following sites are accessible: ['http://example.com', 'http://example.net']
print(f'The following sites have valid DNS: {valid_dns}')
>> The following sites have valid DNS: ['example.com', 'example.net']

仅仅因为网站返回 200 OK 并不意味着该网站有用。它可能是一个停放的网站,仅包含广告。同样,如果网站没有响应 - 这仅表示请求者无法收到请求。

如果您使用 Google 的 DNS API 服务,请阅读他们的documentation并尊重他们的基础设施。

【讨论】:

    【解决方案2】:

    一般来说,如果 requests.get() 抛出 ConnectionError 异常,那么主机名不存在,或者无法访问,或者没有为网站提供服务。

    否则,如果 requests.get() 没有抛出异常(不管特定的 http 返回码),那么该地址确实存在一个网站。

    【讨论】:

    • 是的,这就是为什么它很烦人的原因,即使将 status_code = 200,仍然有一些方法无法访问的站点可以通过请求。例如第二张图片,对于 odoo,我知道它更难检测,但如果没有请求的帮助,有一种特殊的方法可以知道 odoo 网站不存在,我会征求建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多