Scrapy是一个用于Python的开源网络爬虫框架,它允许开发者高效地从网站上抓取数据。Scrapy使用Twisted网络库来处理网络通信,包括DNS查找。
当Scrapy在尝试解析域名时遇到DNS查找失败的情况,通常是因为以下原因:
确保你的网络连接正常,可以尝试访问其他网站来确认。
可以尝试更换DNS服务器,例如使用Google的公共DNS(8.8.8.8和8.8.4.4)或其他可靠的DNS服务。
在Linux系统中,可以编辑/etc/resolv.conf
文件来更改DNS服务器:
nameserver 8.8.8.8
nameserver 8.8.4.4
在Windows系统中,可以在网络设置中更改DNS服务器。
确认你要访问的域名是有效的,并且没有过期。
Scrapy允许你自定义DNS解析器。你可以创建一个自定义的DNS解析器来处理DNS查找失败的情况。以下是一个示例:
import dns.resolver
from twisted.internet import defer, error
from scrapy.core.downloader.contextfactory import ScrapyHTTPClientContextFactory
from scrapy.utils.misc import load_object
class CustomDNSResolver(dns.resolver.Resolver):
def query(self, qname, rdtype=dns.rdatatype.A, lifetime=None):
try:
return super().query(qname, rdtype, lifetime)
except dns.resolver.NXDOMAIN:
return defer.fail(error.DNSLookupError(qname))
except dns.resolver.NoAnswer:
return defer.fail(error.DNSLookupError(qname))
except dns.resolver.Timeout:
return defer.fail(error.DNSLookupError(qname))
class CustomHTTPClientContextFactory(ScrapyHTTPClientContextFactory):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.dns_resolver = CustomDNSResolver()
def custom_settings():
return {
'DOWNLOADER_CLIENT_TLS_CIPHERS': 'DEFAULT',
'DOWNLOADER_CLIENT_TLS_METHOD': 'TLSv1.2',
'DOWNLOADER_CLIENT_TLS_OPTIONS': {
'ssl_version': ssl.PROTOCOL_TLSv1_2,
},
'DOWNLOADER_MIDDLEWARES': {
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
},
'RETRY_ENABLED': True,
'RETRY_TIMES': 3,
'RETRY_HTTP_CODES': [500, 502, 503, 504, 408, 403, 404, 400],
'DOWNLOAD_TIMEOUT': 15,
'CONCURRENT_REQUESTS': 16,
'CONCURRENT_REQUESTS_PER_DOMAIN': 8,
'DNS_TIMEOUT': 5,
'DNS_CACHE_ENABLED': True,
'DNS_CACHE_SIZE': 900,
'DNS_CACHE_EXPIRATION_SECS': 600,
'HTTPCACHE_ENABLED': True,
'HTTPCACHE_EXPIRATION_SECS': 0,
'HTTPCACHE_DIR': 'httpcache',
'HTTPCACHE_IGNORE_HTTP_CODES': [],
'HTTPCACHE_STORAGE': 'scrapy.extensions.httpcache.FilesystemCacheStorage',
}
# 在Scrapy项目中使用自定义设置
settings = custom_settings()
如果DNS查找失败是由于某些网站对IP地址进行了限制,可以尝试使用代理服务器来绕过这些限制。
通过以上方法,你应该能够解决Scrapy不会生成DNS查找失败网站的网站urls的问题。
领取专属 10元无门槛券
手把手带您无忧上云