scrapy抓取所有网站域名

匿名 (未验证) 提交于 2019-12-02 23:57:01

需求分析

从一个门户网站出发,试图爬取该门户网站所有链接,如此递归下去,发现新域名则保存起来,每个域名网站只爬取一次。有了这些数据在通过外部DNS获得IP,就可以自己搭建DNS服务器了

创建项目

创建一个项目,名叫crawl_all_domainname

scrapy startproject crawl_all_domainname

创建爬虫较本domain.py, 从han123.com开始爬行

cd crawl_all_domainname/crawl_all_domainname crawl_all_domainname>scrapy genspider domain hao123.com  

修改配置文件,忽略robots.txt

ROBOTSTXT_OBEY = False

代码实现

# -*- coding: utf-8 -*- import scrapy from urllib import parse import re  already_crawl_dn=[] class DomainSpider(scrapy.Spider):     name = 'domain'     start_urls = ['http://hao123.com/']      def parse(self, response):          #将已爬取的域名存入列表already_crawl         domain = parse.urlparse(response._url).netloc.lstrip('www.')         already_crawl_dn.append(domain)         print('Crawl %s Done' % domain)                   #1.提取html页面中所有a标签中的href属性         #2.提取有效url(http://www...或https://www...)         #3.将url转化为域名,在用set去重          dns = set([parse.urlparse(url).netloc.lstrip('www.') for url in response.css('a::attr(href)').getall() if re.fullmatch('(https|http)://www.*', url)])          #4.提取urls中没有爬取过的url,         dns = [dn for dn in dns if dn not in already_crawl_dn]          #将新发现未爬取的域名交给蜘蛛         for dn in dns:             yield scrapy.Request("https://www." + dn, callback=self.parse)      def close(spider, reason):         print(already_crawl_dn)

截至2015年6月,中国域名总数为2231万个,其中“.CN”域名总数为1225万个,占中国域名总数比例为54.9%,“.中国”域名总数为26万个

查看1亿个域名所占用内存

In [147]: domainNames = ['xxxxxx.com'] * 100000000  In [148]: import sys  In [149]: sys.getsizeof(domainNames) / 1024 / 1024 Out[149]: 762.9395141601562

占用了762M,以现在电脑配置绰绰有余了,在看看所需时间

抓取每个域名的平均实际1s(统计了100个域名的平均时间),1亿个需要4年。即使全球目前真的有1亿个域名,这个程序也不能将他们全部找到,因为为了节约时间我没有访问所有网页,

每个域名网站只访问了一次(只访问了主页)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!