当前位置: 首页 > 后端技术 > Python

我如何开始使用Python爬虫?

时间:2023-03-26 14:58:32 Python

“开始”是一个很好的动力,但可能会很慢。如果你手上或脑子里有一个项目,那么在实践中你会被目标所驱动,而不是像学习模块那样慢慢学习。另外,如果知识体系中的每个知识点都是图中的一个点,依赖关系是边,那么这个图一定不是有向无环图。因为学习A的经验可以帮助你学习B。因此,你不需要学习如何“入门”,因为没有这个“入门”点!你需要学习的是如何制作一个比较大的东西。在这个过程中,你会很快学会你需要学习的东西。当然,你可以说你得先懂Python,不然怎么学Python做爬虫呢?但其实你可以在做这个爬虫的过程中学习Python。看到之前很多回答都提到“技术”——用什么软件怎么爬,那我就说说“道”和“技术”——爬虫是怎么工作的,用Python实现的。长话短说总结一下,你需要学习:爬虫的基本工作原理基本的http爬虫,scrapyBloomFilter如果你需要大规模的网络爬虫,你需要学习分布式爬虫的概念。其实并没有那么神秘,你只需要学习如何维护一个所有集群机器都可以有效共享的分布式队列。最简单的实现是python-rqrq和Scrapy的结合:darkrho/scrapy-redis后续处理,网页提取grangier/python-goose,存储(Mongodb)下面是一个小故事:讲一个集群,本来是写爬下整个豆瓣的经历。1)首先你需要了解爬虫是如何工作的。想象一下,你是一只蜘蛛,现在你被放到了互联网“网”上。然后,您需要阅读所有页面。我应该怎么办?没问题,你可以从任何地方开始,比如人民日报的首页,这个叫初始页,用$表示。小编推荐一位学习python的学习老师魏鑫(发音相同)。前组是:762,中组是:459,后组是:510。把以上三组数字按顺序组合起来,她就会安排学习。不管你是大牛还是新手,想转行或者想入行的都可以来一起了解学习共同进步学习!有开发工具,有很多干货和技术资料分享!在人民日报的头版,您会看到从该页面指向的各种链接。于是你兴高采烈地爬上了“国家新闻”页面。太好了,你已经爬取了两个页面(首页和国内新闻)!暂时不用担心如何处理爬取到的页面,想象一下,你把这个页面复制成一个html放到你身上。突然你发现在国内的新闻页面上,有一个返回“首页”的链接。作为一只聪明的蜘蛛,你必须知道你不必再往回爬,因为你已经看到了。所以,你需要动动脑筋,把你看过的页面地址保存下来。这样,每次看到一个可能需要爬取的新链接时,首先检查一下自己是否已经到过这个页面地址。如果你去过,不要去。那么理论上,如果所有的页面都可以从初始页面开始,那么就可以证明你一定可以爬取所有的页面。那么如何在Python中实现呢?很简单importQueueinitial_page="http://www.renminribao.com"url_queue=Queue.Queue()seen=set()seen.insert(initial_page)url_queue.put(initial_page)#always继续直到海干while(True):ifurl_queue.size()>0:#取出队列例子中的第一个urlcurrent_url=url_queue.get()#存储这个url代表的网页store(current_url)#提取这个链接的urlextract_urls(current_url)中next_url的url:如果next_url不可见:seen.put(next_url)url_queue.put(next_url)else:break已被编写为伪代码。所有爬虫的骨干都在这里。我们来分析一下为什么爬虫其实是很复杂的东西——搜索引擎公司通常有一个完整的团队来维护和开发它们。2)效率如果你直接把上面的代码处理一下,直接跑起来,你爬下豆瓣的全部内容,需要整整一年的时间。更不用说像谷歌这样的搜索引擎需要爬下整个网络的内容。哪里有问题?网页太多要爬取,上面的代码太慢了。假设全网有N个网站,那么分析判断权重的复杂度为N*log(N),因为所有的网页都需要遍历一次,需要log(N)的复杂度,reusingsetevery时间。OK,OK,我知道Python的set实现是hash——但这还是太慢了,至少内存使用效率不高。通常的重量判断方法是什么?布隆过滤器。简单来说,它仍然是一种哈希方法,但它的特点是可以使用固定的内存(不随着url的数量增长)以O(1)的效率判断url是否已经在集合中。可惜天下没有免费的午餐。唯一的问题是,如果url不在集合中,BF可以100%确定没有看到该url。但是如果这个url在集合中,它会告诉你:这个url应该出现过,但是我有2%的不确定性。请注意,当您分配的内存足够大时,这里的不确定性会变得非常小。一个简单的教程:BloomFiltersbyExample。小编推荐一位学习python的学习老师魏鑫(发音相同)。前组是:762,中组是:459,后组是:510。把以上三组数字按顺序组合起来,她就会安排学习。不管你是大牛还是新手,想转行或者想入行的都可以来一起了解学习共同进步学习!有开发工具,有很多干货和技术资料分享!注意这个特性,如果url被浏览过,可能有小概率会重复(没关系,看多了不会累)。但是如果没有读过,肯定会读到(这个很重要,否则我们会漏掉一些页面!)。好的,现在我们已经接近处理权重判断的最快方法了。另一个瓶颈——你只有一台机器。不管你的带宽有多大,只要你的机器下载网页的速度是瓶颈,那你只能加快速度。如果使用一台机器还不够-使用多台!当然,我们假设每台机器都进入了最大效率——使用多线程(在Python的情况下,是多进程)。3)在集群爬豆瓣的时候,我一共用了100多台机器日以继夜的跑了一个月。想象一下,如果你只使用一台机器,你要运行它100个月……那么,假设你现在有100台机器可用,如何用Python实现一个分布式爬虫算法呢?我们算一下这100台机器中的99台,一台容量较小的机器称为slave,另一台容量较大的机器称为master。然后查看上面代码中的url_queue。如果我们可以把这个队列放在master机器上,所有的slave都可以??通过网络跟随它。Master联通,每当slave下载完一个网页,就向master请求一个新的网页进行抓取。并且slave每次抓取一个新的网页,都会将该网页上的所有链接发送到master的队列中。同样,bloomfilter也放在master上,只是现在master只把没有访问过的url发给slave。BloomFilter放在master的内存中,访问的url放在master上运行的Redis中,这样所有的操作都是O(1)。(至少摊销是O(1),Redis的访问效率见:https://redis.io/commands/lin...考虑用Python实现:在每个slave上安装scrapy,然后每个机器将成为具有抓取能力的slave,并在master上安装Redis和rq作为分布式队列,然后代码写成slave.pycurrent_url=request_from_master()to_send=[]fornext_urlinextract_urls(current_url):to_send.append(next_url)store(current_url);send_to_master(to_send)#master.pydistributed_queue=DistributedQueue()bf=BloomFilter()initial_pages=while(True):如果请求=='GET':如果distributed_queue.size()>0:send(distributed_queue.get())else:breakelifrequest=='POST':bf.put(request.url)好了,其实你可以想象,你需要的已经有人写好了:darkrho/scrapy-redis·GitHub4)展望及后处理虽然上面用了很多“简单”,但是要实现一个可以在商业sca上使用的爬虫并不是一件容易的事乐。上面的代码用于爬取整个网站,几乎没有什么大问题。但是如果需要这些后续的处理,比如有效存储(数据库应该怎么排)有效权重判断(这里指的是网页权重判断,我们不想抓取抄袭它的人民日报和大民日报)有效的信息抽取(比如如何抽取网页上的所有地址“朝阳区奋进路中华路”),搜索引擎通常不需要存储所有的信息,比如我为什么保存图片...Updateintime(预测这个页面多久更新一次)可以想象,这里的每一个点都可以被很多研究者研究十几年。即便如此,“路漫漫其修远兮,吾将上下求索”。