js 爬虫抓取网页数据(第一个问题:JS加密如何突破(1)的开发者功能)
优采云 发布时间: 2021-12-23 18:12js 爬虫抓取网页数据(第一个问题:JS加密如何突破(1)的开发者功能)
第一个问题:如何突破JS加密
(1) 熟悉Chrome的开发者工具的各种功能,Elements、Network、Source
(2)仔细观察,善于思考。网络查看加载过程,发现可疑的xhr请求,设置xhr断点,通过Call Stack回溯js执行过程,回溯时查看上下文代码。可以读取js ,了解js相关知识,比如js中的window变量。
(3)上面是通过debug js找到js加解密代码,然后通过Python重新实现,这个过程很长,可能要好几天。一旦网站改变js算法,你的 Python 无法使用。
(4) Selenium 可以做简单的突破,而网站 想要什么都无所谓。唯一遗憾的是Selenium 运行效率差。不过作为JS加密来保护数据网站,单价的运行效率应该足以满足网站的访问频率限制,这个时候更多的思考是如何增加资源(IP,账号)来提高爬取效率。
第二个问题,多线程、协程、多进程选择
(1)爬虫是IO密集型任务,大部分时间花在网络访问上,所以多进程不适合网络爬虫,多线程,异步IO协程更适合,异步IO更适合最合适的,它与多线程相比,协程之间的切换成本更低,我们提倡使用异步IO代替多线程,异步IO的主要模块有:aysncio、aiohttp、aiomysql等。
(2) 爬下来后从网页中提取想要的数据是CPU密集型的,此时可以使用多个进程并发提取。
(3)我们推荐的爬虫策略是爬虫只爬取,把爬取的html保存,存入数据库。然后单独写提取数据的extractor,单独运行extractor。优点是提取不影响爬取,爬取爬取效率更高,提取程序可以随时修改,有新的提取需求时无需重新取。本来写的,我只是想从网页中提取两条数据,运行一段时间后发现另外三项数据也很有用,如果保存html,只需要改一下extractor和再次运行它。
第三个问题,如果要保留图片的粗体或者原位置,只能挖规则,然后写正则表达式来处理吗?
Web数据提取主要有两种方法:正则表达式和xpath。某个html标签节点可以通过xpath获取。例如,对于一个博客页面,它的主要内容在某个标签中,可能是某个div。使用xpath获取这个div并转换成html,也就是收录格式和图片的部分。只需保存此 html 代码而不是纯文本。
第四个问题,爬虫增量爬取,断点连续爬取,去重等
(1)通过URL池的概念管理所有的URL
(2)增量爬取是指下载的网址不会重复下载,让网址池记住那些已经下载过的网址;
(3)断点恢复爬取,即这次爬取上次没有爬取的URL,或者让URL池记住那些没有爬取的URL
(4) 爬虫的去重可以让URL池记录URL的状态,避免重复爬取。
第五个问题是爬虫的部署问题。公司分布式爬虫系统是否涉及部署问题?
爬虫的部署不一定是分布式的。大型爬虫,突破目标网站限制的爬虫会涉及分布式。分布式的好处是提高了爬取速度,但是管理会比较复杂。
第六个问题,网页自动分析?本主题收录很多子任务:如何自动提取文章的内容,如何处理各种时间格式,如何处理翻页
(1)文章 内容提取,基本就是为每个网页建立一个提取模板(正则表达式)。优点是提取准确,缺点是工作量大。版本稍有修改就会失效,通过算法建立单一的提取程序基本可以提取,但可能有写的不纯,比如文末相关阅读。优点是一劳永逸,不受修订限制。
(2)时间提取,除了正则表达式,似乎没有特别有效的方法。
(3)如果翻页,如果只是抓取,则提取页面的url继续抓取;提取内容时如何将多个页面的内容合并为一个网页,需要处理专门用它。
第七题,爬取新闻类网站时,同一条新闻怎么做,每个网站互相转载,爬取时去掉文字
众所周知的算法是谷歌的simhash,但在实践中比较复杂。百度在线传输的方法是对文章的最长句子(或多个句子)进行hash。这个哈希值是文章的唯一代表(指纹)。该方法准确率高,但召回率相对较低。最长的句子一旦换了一个词,就再也记不起来;我改进了方法,分别对n个句子中最长的句子进行了hash。一个文章由n个指纹组成(如图)每个手指的指纹都不一样)来判断唯一性。准确率和召回率都不错。
第八题,异步爬虫的设计
(1)一个不错的URL管理策略,请参考Apeman Learning上与文章相关的URL池;
URL 池是“生产者-消费者”模型。爬虫从中取出URL进行下载,从下载的html中取出新的URL放入池中,告诉URL池刚刚取出的URL是否下载成功;然后将其从池 url 中删除以进行下载。. . url池是核心组件,它记录了url的不同状态:
(一)下载成功
(B) 下载失败n次
(C) 下载
每次向池中添加 URL 时,请检查池中 URL 的状态,以避免重复下载。
(2)一个不错的异步协进程管理策略,见文章 猿人学习大型异步新闻爬虫网站。
每次从urlpool中提取n个url,就会生成n个异步下载协程,协程的数量(即正在下载的网页数量)通过一个变量记录下来。
大型异步新闻爬虫:实现功能强大、简单易用的网址池(URL Pool)
大型异步新闻爬虫:带有asyncio的异步爬虫
异步网址管理异步实现看这两个网址
如果有用记得点赞哈哈哈哈