我正在编写一个使用 CURL 从网站上抓取数据的 php 应用程序。但是使用 curl 加载网站所需的时间非常非常慢。比在 Chrome 中加载所需的时间慢很多,尽管 Chrome 会加载很多其他内容,例如电子表格和图像,而 php 应用程序不会。
无论如何,我读到 curl 可能存在 DNS 查找问题,因此通过 IP 访问可能会快得多。
但我不确定该怎么做。
让我们以 Google 为例。我可以打开命令提示符并执行“ping www.google.com”。它回答:
Pinging www.google.com [74.125.232.114] with 32 bytes of data...
那么我可以使用该 IP 地址,这可行,但如果我想访问例如:www.google.com/doodles
如果我在 ping 时尝试输入该地址,它会说找不到主机,而且这样做http://74.125.232.114/doodles
也不起作用。
(Error: Not Found The requested URL /doodles was not found on this server.)
那么我该如何通过 IP 来访问呢?
答案1
您正尝试通过 IP 访问基于 VirtualHost 的网站。问题在于 curl 无法将其尝试访问的主机名提供给网络服务器,因此网络服务器不知道要提供哪个页面(google.com 可能也托管 gmail.com,但它不知道要给您什么,因为 curl 不会询问)。
要让 curl 使用主机名,您可以/etc/hosts
使用以下信息修改文件:
74.125.232.114 google.com
(在 Windows 上,您可以在 中找到此文件C:\Windows\System32\Drivers\etc\hosts
)
如果你让 curl 向 example.com 发出请求,你的操作系统会在文件中找到 example.com /etc/hosts
,甚至不会尝试进行 DNS 查找,这将是很多快点。
话虽如此,如果您修复 DNS 设置,情况会好得多。您是否尝试过/etc/resolv.conf
使用提供商的名称服务器(或 Google Public DNS)修改该文件?
nameserver 8.8.8.8
nameserver 8.8.4.4
答案2
如果 DNS 响应时间很长,您应该修复网络中的 DNS 设置。查看/etc/resolv.conf
并检查列出的名称服务器是否仍然可用。如果没有,请添加一个可用的 DNS 服务器(在顶部)。例如,您可以使用 google 的 DNS 服务:
nameserver 8.8.8.8
如果您出于任何原因需要慢速 DNS 服务器,这可能是因为您的应用程序正在使用互联网上不可用的内部 DNS 名称,那么您仍然可以修改文件/etc/hosts
并在那里添加主机名74.125.232.114
:
74.125.232.114 www.google.com
中具有常见设置/etc/nsswitch.conf
,系统将/etc/hosts
在执行 DNS 请求之前使用。
答案3
使用 -L 进行重定向(因为curl www.google.com
页面已被移动),
并且已经提到,当通过 IP 执行此操作时,主机头不会被填写。
那么,指定主机头怎么样?
curl -L -H “主机:www.google.com” 173.194.34.115/doodles