python - 使用浏览器用户代理检查网站是否在 python 中响应

标签 python web request dns resolve

我正在尝试编写一个脚本来检查域名是否通过 dns 解析为其 IP 地址;使用我写的Python脚本。

我希望能够在几个连续的循环中执行此操作,但是在尝试运行一次循环后,第二次运行脚本时,以前返回成功的 dns 解析响应的名称现在没有。

下面是我的脚本:

#! C:\Python27
import socket,time

localtime = time.asctime( time.localtime(time.time()) )


def hostres(hostname):
    print "Attempting to resolve " + hostname 
    try:
        socket.gethostbyname(hostname)
        print "Resolved Successfully!"
    except socket.error:
        print "Could Not Resolve"

print "*************************************************"
print "Website loop starting.."
print "Local current time :", localtime
print "*************************************************"
print ""

text_file = open("sites.txt", "r")
lines = text_file.readlines()
for line in lines:
    hostres(line)
text_file.close()

文本文件的内容是:

www.google.com
en.wikipedia.org
www.youtube.com
us.gamespot.com

我认为这与这些域服务器将脚本识别为“机器人”而不是合法的最终用户有关,这样的假设是否正确?

如果是这样,我如何仍然可以通过查找网站名称(或 IP,无关紧要)来检查 dns 名称是否解析,并能够运行它而不会错误地读取“请求失败”,尽管事实上该服务可以通过浏览器完全访问吗?

最佳答案

这个问题有几个问题。

  1. 您在测试 DNS 解析时并未检查“网站是否响应”。您的所有 DNS 请求都会发送到单个名称服务器,即您的 LDNS 解析器。如果所有问题都解决了,它仍然不会说明网站的状态。此外,由于您实际上并未与这些网站交谈,因此他们无法知道您是机器人。仅当您发出 HTTP 请求时,他们才能检测到这一点(基于 HTTP 用户代理 header )。
  2. 关于您的代码问题,您需要先修剪换行符,然后才能对其执行 socket.gethostbyname() 。将 socket.gethostbyname(hostname) 替换为 socket.gethostbyname(hostname.rstrip()) 就可以了。

关于python - 使用浏览器用户代理检查网站是否在 python 中响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11629954/

相关文章:

javascript - ag-grid:如何连接自定义主题?

javascript - ReactJS 和 Vanilla JavaScript 可以在同一个 .js 文件中使用吗?

ruby-on-rails - http put请求导致 "net::ERR_TOO_MANY_REDIRECTS"错误

ios - 获取游戏请求ID/获取Facebook游戏请求通知内容

python - 如何使用 Curl 发布文件列表

python - Pycharm编译错误

python - 数据框将文本拆分为新列

javascript - 如何制作调查机器人?

python - 我发现使用 Pygrib 访问 grb2 文件非常慢且耗时,对所有人来说都一样吗?

performance - Chrome DevTools 中帧渲染的空闲时间