有很多朋友想学Python,但是找不到方法。我在这里汇编了一些关于Python的学习材料,从基础到入门再到实战。需要它的朋友可以关注它,并通过私人信件“01”免费获得它...
想学习没有Python基础的爬行动物吗?事实上,您可以在实现crawler的过程中尝试学习Python。Python本身不难上手,有良好编程天赋的人也不难使用这种学习方法...
“开始”是一个很好的动机,但它可能工作缓慢。如果你手里或脑子里有一个项目,那么在实践中你会被目标所驱使,不会像学习模块一样学习缓慢。
此外,如果知识系统中的每个知识点都是图中的一个点,并且依赖关系是一条边,那么该图一定不是有向无环图因为学习a的经验可以帮助你学习b因此,你不需要学习如何“开始”,因为没有这样的“开始”点!你需要学习的是如何做更大的事情。在这个过程中,你会很快学会你需要学的东西。当然,你可以说你需要先了解蟒蛇,否则你怎么能学习蟒蛇成为爬虫呢?然而,事实上,你可以在做这个爬虫的时候学习python。
讲述了crawler是如何工作的以及它是如何在python中实现的让我们长话短说:你需要学习:首先你需要了解爬行动物是如何工作的。
想象你是一只蜘蛛,现在你被放到了互联网上然后,你需要阅读所有的网页。我该怎么办?没问题,你可以从某个地方开始,比如《人民日报》的头版,这叫做首页,用美元表示。
在《人民日报》的首页,你可以看到该页面指向的各种链接。所以你高兴地爬到了“国内新闻”的页面太好了,所以你已经爬了两页了(主页和国内新闻)!就目前而言,不管抓取的页面是如何处理的,想象一下你把整个页面复制成html并放在你身上。
突然你发现在国内新闻的页面上,有一个链接链回到“主页”作为一只聪明的蜘蛛,你当然知道你不必爬回去,因为你已经见过它了。因此,你需要用你的大脑来保存你已经看过的页面的地址。这样,每当你看到一个新的链接,可能需要被抓取,你首先检查你是否已经在你的脑海中这个页面地址。如果你有,那就不要去
好的,理论上,如果所有的页面都可以从初始页面到达,那么可以证明你一定可以爬完所有的页面。
那么如何在python中实现它呢?
是非常简单的import queue
initial _ page = " http://www . Renmin ribao . com "
URL _ queue = queue . queue()
seek = set()
seek . insert(initial _ page)
URL _ queue . put(initial _ page)
while(true):#直到海水干涸,岩石破碎0:
当前url = URL队列。get () #取出队列中的第一个网址示例
存储(当前_网址)#在提取_网址(当前_网址)中存储由该网址表示的网页
或下一个_网址:#如果下一个_网址不在搜索中,请选择网址
:
搜索。将(下一个_网址)
网址_队列。放置(下一个_网址)
否则:
断开
,这已经用伪代码写了。所有爬虫的主干都在这里。让我们来分析为什么爬虫实际上是一件非常复杂的事情——搜索引擎公司通常有一个完整的团队来维护和开发它们。
2)效率
如果您直接处理上面的代码并直接运行它,您将花费整整一年的时间来了解整个豆酱内容更不用说像谷歌这样的搜索引擎需要在整个网络上爬行。
有什么问题?有太多的页面要爬,上面的代码太慢了。假设整个网络中有N个网站,那么重新评估的复杂度分析为N*log(N),因为所有的网页都需要遍历一次,并且每个集合的重新评估都需要log(N)复杂度好吧,好吧,我知道python的set实现是散列的——但是这仍然太慢,至少内存使用效率不高
通常的重判是什么?布隆过滤器。简单地说,它仍然是一个散列方法,但是它的特征是它可以使用固定的内存(不随着URL的数量而增加)来确定URL是否已经以O(1)的效率被设置不幸的是,世界上没有免费的午餐。唯一的问题是,如果这个网址没有设置,BF可以100%确认这个网址没有被看到。但是如果这个网址是固定的,它会告诉你这个网址应该已经出现了,但是我有2%的不确定性。请注意,当您分配的内存足够大时,这里的不确定性会变得非常小。
是好的。现在它已经接近处理重判的最快方法了。另一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈,你就必须加快这个速度。如果一台机器不够用,使用多台!当然,让我们假设每台机器都已经达到了最高效率——使用多线程(python,多进程)

3)在集群中对豆瓣菜进行
爬行时,我使用了100多台机器24小时运行了一个月。想象一下,如果你只使用一台机器,你将不得不运行它100个月...
。然后,假设您现在有100台机器可用,您如何在python中实现分布式爬行算法?
我们将100台机器中计算能力较低的99台机器称为从属机器,将计算能力较大的另一台机器称为主机器。回头看看上面代码中的url_queue,如果我们能把这个队列放在这个主机上,所有的从机都可以通过网络连接到主机。每当从机下载完一个网页,它就会向主机请求一个新网页来抓取它。每当从机捕获一个新网页时,它将网页上的所有链接发送到主机队列。类似地,bloom filter也放置在master上,但是现在master只向slave发送未被访问的url。布隆过滤器放在主机的内存中,访问的网址放在主机上运行的Redis中,从而确保所有操作都是O(1)(至少分裂是O(1)。关于Redis的访问效率,请参见:LINSERT-Redis)
考虑如何在python中实现它:
在每个从机上安装scrapy,然后每个机器将成为具有抓取能力的从机,并且Redis和rq将被安装在主机上用作分布式队列。然后,
代码被写为# slave。py
current _ URL = request _ from _ master()
to _ send =
正如你所想,这里的每一点都可以被许多研究者研究十多年。尽管如此,
“在修远还有很长的路要走,我会上下寻找。”
所以不要问如何开始,只要上路