心理援助中心 發表於 2019-9-4 01:27:00

scrapy抓取所有网站域名

<p>&nbsp;</p>
<h3>需求分析</h3>
<p>从一个门户网站出发,试图爬取该门户网站所有链接,如此递归下去,发现新域名则保存起来,每个域名网站只爬取一次。有了这些数据在通过外部DNS获得IP,就可以自己搭建DNS服务器了</p>
<p>&nbsp;</p>
<h3>创建项目</h3>
<p>创建一个项目,名叫crawl_all_domainname</p>
<div class="cnblogs_Highlighter">
<pre class="ply_style_code_01">scrapy startproject crawl_all_domainname</pre>
</div>
<p>创建爬虫脚本domain.py, 从han123.com开始爬行</p>
<div class="cnblogs_Highlighter">
<pre class="ply_style_code_01">cd crawl_all_domainname/crawl_all_domainname
crawl_all_domainname&gt;scrapy genspider domain hao123.com  </pre>
</div>
<p>修改配置文件,忽略robots.txt</p>
<div class="cnblogs_Highlighter">
<pre class="ply_style_code_01">ROBOTSTXT_OBEY = False</pre>
</div>
<h3>代码实现</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> -*- coding: utf-8 -*-</span>
<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> scrapy
</span><span style="color: rgba(0, 0, 255, 1)">from</span> urllib <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> parse
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> re

already_crawl_dn</span>=<span style="color: rgba(0, 0, 0, 1)">[]
</span><span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> DomainSpider(scrapy.Spider):
    name </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">domain</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    start_urls </span>= [<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">http://hao123.com/</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">]

    </span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> parse(self, response):

      </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">将已爬取的域名存入列表already_crawl</span>
      domain = parse.urlparse(response._url).netloc.lstrip(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">www.</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
      already_crawl_dn.append(domain)
      </span><span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Crawl %s Done</span><span style="color: rgba(128, 0, 0, 1)">'</span> %<span style="color: rgba(0, 0, 0, 1)"> domain)

      
      </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">1.提取html页面中所有a标签中的href属性</span>
      <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">2.提取有效url(http://www...或https://www...)</span>
      <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">3.将url转化为域名,在用set去重 </span>
      dns = set()

      </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">4.提取urls中没有爬取过的url,</span>
      dns =

      </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">将新发现未爬取的域名交给蜘蛛</span>
      <span style="color: rgba(0, 0, 255, 1)">for</span> dn <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> dns:
            </span><span style="color: rgba(0, 0, 255, 1)">yield</span> scrapy.Request(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://www.</span><span style="color: rgba(128, 0, 0, 1)">"</span> + dn, callback=<span style="color: rgba(0, 0, 0, 1)">self.parse)

    </span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> close(spider, reason):
      </span><span style="color: rgba(0, 0, 255, 1)">print</span>(already_crawl_dn)</pre>
</div>
<p>&nbsp;现在已经可以抓取域名了,目前有个问题是这些域名存在列表(内存)中,随着程序运行内存会慢慢被占满。我没找的最新的全球域名数统计,但找到了:</p>
<div class="cnblogs_Highlighter">
<pre class="ply_style_code_01">截至2015年6月,中国域名总数为2231万个,其中“.CN”域名总数为1225万个,占中国域名总数比例为54.9%,“.中国”域名总数为26万个</pre>
</div>
<p>&nbsp;假设目前全球域名总数1亿个,每个域名长度10个字符(统计了100个域名的平均长度)</p>
<p>查看1亿个域名所占用内存</p>
<div class="cnblogs_Highlighter">
<pre class="ply_style_code_01">In : domainNames = ['xxxxxx.com'] * 100000000

In : import sys

In : sys.getsizeof(domainNames) / 1024 / 1024
Out: 762.9395141601562</pre>
</div>
<p>占用了762M,以现在电脑配置绰绰有余了,在看看所需时间</p>
<p>抓取每个域名的平均实际1s(统计了100个域名的平均时间),1亿个需要4年。即使全球目前真的有1亿个域名,这个程序也不能将他们全部找到,因为为了节约时间我没有访问所有网页,</p>
<p>每个域名网站只访问了一次(只访问了主页)。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/plyonfly/p/11456676.html
頁: [1]
查看完整版本: scrapy抓取所有网站域名