二十一 爬取数据后使用哪个数据库存储
一般爬虫使用的数据库,是根据项目来定的。
如需求方指定了使用什么样的数据库,如果没有指定,那么决定权就在爬虫程序眼手中,如果自选的话,mysql和MongoDB用的都是比较多的。
如果爬取的数据时间耦合性很高,关系比较复杂的话,那么mysql可能是更好 的选择。
如果抓取的数据是分版块的,并且它们之间没有相似性或关联性不强,那么可能MongoDB会更好。
数据库的选择尽量从项目的数据存在的特性来考虑,还要一个问题就是开发人员最擅长的数据库,目前大多数基本是使用MongoDB
二十二 cookie和sessio的区别
1,数据存储位置不同,cookie存在客户端,session存在服务器
2,安全程度不同,cookie存在客户端本地,分析cookie欺骗,考虑到安全性,所以使用session
3, 性能不同,session存服务器,访问量大时,会增加服务器负载,考虑性能,所以用cookie
4, 数据存储大小不同,单个cookie不超过4k, 部分浏览器会限制cookie的存储个数,但session存服务器,故不受客户端浏览器限制。
二十三 每天爬取数据量是多少?成功率多少?
爬取速度受本地网络情况,对方服务器阈值,硬件配置等影响,有时也考虑反爬和稳定,也会自己故意限速,以及在部分不式的情况下,正常反爬松一点的大型网站一天50W,小一点的或者对方服务器承受不了太大并发的就在20W左右。由于反爬,网络问题,请求限制等等问题成功率在98%以上。
二十四 如何实现增量爬取
爬虫的分类:通用爬虫,聚焦爬虫,增量爬虫,深度爬虫
如果只考虑数据增加的情况:
粗暴的通用方案,再次全部爬取,用去重逻辑进行判断,是新数据就增加
如果考虑数据修改的情况:
贴吧:只需要判断帖子的楼层数,是否增加,即可判断数据是否有更新
二十五 怎么监控爬虫的状态?
1,使用python的SMTP包将爬虫的状态信息发送到指定的邮箱
2,记录日志以及添加查询功能
3,使用web技术+echarts可视化技术, 自己开发后台用于状态信息展示
4, scrapy+gerapy
5, Grafana + InfluxDB
二十六 如何处理验证码
1,避免验证码
登录时遇到的验证码: 复制cookie登录
selenium阻塞 手动登录
访问过程中遇到验证码:
使用代理IP
分析网页业务逻辑尽量减少出现验证码
2, 使用谷歌的ocr-tesseract, 可以使用灰度化和二值化提高识别准确率
3, 接入第三方打码平台(超级鹰, 打码兔)
4,通过一些固定的算法逻辑解决(滑动验证码), 通过操作css获取带缺口的图和全背景的图,然后比较相同位置的像素的RGB值,如果某个像素的RGB差值比较大,X坐标就是滑动距离,最后在通过变加速和变减速以及停顿模拟人的滑动。
5, 如果公司需要自己搭建识别模型,我也可以后面不断的学习一些数学知识和机器学习的知识,自己构建模型识别验证码。
二十七 js逆向了解多少
1,js逆向或者加解密,本质是一个动态网页,如果可以接受减低效率,可以使用selenium或者mitmproxy中间人攻击代理,如果不行的话,找到数据接口,通过路由找到js文件中发送请求的位置。
2,通过分析请求的参数/cookie/请求头信息/应答,找到有可能在js出现的位置
3,通过断点和调试,找到加密的js代码
4,可以使用python翻译加密的js代码,或者使用PyExecJS在python中构建js运行环境,直接执行js获取加密结果
5,可以使用nodejs模拟js运行[hash(md5,sha1), 对称加密(AES,DES,3DES), 非对称加密(RSA, ECC,DSA)]
6,理清楚js逻辑后,正常发送requests模拟请求,有时候需要python拿nodejs的执行结果,还需要在nodejs,把python需要的参数传回来
二十八 数据清洗都处理哪些问题
清除重复的数据(去重)
去除非法/无用的字符(re.sub('\s', '', str))
类型转换
单位统一
字段的顺序,规整
清除缺失字段比较严重的数据(去空)
格式统一(时间格式)
二十九 如何自建代理IP池
爬虫:获取网站上免费的代理IP
测试:使用多线程测试代理IP是否可用,可用的进行持久化
对外提供服务(可忽略):编写代理IP web服务器,设计一些api结果,对外提供服务,便于功能复用
三十 实现爬虫程序每五分钟调用一次
使用apseduler定时调度框架,可以实现设置代码按时间或间隔执行