爬虫流程总结

 

背景

在这个大数据时代,尤其是人工智能浪潮兴起的时代,不论是工程领域还是研究领域,数据已经成为必不可少的一部分,而数据获取很大程度上依赖于爬虫的获取。

方式

目前我主要做了网页端爬虫(未来主义www.futurism.com,博客园top100作者文章及其粉丝文章)和app端爬虫(得到app付费文章及音频),爬取方式都大同小异

1.网页爬取

静态页面和动态页面:

  静态页面:多使用requests库进行请求,请求后解析即可

  动态网页:

  • 通过chrome分析ajax接口或者通过Fiddler/Charles抓包分析接口,然后通过requests直接请求接口即可

      如未来主义就是通过直接请求ajax接口得到json数据,然后进行解析入库

  • 主要通过模拟浏览器执行,通过selenium自动化测试工具请求页面,然后对页面进行解析即可,做到可见可爬
  • 直接提取JavaScript数据,渲染的数据隐藏在HTML结构的JavaScript变量里面,可以直接正则提取

解析:

  正则表达式

  json/xml

  xpath

  CSS Selector

  智能解析:有些国外网站做了这方面的东西,给一个网页会自动提取出标题正文等等

存储:

  可以把解析的数据存储到:

    文件

    数据库,MySQL,MongoDB等

    搜索引擎,如Solr、ElasticSearch等,便于检索,文本匹配

    云存储,如七牛云,阿里云

防止反爬:

  常见的反爬:

    非浏览器

    封IP,同一IP访问过于频繁

      搭建一个免费代理池:但是可用率极低

      付费代理:可用率高,如讯代理,阿布云代理等

      ADSL代理:使用ADSL拨号主机搭建代理池,推荐云立方

      Tor代理:黑客好像一般挺多用这个隐藏自己身份,但是速度慢

      Socks代理:代理速度快,可用SS服务器搭建使用代理

    验证码:

      OCR识别:使用Tesserocr等库可实现

      KNN、SVM等算法字符分类:机器学习算法进行字符分类,如Sklearn

      打码平台:对接打码平台进行识别,推荐超级鹰、云打码

      深度学习训练:如卷积神经网络CNN进行字符识别,如TensorFlow

      例子:目前遇到的是博客园的验证码,他们用的的极验验证码,在《Python3 网络爬虫开发实战》中有破解方法

    封账号:如微博,不封IP,只封账号

      搭建自己的cookies池:首先要有很多可用的账号,然后通过selenium一一登陆,把各种的cookies存储下来,当一个cookies不能使用的时候,就换一个cookies进行使用

加速:

  多线程/进程

    threading库

    multiprocessing库

  异步:将爬取过程改成非阻塞式,大大节省时间

    asyncio/Tronado

    Twisted

    pysipder:基于Tornado实现异步

    Scrapy:基于Twisted实现异步

  分布式:使用多主机协同爬取,大大提高爬取速度

    关键是要有一个统一的队列,多台主机共享

      celery,huey,rq,rabbitmq,kafka,scrapy-redis,scrapy-cluster

  优化:优化解析、调度、去重等算法

    DNS缓存

    更高效的去重方法:如基于redis去重相对高效,对接BloomFilter可以更快,更加节省空间

架构:

  

 

 

博客园爬虫例子

  对博客园使用Scrapy框架进行爬取,使用mysql进行存储,并进行了简单的登陆获取cookies。

  使用架构二方式进行架构,通过使用使用scrapy-redis共享队列,把scrapy项目通过Gerapy部署到多个主机上,并可以实时进行监控调度,搭建流程可参考崔庆才这篇文章:https://cuiqingcai.com/4959.html

  

 

 2.App爬取

爬取方式分类:

  1. 通过Fiddler或者Charles抓包分析接口,之后模拟该接口发送请求即可获取数据
    1. 一般获取的数据的json数据,很容易解析,该方法跟网页端找到ajax接口直接发送请求差不多
  2. 接口模拟不了的,通过mitmdump拦截包数据,手动操作app,并对接Python脚本获取数据
  3. 通过自动化appium,即可获取到数据,做到可见可爬(跟selenium原理一样),一般只能获取文字数据,图片数据和音频数据可能获取不到。如果要获取图片数据,音频数据,看是否有H5页面,如果能找到这个页面的链接,即分享链接,可以通过appium得到这个链接,然后通过requests或者selenium访问链接,即可得到图片链接,或者音频链接
  4. appium+中间人代理,appium来操作app,mitmdump对接脚本获取数据
    1. 因为操作app的时候,所有请求都会经过mitmdump,所以可以通过mitmdump拦截包来获取请求,并对接Python脚本解析这些包来获取数据

