【问题标题】:How to quickly check if domain exists? [duplicate]如何快速检查域是否存在? [复制]
【发布时间】:2021-03-08 14:30:37
【问题描述】:

我有大量域列表,我需要检查域现在是否可用。我是这样做的:

import requests
list_domain = ['google.com', 'facebook.com']
for domain in list_domain:
    result = requests.get(f'http://{domain}', timeout=10)
    if result.status_code == 200:
        print(f'Domain {domain} [+++]')
    else:
        print(f'Domain {domain} [---]')

但是检查太慢了。有没有办法让它更快?也许有人知道另一种检查域是否存在的方法?

【问题讨论】:

  • 嗯,这在互联网上有些禁忌,但您可以考虑并行(使用多处理)或异步执行请求。
  • @venky__ 这个答案不适合我。这些示例不适用于 Windows + Python3。

标签: python


【解决方案1】:

如果您想检查哪些域可用,更正确的方法是从requests 模块中捕获ConnectionError,因为即使您得到的响应代码不是200,事实上有响应意味着存在与该域关联的服务器。因此,域被占用。

这并不是检查域可用性的完整证据,因为域可能已被占用,但可能没有与之关联的适当 A 记录,或者服务器可能暂时停机。

下面的代码也是异步的。

from concurrent.futures import ThreadPoolExecutor
import requests
from requests.exceptions import ConnectionError

def validate_existence(domain):
    try:
        response = requests.get(f'http://{domain}', timeout=10)
    except ConnectionError:
        print(f'Domain {domain} [---]')
    else:
        print(f'Domain {domain} [+++]')


list_domain = ['google.com', 'facebook.com', 'nonexistent_domain.test']

with ThreadPoolExecutor() as executor:
    executor.map(validate_existence, list_domain)

【讨论】:

    【解决方案2】:

    您可以通过“requests-futures”模块做到这一点。 requests-futures 异步运行,如果你有一个平均互联网连接,它可以每秒检查 8-10 个 url(根据我的经验)。

    【讨论】:

      【解决方案3】:

      您可以使用套接字库来确定域是否具有 DNS 条目:

      >>> import socket
      >>> 
      >>> addr = socket.gethostbyname('google.com')
      >>> addr
      '74.125.193.100'
      >>> socket.gethostbyname('googl42652267e.com')
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      socket.gaierror: [Errno -2] Name or service not known
      >>> 
      
      

      【讨论】:

        【解决方案4】:

        您可以做的是多次运行该脚本,但每次只添加有限数量的域以加快速度。

        【讨论】:

        【解决方案5】:

        使用 scrapy 会更快,默认情况下它只会产生 200 个响应,直到你超越它,所以在你的情况下跟我来

        pip install scrapy 
        

        在您的项目文件夹中安装后用户终端创建项目

        Scrapy startproject projectname projectdir
        

        它将创建文件夹名称 projectdir

        现在

        cd projectdir
        

        在projectdir里面输入

        scrapy genspider mydomain mydomain.com
        

        现在导航到打开 mydomain.py 的蜘蛛文件夹

        现在添加几行代码

        import scrapy
        
        
        class MydomainSpider(scrapy.Spider):
            name = "mydomain"
        
            def start_requests(self):
                urls = [
                    'facebook.com',
                    'Google.com',
                ]
                for url in urls:
                    yield scrapy.Request(url=url, callback=self.parse)
        
            def parse(self, response):
               yield { ‘Available_Domains’ : response.url}
        

        现在回到 projectdir 并运行

        scrapy crawl mydomain -o output.csv
        

        您将在 output.csv 文件中拥有状态代码为 200 的所有工作域

        了解更多see

        【讨论】:

          猜你喜欢
          • 2018-09-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-14
          • 1970-01-01
          • 1970-01-01
          • 2012-07-20
          相关资源
          最近更新 更多