scrapy抓取所有网站域名

摘要:
需求分析从门户网站开始,并尝试抓取门户网站的所有链接。如果您重复,新域名将被保存,每个域名网站将仅爬网一次。即使世界上有1亿个域名,这个程序也无法找到所有的域名,因为我没有访问所有的页面来节省时间,每个域名网站只访问一次。

需求分析

从一个门户网站出发,试图爬取该门户网站所有链接,如此递归下去,发现新域名则保存起来,每个域名网站只爬取一次。有了这些数据在通过外部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亿个,每个域名长度10个字符(统计了100个域名的平均长度)

查看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亿个域名,这个程序也不能将他们全部找到,因为为了节约时间我没有访问所有网页,

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

免责声明:文章转载自《scrapy抓取所有网站域名》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇emacs 从入门到入门Android OpenStreetMap(OSM) 使用 osmbonuspack 进行导航下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

接口调用帮助类(http调接口、WebService动态调接口)

1.HttpGetPost调用接口实现 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Net; 6 using System.IO; 7 8 namespace He...

HttpClient的get和post方式提交数据的使用

/** * Http工具类 */ public class HttpUtil { // 创建HttpClient对象 public static HttpClient httpClient = new DefaultHttpClient(); public static final String BASE_URL =...

暴力猴

https://www.52pojie.cn/thread-614101-1-1.html 不建议阅读者: 前端大神 想要深入学习(涉及到分析挖掘调用网站中js算法/自己写算法)油猴脚本的读者【备注:楼主也不会,楼主也很绝望啊...】 阅读以下内容所需知识: javascript/jQuery基础知识【李炎恢的JavaScript教程(http://...

pyqt5 + pyinstaller 制作爬虫小程序

环境:mac python3.7 pyqt5 pyinstaller ps: 主要是熟悉pyqt5, 加入了单选框 输入框 文本框 文件夹选择框及日历下拉框 效果图: pyqt5 主程序文件  # -*- coding: utf-8 -*- # @Author: Mehaei # @Date: 2019-07-10 13:02:56 # @Last...

微博内容中的短地址 分析

引自 http://www.nowamagic.net/webdesign/webdesign_ShortUrlInTwitter.php 短网址应用已经在全国各大微博上开始流行了起来。例如QQ微博的url.cn,新郎的sinaurl.cn等。 我们在QQ微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://url.cn/2hytQx...

域名设置A记录或CNAME记录,但无法被解析,可能是因为状态为:clientHold

解决方案: 访问https://whois.aliyun.com/查询域名状态是否为“注册商禁止解析”; 若是,联系注册商根据对方要求进行操作以便解除。 https://icann.org/epp#clientHold 这个状态码告诉你的域名的注册表不激活您的DNS域,因此,它不会解决。这是一个罕见的状态,通常是制定法律纠纷期间,未付款,或当你的域必...