爬取问题:

  • 现在很多app内置了自己的证书,通常是手机wlan设置代理就无法打开app(或者打开app却出现无法联网的情况),需要进行root并安装xposed框架+just trust me模块来解决,模拟器目前没有遇到这种情况
  • 也有app会限制模拟器登陆,如闲鱼,新版本得到app(原理,会检测cpu温度,或者手机电量等来判断是否是模拟器)
  • 还有app会限制开发者模式,如钉钉

爬取例子:

  得到app付费文章正文及音频爬取

  极客时间app同理

爬取关键流程:

  • 安装了mitmproxy证书的安卓模拟器
  • 模拟器wlan设置代理
  • 代理设置好后就可以操作模拟器访问得到app文章,然后就可以在抓包工具中查看到抓到的请求连接
  • 对这些链接通过Python 脚本进行提取即可得到json数据

  可参考文章:https://www.cnblogs.com/sheajin/p/11119781.html

环境搭建:

  得到app使用的是常规协议HTTPS协议进行数据传输的,所以可以通过设置代理证书抓取到HTTPS的包,直接获取json数据

  模拟器:

    使用夜神模拟器

  证书安装:

    主要为抓取HTTPS的包,抓取HTTPS的包需要进行安装证书,但是安装证书Android 7及以上版本普通方法会失效,因为Android 7及以上版本安全策略发生改变,Android 7证书安装方法:https://www.cnblogs.com/sheajin/p/11075713.html

    安装好证书后,手机设置代理,就可以在抓包工具中看到包了,并可以直接看到JSON数据

    例子:以下为得到app某付费文章的json数据,其中mp3_play_url为可以直接访问的音频链接,可以直接下载,极客时间抓到的包也同理。

 

      

 

 

 我的演进流程:

  • 最开始使用夜神模拟器,Android 4.2.2版本,安装中间人证书,安装xposed框架和just trust me模块,安装完成后是可以进行抓包了,但是发现得到app的评论却没有,后来又试了下Android 5,发现也没有评论。而且Android 4 和Android 5极客时间App根本打不开,也就是说极客时间app不支持Android 4和Android 5。
  • 后来把夜神模拟器环境变为Android 7,发现xposed框架根本装不了,而且代理证书也按照Android 4和Android 5的方式来进行安装,发现抓不到包,这是由于Android 7安全策略发生了改变,后来查了多方资料,终于在Android 7上安装好了证书,参考链接:https://www.cnblogs.com/sheajin/p/11075713.html。注意,在模拟器上不用安装xposed框架就可以抓包(也就是在模拟器上设置代理,得到app可以进行启动)
  • 后来得到app新版本对模拟器进行了检测,即新版本得到app不能在模拟器上运行了,一运行就会崩溃。我就把战线转到了真机上,对小米mix进行解锁,解锁后刚开始是安装的是基于Android 8的MIUI10开发版,发现死活写入不了数据,即解锁不了data分区。后来去搜索MIUI的历史版本,线刷了基于Android 7的MIUI9,启动后进行root,安装syslock解锁system分区(必须解锁system分区不然卡米),安装xposed installer并禁用里面的资源钩子,然后把xposed框架zip包和卸载包,just trust me 的安装包放到真机文件夹中。关机,刷入第三方rec,然后在第三方rec中安装xposed框架,重启即可,如果卡米了,就再次进入rec中安装卸载包即可恢复。启动后就会看到xposed框架已经激活,然后安装just trust me模块即可。

   注:网上有很多安装xposed框架的例子,可以自行查看。

 

总结:

  app爬虫主要是环境的搭建,通过xposed+just trust me解决ssl pinning的问题,还有安装证书的问题

  证书安装好后,启动app观察抓包工具,就可以看到json数据,然后对接Python脚本进行数据的解析入库即可

 

 参考:崔庆才《Python3 网络爬虫实战》,崔庆才的一篇文章掘金爬虫讲稿《健壮高效的网络爬虫》,掘金爬虫讲稿《健壮高效的网络爬虫》几乎把爬虫大多数情况都覆盖了,包括app爬虫,网页爬虫

转载于:https://www.cnblogs.com/sheajin/p/11206196.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值