小技巧:爬虫入门必知必会,不要问怎么入门,直接上路就好了
优采云 发布时间: 2022-09-23 13:09小技巧:爬虫入门必知必会,不要问怎么入门,直接上路就好了
“开始”是一个很好的动机,但可能会很慢。如果你手头或脑子里有一个项目,在实践中你会被目标驱动,而不是像学习模块那样慢慢学习。
另外,如果知识系统中的每个知识点都是图中的一个点,并且依赖关系是边,那么图一定不是有向无环图。因为学习A的经验可以帮助你学习B。因此,你不需要学习如何“入门”,因为这样的“入门”点根本不存在!您需要学习的是如何做更大的事情,并且在此过程中,您将很快了解您需要学习的内容。当然,你可以争辩说你需要先了解python,否则你怎么能学python做爬虫呢?但其实在做这个爬虫的过程中可以学习python:D
看到前面很多回答中提到的“技能”——用什么软件怎么爬,那我就说说“道”和“技能”——爬虫是如何工作的,以及如何在python中实现。
总结一下长话短说:
你需要学习
基础爬虫工作原理 http爬虫,scrapyBloom Filter:Bloom Filters by Example 如果你需要*敏*感*词*的网页抓取,你需要学习分布式爬虫的概念。其实没那么神秘,你只需要学习如何维护一个所有集群机器都可以有效共享的分布式队列。最简单的实现是python-rq:rq和scrapy的结合:darkrho/scrapy-redis后续处理、网页提取、存储(mongodb)
以下是一个小故事:
说说我写的一个集群爬下整个豆瓣的经历吧。
1)首先你需要了解爬虫是如何工作的。
想象你是一只蜘蛛,你现在被放置在互联网“网络”上。好吧,您需要浏览所有网页。怎么做?没问题,你可以从任何地方开始,比如人民日报的首页,称为初始页,用$表示。
在人民日报的首页上,您会看到各种指向该页面的链接。于是你高高兴兴地爬到了“国内新闻”页面。太好了,你已经爬了两页(首页和国内新闻)!暂时不管你爬下来的页面怎么处理,你可以想象你把这个页面复制成html放到你身上了。
突然发现,在国内新闻页面,有一个返回“首页”的链接。作为一只聪明的蜘蛛,你必须知道你不必爬回来,因为你已经看到了。所以,你需要用你的大脑来保存你已经看过的页面的地址。这样,每次看到可能需要爬取的新链接时,首先在脑海中检查一下是否已经到过这个页面地址。如果你去过,不要去。
好的,理论上如果可以从初始页面到达所有页面,那么可以证明你可以爬取所有页面。
那么如何在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
已经是非常伪代码了。
所有爬虫的中坚力量都在这里,我们来分析一下为什么爬虫其实是一个非常复杂的东西——搜索引擎公司通常有一个完整的团队来维护和开发。
2)效率
如果你直接处理上面的代码,直接运行,你需要一整年的时间才能爬下豆瓣的全部内容。更不用说像谷歌这样的搜索引擎需要爬取整个网络内容。
有什么问题?要爬的页面太多,上面的代码太慢了。假设全网有N个网站,那么分析权重判断的复杂度是N*log(N),因为所有网页都需要遍历一次,需要log(N)的复杂度每次重复使用该集合。 好的,好的,我知道python的set实现是hash——但这还是太慢了,至少内存效率不高。
通常的判断方式是什么?布隆过滤器。简而言之,它仍然是一种哈希方法,但它的特点是可以使用固定内存(不随url的数量增长)来判断url是否已经在集合中,效率为O(1)不幸的是,世界上没有免费的午餐。唯一的问题是如果这个url不在集合中,BF可以100%确定这个url没有被看到。但是如果这个url在set,它会告诉你:这个url应该是发生了,但是我有2%的不确定性。注意,当你分配足够的内存时,这里的不确定性可以很小。
注意到这个功能,如果url看过,可能小概率会重复(没关系,多看就不会累了)。但是如果没有看到,就会看到(这很重要,否则我们会错过一些页面!)。 [重要提示:本段有问题,请暂时跳过]
好的,现在我们正在接近处理权重的最快方法。另一个瓶颈 - 你只有一台机器。不管你有多少带宽,只要你的机器下载网页的速度是瓶颈,那你就只能提速了。如果一台机器不够用 - 使用多台!当然,我们假设每台机器都进入了最高效率——多线程的使用(以python为例,多进程)。
3)集群爬取
爬豆瓣的时候,我用了100多台机器,24小时不间断的跑了一个月。想象一下,您必须在一台机器上运行 100 个月......
那么,假设你现在有 100 台机器可用,如何在 python 中实现分布式爬虫算法?
我们将这100台算力较小的机器中的99台称为slave,另一台较大的机器称为master,然后查看上面代码中的url_queue,如果我们能把这个队列放到这台机器上的master机器上,所有slave可以通过网络与主站通信。每当从站完成下载网页时,它都会向主站请求一个新的网页以进行爬网。并且每次slave捕获一个新的网页,它会将网页上的所有链接发送到master的队列中。同样,布隆过滤器也放在master上,但是现在master只发送肯定不会被访问的url给slave。 Bloom Filter放在master的内存中,访问的url放在运行在master上的Redis中,保证了所有操作都是O(1).(至少摊销是O(1)
考虑如何在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.com"
while(True):
if request == 'GET':
if distributed_queue.size()>0:
send(distributed_queue.get())
else:
break
elif request == 'POST':
bf.put(request.url)
<p>
</p>
好吧,你可以想象,有人已经给你写了你需要的东西:darkrho/scrapy-redis · GitHub
4)勘探和后处理
虽然上面使用了很多“简单”,但要实现一个商业规模的爬虫并不容易。以上代码用于爬取整个网站,问题不大。
但是如果追加你需要这些后处理,比如
高效存储(数据库应该如何排列) 有效确定权重(这里指的是网页的权重,我们不想爬取抄袭它的人民日报和大民日报) 有效提取信息(比如如何提取网页上的所有地址都提取出来,“朝阳区奋进路中国路”),搜索引擎通常不需要存储所有信息,比如图片,我为什么要保存...及时更新(预测该网页多久更新一次)
您可以想象,这里的每个点都可以被许多研究人员研究数十年。尽管如此,
“路还很长,我会上上下下寻找”。
所以,不要问如何开始,直接上路吧:)也欢迎阅读我正在写的笔记:
关于Python技术储备
学好Python不管是工作还是副业都是赚钱的好方法,但是要学好Python,你必须要有学习计划。
一、Python全方位学习路线
将Python各个方向的技术点组织起来,形成各个领域知识点的汇总。它的用处是你可以根据以上知识点找到对应的学习资源,保证你能学得更全面。
二、Python 必备开发工具
三、优秀的Python学习书籍
当我学了一定的基础,有了自己的理解能力后,就会去读一些前人整理的书籍或者手写笔记。这些笔记详细记录了他们对一些技术点的理解。这些认识是比较独特的。 ,你可以学习不同的思维方式。
四、Python 视频合集
观看零基础学习视频是最快、最有效的学习方式。按照视频中老师的思路,从基础到深入,还是很容易上手的。
点击免费获取:最全面的python全栈工程师学习路线
五、实际案例
光学理论是没用的。你必须学会跟随,你必须先进行实际练习,然后才能将所学应用于实践。这时候可以学习一些实际案例。
六、Python 练习题
检查学习结果。
七、采访资料
我们必须学习 Python 才能找到高薪工作。以下面试题是来自阿里、腾讯、字节跳动等一线互联网公司的最新面试资料,部分阿里大佬给出了权威答案。这套面试资料相信大家都能找到满意的工作。
大家拿到脑图后,根据脑图对应的学习路线制定学习计划。按照学习计划的路线一步步学习。一般情况下,2个月内,结合文章中的信息,你可以很好地掌握Python,实现一些实用的功能。
小技巧:从Excel VBA打开PowerPoint时出错
从 Excel VBA 打开 PowerPoint 时出错
excelvba
从 Excel VBA、excel、vba、ole、dde、Excel、Vba、Ole、Dde 打开 PowerPoint 时出错,我搜索了很多 文章 在 Excel 中寻找 VBA 代码,Excel 打开了一个 PowerPoint 演示文稿。绝大多数人建议我使用以下代码(变量的变量名称)。我发现了一些变体,但它们都不起作用: Dim objPPT As ObjectSet objPPT = CreateObject("Powerpoint.Application")objPPT.Visible = TrueobjPPT.Presentations.Open "C:\Users\7233025\Desktop\Workmix R
我用谷歌搜索了很多 文章 在 Excel 中打开 PowerPoint 演示文稿的 VBA 代码。绝大多数人建议我使用以下代码(变量的变量名称)。我发现了一些变化,但它们都不起作用:
Dim objPPT As Object
Set objPPT = CreateObject("Powerpoint.Application")
<p>
objPPT.Visible = True
objPPT.Presentations.Open "C:\Users\7233025\Desktop\Workmix Resolutions.xlsm"
</p>
当我尝试运行它时,应用程序冻结了大约一分钟,然后返回以下错误消息:
Microsoft Excel 正在等待另一个应用程序完成 OLE 操作
然后应用程序继续尝试运行宏,停止宏的唯一方法是打开任务管理器并结束进程。当我尝试运行代码时 PowerPoint 是打开的,当它关闭时,就是这种情况
在搜索有关 OLE 错误的帮助时,大多数建议是将应用程序设置为“使用动态数据交换 (DDE) 忽略其他应用程序”,但这并没有解决我的问题
在我搜索过的论坛中,这对其他人来说似乎不是问题,可能是因为我雇主的网络或计算机上的某些东西阻止了文件打开,还是我在某个地方犯了错误?
objPPT.Presentations.Open "C:\Users\7233025\Desktop\Workmix Resolutions.xlsm"
您应该尝试打开的文件应该是 ppt 文件,而不是 excel 文件。例子
objPPT.Presentations.Open "C:\example.pptx"
插入 DoEvents 是否有效?我不这么认为,因为代码中没有循环。我只是在 objPPT.Presentations.Open 行之前和之后使用 DoEvents 指令进行了尝试。这些都行不通。总是一个傻瓜式错字让我失望!感谢您指出,但现在我收到“系统调用失败”错误消息!我会到处玩,看看我能不能解决这个新问题,但如果你有更多的建议,我会很感激