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

高价值干货:这可能是你见过最全的网络爬虫总结

时间:2023-03-26 19:21:08 Python

高价值干货:这可能是你见过最全的网络爬虫总结,介绍了在不同场景下如何采取不同的措施高效抓取数据。前段时间参加了一个Python网络爬虫主题的分享活动,主要以直播的形式分享了自己从事网络爬虫相关研究以来的一些经验总结。整个分享分为三个阶段。第一阶段,我先介绍一下我从大学开始从事编程开发以来的相关过程。第二阶段是正式的网络爬虫分享过程,详细总结了网络爬虫开发的一些要点。第三阶段是回答一些问题,抽取一些礼物。所以在这里我把昨天分享的主要内容总结一下,希望大家多多支持!总分享的主题叫做《健壮高效的网络爬虫》。本次分享从爬虫、解析、存储、反爬虫、加速五个方面介绍了使用Python开发网络爬虫的相关知识点和技巧。它还介绍了如何在不同的场景下采用不同的方法。高效抓取数据的手段,包括Web爬取、App爬取、数据存储、代购、验证码破解、分布式爬取与管理、智能分析等。此外,还结合不同场景介绍了一些常用的工具包,以及整个内容是我从事网络爬虫研究以来的经验总结。爬取对于爬取,我们需要学会使用不同的方法来应对不同场景下的数据爬取任务。大多数情况下,爬取的目标要么是网页,要么是APP,所以这里我们介绍这两类。对于网页,我把它们分为两类,服务端渲染和客户端渲染。对于应用程序,我将它们分为四种类型的接口——普通接口和加密参数接口,加密内容接口,非常规协议接口。所以整个大纲是这样的:网页爬取服务端渲染客户端渲染App爬取公共接口加密参数接口加密内容接口非常规协议接口爬取/网页爬取服务端渲染意思是页面的结果由服务端提供渲染后返回,有效信息包含在请求的HTML页面中,例如猫眼电影网站。客户端渲染是指页面主要内容由JavaScript渲染,通过Ajax接口获取真实数据,如淘宝、微博手机版等站点。服务器端渲染的情况比较简单。可以使用一些基本的HTTP请求库来实现爬取,比如urllib、urllib3、pycurl、hyper、requests、grab等框架。其中,请求可能是使用最广泛的。对于客户端渲染,这里我分了四种处理方式:寻找Ajax接口,这种情况下可以直接使用Chrome/Firefox开发者工具直接查看Ajax具体的请求方法、参数等,然后使用HTTP请求librarytosimulate另外也可以通过设置代理抓包来查看界面,比如Fiddler/Charles。模拟浏览器执行。这种情况适用于网页界面和逻辑比较复杂的情况。可以直接以可见可爬的方式进行爬取。比如Selenium,Splinter,Spynner,pyppeteer,PhantomJS,Splash,requests-html等都可以实现。直接提取JavaScript数据。这种情况适用于不是通过Ajax接口获取的真实数据,而是直接包含在HTML结果的一个变量中,可以直接使用正则表达式提取。模拟JavaScript的执行。在某些情况下,直接模拟浏览器执行的效率会很低。如果我们了解了JavaScript的一些执行和加密逻辑,就可以直接执行相关的JavaScript来完成逻辑处理和接口请求,比如使用Selenium、PyExecJS、PyV8、js2py等库来完成。爬取/应用爬取对于应用爬取,这里有四种处理情况:对于普通的非加密接口,这种直接抓包获取接口的特定请求形式是可以的。可用的数据包捕获工具包括Charles和Fiddler、mitmproxy。对于加密参数的接口,一种方法可以实时处理,如Fiddler、mitmdump、Xposed等,另一种方法是破解加密逻辑,直接模拟结构,可能需要一定的反编译技巧。对于加密内容的接口,即接口的返回结果是完全无法理解的。可以使用可见可爬工具Appium,也可以使用Xposedhook获取渲染结果,也可以反编译重写手机底层实现破解。对于非常规协议,可以使用Wireshark抓取所有协议的数据包,也可以使用Tcpdump抓取TCP数据包。以上就是爬取过程的相关分类和相应的处理方法。解析对于解析,对于HTML类型的页面,其实有几种常用的解析方式,正则,XPath,CSSSelector,而对于一些接口,常见的可能是JSON和XML类型,使用相应的库来做即可。这些规则和分析方法其实写起来很繁琐。如果我们要爬上万个网站,如果每个网站都写相应的规则,岂不是太累了?所以智能分析是一个要求。智能分析是指如果可以提供一个页面,算法可以自动提取页面的标题、正文、日期等内容,同时去除无用的信息,比如上图,就是自动分析Safari自带的阅读模式的结果。对于智能解析,分为以下四种方法:可读性算法,为不同的块定义不同的标签集,通过权重计算得到最可能的块位置。密度判断,计算单位块数内的平均文本内容长度,根据疏密程度粗略区分。Scrapyly自学习是Scrapy开发的一个指定页面和提取结果样本的组件,它可以自学习提取规则并提取其他类似的页面。深度学习,利用深度学习对解析位置进行监督学习,需要大量的标注数据。如果你能容忍一定的错误率,你可以使用智能解析来节省很多时间。目前这部分内容我还在摸索中,准确率还需要不断提高。存储存储,即选择合适的存储介质来存储爬取的结果,这里还是分为四种存储方式进行介绍。文件,如JSON、CSV、TXT、图片、视频、音频等。常用的库有csv、xlwt、json、pandas、pickle、python-docx等。数据库分为关系型数据库和非关系型数据库,如MySQL、MongoDB、HBase等。常用的库有pymysql、pymssql、redis-py、pymongo、py2neo、thrift。Solr、ElasticSearch等搜索引擎方便检索和文本匹配。常用库有elasticsearch、pysolr等云存储,部分媒体文件可以存储在七牛云、优拍云、阿里云、腾讯云、AmazonS3等常用库有qiniu、upyun、boto、azure-存储、谷歌云存储等。这部分的关键是结合实际业务,看哪种方式更能满足业务需求。防爬和反爬是一个重点。现在爬虫越来越难了。很多网站都加入了各种防爬措施,主要分为非浏览器检测、IP屏蔽、验证码、账号屏蔽、字体反爬等,下面主要从三个方面来介绍反爬的处理方法封IP、封验证码、封账号。反爬/封IP对于封IP的情况,可以分为几种情况来处理:第一,找手机网站和App网站。如果有这样的网站,反爬会比较弱。使用grabfreeproxy、购买付费代理、Torproxy、Socksproxy等代理,在代理的基础上维护自己的代理池,防止代理浪费,保证实时可用。搭建ADSL拨号代理,稳定高效。防爬/验证码验证码有很多种,普通图形验证码、算术题验证码、滑动验证码、触摸验证码、手机验证码、扫描二维码等。对于普通图形验证码,如果它们是不规则的并且没有变形或干扰,则可以使用OCR识别,或者使用机器学习和深度学习进行模型训练。当然,编码平台是最方便的方式。算术题验证码,建议直接使用打码平台。对于滑动验证码,可以使用破解算法,也可以模拟滑动。后者的关键是找差距,可以用图像比对,也可以写基本的图像识别算法,也可以对接编码平台,也可以用深度学习训练识别接口。触摸验证码,建议使用打码平台。手机验证码可以使用验证码分发平台,也可以购买专门的收码设备,也可以人工验证。扫描二维码,可以手动扫码,也可以连接打印码平台。防爬/封号有些网站需要登录才能爬取,但是登录后如果请求过于频繁,账号就会被封号。为了避免被封号,可以采取以下措施:通常以接口的形式出现。验证很弱。寻找免登录的接口,尽量找免登录也能爬取的接口。维护Cookies池,使用批量账号模拟登录,使用时随机选择可用的Cookies使用,实现:https://github.com/Python3Web...。加速当需要爬取的数据量非常大时,如何高效快速地爬取数据是关键。常见的措施有多线程、多进程、异步、分布式、细节优化等。加速/多线程和多进程爬取是网络请求密集型任务,所以使用多进程和多线程可以大大提高爬取效率,比如使用threading,multiprocessing等。Acceleration/Asynchronous把爬取的过程改成非阻塞的形式,等有响应再处理,否则等待的时候可以运行其他任务,比如使用asyncio,aiohttp,Tornado,Twisted,gevent,grequests,pyppeteer、pyspider、Scrapy等等。加速/分布式分发的关键在于共享爬行队列。可以使用celery、huey、rq、rabbitmq、kafka等实现任务队列的对接,也可以使用pyspider、Scrapy-Redis、Scrapy-Cluster等现成的框架。加速/优化可以采取一些优化措施来加速爬取,例如:DNS缓存使用更快的解析方式,使用更高效的去重方式模块分离管理和控制加速/架构如果是分布式的,需要实现高效的爬取和管理调度,监控等操作,我们可以使用两种架构来维护我们的爬虫项目。将Scrapy项目打包为Docker镜像,使用K8S控制调度过程。将Scrapy项目部署到Scrapyd,使用专用管理工具如SpiderKeeper、Gerapy等进行管理。另外,对于这部分内容,其实还有我制作的比较丰富的思维导图。预告如下:点击关注,第一时间了解华为云的新鲜技术~