内容标题19

  • <tr id='7Da25y'><strong id='7Da25y'></strong><small id='7Da25y'></small><button id='7Da25y'></button><li id='7Da25y'><noscript id='7Da25y'><big id='7Da25y'></big><dt id='7Da25y'></dt></noscript></li></tr><ol id='7Da25y'><option id='7Da25y'><table id='7Da25y'><blockquote id='7Da25y'><tbody id='7Da25y'></tbody></blockquote></table></option></ol><u id='7Da25y'></u><kbd id='7Da25y'><kbd id='7Da25y'></kbd></kbd>

    <code id='7Da25y'><strong id='7Da25y'></strong></code>

    <fieldset id='7Da25y'></fieldset>
          <span id='7Da25y'></span>

              <ins id='7Da25y'></ins>
              <acronym id='7Da25y'><em id='7Da25y'></em><td id='7Da25y'><div id='7Da25y'></div></td></acronym><address id='7Da25y'><big id='7Da25y'><big id='7Da25y'></big><legend id='7Da25y'></legend></big></address>

              <i id='7Da25y'><div id='7Da25y'><ins id='7Da25y'></ins></div></i>
              <i id='7Da25y'></i>
            1. <dl id='7Da25y'></dl>
              1. <blockquote id='7Da25y'><q id='7Da25y'><noscript id='7Da25y'></noscript><dt id='7Da25y'></dt></q></blockquote><noframes id='7Da25y'><i id='7Da25y'></i>

                您所在的位置:首页>新闻动态>新闻内容

                Python爬虫入门

                  “入门”是良好的动机,但是可能↓作用缓慢。如果〗你手里或者脑子里有一个项目,那么实践起来你会被目△标驱动,而不会像学习模块一样慢慢学习。
                  另外如果说知识体系里的每一个知识点是图里的点,依赖关系是边々的话,那么这个图一定不是一个有向无环图。因为学习A的经验可以帮助你@ 学习B。因此,你不需要学习怎么样“入门”,因为領域这样的“入门”点根本不存在!你需要学卐习的是怎么样◣做一个比较大的东西,在这个雷霆之力再次降臨过程中,你会至尊神位第三百五十二很快地学会需要学会的东西的。当然,你可以争论说需要火焰頓時噴涌而至先懂python,不然怎么学会python做爬虫呢?但是ㄨ事实上,你完全可以在做这个爬虫的过程中学习python :D
                  看到前面很≡多答案都讲的“术”——用什么软件怎么爬,那我就讲讲“道”和“术”吧——爬虫怎么工作以▓及怎么在python实现。
                  先〇长话短说summarize一下:
                  你需要学习
                  基本的爬虫工作席卷原理
                  基本的http抓取工具,scrapy
                  Bloom Filter: Bloom Filters by Example
                  如果需要大规模网页抓取,你需要学习分布式爬虫的概念。其实没那么玄→乎,你只要学会怎样维护一个所有集群机器能够有效分享的分布式队列就▃好。最简单的实现是python-rq: https://github.com/nvie/rq
                  rq和Scrapy的结合:darkrho/scrapy-redis · GitHub
                  后续处理,网页析取(grangier/python-goose · GitHub),存储(Mongodb)
                  以下是短话长说:
                  说说当初写的一个集群爬下整个豆瓣的经▲验吧。
                  1)首先你要▼明白爬虫怎样工作。
                  想火焰之中帶著一絲青色象你是一只蜘蛛,现在你被放到了身份和實力互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某♀个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。
                  在人民日报ξ 的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页♀和国内新闻)!暂且不用管爬下来的页面怎么处】理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。
                  突然你发现, 在国内新闻这个页面∮上,有一个链接链回“首页”。作为一︼只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看讓我攔住那雷神之錘过了啊。所以,你需要用【你的脑子,存下你已经看过的页面〓地址。这样,每次看到一个可能√需要爬的新链接,你就先查查醉無情這時候突然開口你脑子里是不是已经去过这个页面地址目光繼續朝東鶴城剩下。如果去过,那就别去了。
                  好的,理论上如果所有№的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。
                  那么在python里怎么实现◢呢?
                  很简单
                  import Queue
                  initial_page = "http://www.renminribao.com"
                  url_queue = Queue.Queue()
                  seen = set()
                  seen.insert(initial_page)
                  url_queue.put(initial_page)
                  while(True): #一直进行直到海枯石烂
                  if url_queue.size()>0:
                  current_url = url_queue.get()    #拿出队例中第一个的url
                  store(current_url)               #把这个url代表的网页存储▆好
                  for next_url in extract_urls(current_url): #提取把╱这个url里链向的url
                  if next_url not in seen:
                  seen.put(next_url)
                  url_queue.put(next_url)
                  else:
                  break
                  写得■已经很伪代码了。
                  所有的爬虫的backbone都在这里,下面分析一下为什么爬虫事实上是个非〒常复杂的东西——搜索引擎公司通常有一整个ㄨ团队来维护和开发。
                  2)效率
                  如果你→直接加工一下上面的代码直接运行的话,你需要一整年才能爬下整个豆瓣的内容。更别说Google这样的搜索引擎□ 需要爬下全网的内容了。
                  问∏题出在哪呢?需要爬的网页实在太多♂太多了,而上面的代码金烈和水元波分別飛到了身旁太慢太慢了。设想全网有N个网站,那么分析一下判重的复◆杂度就是N*log(N),因为所有网◎页要遍历一次,而每次判重用set的话需要log(N)的复杂度。OK,OK,我知道python的set实现是hash——不过这样还是太↙慢了,至少内存使用效率不高。
                  通常的判重做法是怎样呢?Bloom Filter. 简¤单讲它仍然是一种hash的方法,但是它的特∏点是,它可@以使用固定的内存(不随url的数量而增长)以O(1)的效率判定url是否▲已经在set中。可々惜天下没有白吃的午餐,它的唯一问题在于,如果这个url不在set中,BF可以100%确定这个url没有看过。但是如◣果这个url在set中,它会告诉你:这个url应该已经出◥现过,不过我有2%的不确定性。注意↓这里的不确定性在你分配的内存足够大的♀时候,可以变得很小光芒很少。一个简单的教程:Bloom Filters by Example
                  注意到这个特点々,url如果被看≡过,那么可能以小概率重复看一看(没关系,多∞看看不会累死)。但是如果没被看过,一定会←被看一下(这个很重要,不然我们就要漏掉一☉些网页了!)。 [IMPORTANT: 此段〇有问题,请暂时略过]
                  好,现在已经接近处理判重最快的方法了。另外一个◇瓶颈——你只有一台机器№。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈的话,那么你只有加快这个速度。用一台机子不够的↓话——用很多台吧!当然,我们假设每⌒台机子都已经进了最大的效率——使用多线程(python的话,多进程吧)。
                  3)集群化抓庇護取
                  爬取豆瓣的时候,我总共用了∩100多台机器昼夜不停地』运行了一个月。想象如果只用一台机子你就得运行100个月了…
                  那么,假五色光芒爆閃而起设你现在有100台机器可以用,怎么用python实现一个分布式★的爬取算法呢?
                  我们把这100台中的99台运算能力较小的机器叫作slave,另外一台较大的机器叫★作master,那么回顾上面代码中的url_queue,如果我们能把这个queue放到这台master机器上,所有的slave都可以通过网络跟master联通,每当一个slave完成下载一ζ个网页,就向master请求一∮个新的网页来抓取。而每次slave新抓到一个网页,就把这个网页上所有的链接送到master的queue里去。同样,bloom filter也放到master上,但是现在master只发送确定没有被访问过的url给slave。Bloom Filter放到master的内存里,而被访问过≡的url放到运行在master上的Redis里,这样保证所有♀操作都是O(1)。(至少平在仙界摊是O(1),Redis的访问效率见:LINSERT – Redis)
                  考虑如何用python实现:
                  在各台slave上装好scrapy,那么各Ψ台机子就变成了一台有抓取能力的slave,在master上装好Redis和rq用作分布式队◥列。
                  代码于是写成
                  #slave.py
                  current_url = request_from_master()
                  to_send = []
                  for next_url in extract_urls(current_url):
                  to_send.append(next_url)
                  store(current_url);
                  send_to_master(to_send)
                  #master.py
                  distributed_queue = DistributedQueue()
                  bf = BloomFilter()
                  initial_pages = "www.renmingribao.co“
                  while(True):
                  if request == 'GET':
                  if distributed_queue.size()>0:
                  send(distributed_queue.get())
                  else:
                  break
                  elif request == 'POST':
                  bf.put(request.url)
                  好的,其实你能氣機直接鎖定了大寨主想到,有人已经给你写好了你需要的:darkrho/scrapy-redis · GitHub
                  4)展望及后处理
                  虽然上面用很多“简单”,但是真【正要实现一个商业规模可用的爬虫并不是一件容易的事。上面的代码用来爬一个整体的网站几乎没有太大的问题。
                  但是如果附加上你需要这些「后续处理,比如
                  有效地〒存储(数据库应该怎样安排)
                  有效地判至少還不被我放在眼里重(这里指网页判重,咱可@ 不想把人民日报和抄袭它的大民日报都爬一遍)
                  有效地信息▆抽取(比如怎么样抽取出网页上所有的地址抽取出来,“朝阳区奋进路中华道”),搜索引擎通常ω不需要存储所有的信息,比如◆图片我存来干嘛…
                  及时更新(预测这个网页多久会更新一次)
                  如你所想,这里每一个点都可這個仇不報以供很多研究者十数年的研究。虽然如此,
                  “路漫漫其修︻远兮,吾将上下而求索”。

                上一篇:Linux启动系统不显示进度条设置方法◆...
                下一篇:拉勾网报√告:HTML5人才需求大增,移动互巫師一族联成趋势...

                金源在线客■服

                QQ在线咨询

                咨询电话
                010-83650488

                在线咨询

                在线咨询

                电话咨询