爬虫
1. 爬取数据后使用哪个数据库存储数据的,为什么?
一般是mysql和mongodb
爬取的数据通常都是非结构化数据,这在关系模型的存储和查询上面都有很大的局限性。但也有一个可能性是你感
兴趣的网站都是同样类型的网站,你只对网页上的特定内容有兴趣,这样可以把它们组织成结构化数据,从而在这
方面MySQL仍然是可以胜任的
200w到2000w的数据量相对来说不是很大,二者都可以。但是基本上数据库达到千万级别都会有查询性能的问
题,所以如果数据持续增长的话,可以考虑用mongodb。毕竟mongodb分片集群搭建起来比mysql集群简单多
了。而且处理起来更灵活,
之前项目当时日志处理和归档,对每天所生成的访问日志进行冷热统计,生成各种数据报表等等,开始做项目考虑
过MYSQL,不过MYSQL单表在超过千万级以上性能表现不佳,所以当时还是选择使用mongodb 其实做的也很简
单,无非是用python定时将每日的服务器日志抓取到本地,然后利用pandas库,将数据构造成自己想要的数据结
构,需要计算分组聚合的就聚合,最终把每日的数据结果扔到mongodb中。 现在公司mongodb数据大概放了有
8KW条左右,进行数据检索效率还是可以的,当然记得加索引。
我这边除了把数据记录到mongodb之外,还用flflask写了个restfulAPI,专门给运营系统调用数据统计结果,运营那
边也会在MYSQL上创建一张表,将我mongodb统计出的结果再次统计出一个总数据,放到MYSQL里,这样就不用
每次从API那边拿数据调用mongodb中进行重复聚合计算了。
这里有一个更专业的回答:点击查看
2. 你用过的爬虫框架或者模块有哪些?谈谈他们的区别或者优缺点?
requests request是一个HTTP 库, 它只是用来,进行请求,对于HTTP 请求,他是一个强大的库,下载,解
析全部自己处理,灵活性更高,高并发与分布式部署也非常灵活,对于功能可以更好实现
Scrapy scrapy 是封装起来的框架,他包含了下载器,解析器,日志及异常处理,基于多线程,twisted的方
式处理,对于固定单个网站的爬取开发,有优势,但是对于多网站爬取 100个网站,并发及分布式 处理方
面,不够灵活,不便调整与括展。
3.详述 Scrapy的优缺点
scrapy 是异步的;
采取可读性更强的xpath代替正则;
强大的统计和log系统;
同时在不同的url上爬取;
支持shell方式,方便独立调试;
写middleware,方便写一些统一的过滤器;
通过管道的方式存入数据库;
基于twisted框架,运行中的exception是不会干掉reactor,并且异步框架出错后是不会停掉 其他任务的,数
据出错后难以察觉
4. 写爬虫是用多进程好?还是多线程好? 为什么?
IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率(单线程下有IO操作会进行IO 等待,造成不必要
的时间浪费,而开启多线程能在线程A等待时,自动切换到线程B,可以不浪费CPU的资源,从而能提升程序执行效
率)。
在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑 自身机器的硬件情况,来设置多进程或多线程。
5. 常见的反爬虫和应对方法?
1. 通过Headers反爬虫:
很多网站都会对请求Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站
的防盗链就是检测Referer)。这个容易解决,之前收集了一大堆的User-Agent,如果用的scrapy框架,就在
爬虫中间件中对reqeust请求添加一个随机的User-Agent,如果是requests库,在请求方法中传入一个包含
User-Agent的headers字典即可
2. 验证码,
爬虫爬久了通常网站的处理策略就是让你输入验证码验证是否机器人,此时有三种解决方法
第一种把验证码down到本地之后,手动输入验证码验证,此种成本相对较高,而且不能完全做到自动抓
取,需要人为干预。
第二种图像识别验证码,自动填写验证,但是现在的情况是大部分验证码噪声较多复杂度大,对于像我
这样对图像识别不是很熟悉的人很难识别出正确的验证码。
第三种也是最实用的一种,接入自动打码平台,个人感觉比上两种方法好些。
3. 用户行为检测
有很多的网站会通过同一个用户单位时间内操作频次来判断是否机器人,比如像新浪微博等网站。这种情况
下我们就需要先测试单用户抓取阈值,然后在阈值前切换账号其他用户,如此循环即可。
当然,新浪微博反爬手段不止是账号,还包括单ip操作频次等。所以可以使用代理池每次请求更换不同的代理
ip,也可以考虑维护了一个cooies池,在每次请求时随机选择一个cookies
4. ajax请求参数被js加密
使用selenium + phantomJS,调用浏览器内核,并利用phantomJS执行js来模拟人为操作以及触发页面中的
js脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整
整的把人浏览页面获取数据的过程模拟一遍。
4. 分布式爬虫,
分布式能在一定程度上起到反爬虫的作用,当然相对于反爬虫分布式最大的作用还是能做到高效大量的抓取
5. 注意配合移动端、web端以及桌面版
其中web端包括m站即手机站和pc站,往往是pc站的模拟抓取难度大于手机站,所以在m站和pc站的资源相
同的情况下优先考虑抓取m站。同时如果无法在web端抓取,不可忽略在app以及桌面版的也可以抓取到目标
数据资源。
应对反爬虫的策略,首先要发现网站的反爬虫手段是什么?这个发现的过程就是不断测试的过程,有点类似于A/B
测试,弄清楚它的反爬虫机制,就成功了一大半了。
6. 验证码的解决?
图形验证码:干扰、杂色不是特别多的图片可以使用开源库Tesseract进行识别,太过复杂的需要借助第三方打码
平台。
点击和拖动滑块验证码可以借助selenium、无图形界面浏览器(chromedirver或者phantomjs)和pillow包来模
拟人的点击和滑动操作,pillow可以根据色差识别需要滑动的位置。
selenium, 计算缺口的偏移量,找到特征点,控制鼠标实现,破解“极验”滑动验证码 详细请点击
7. 代理 IP 里的“透明”“匿名”“高匿”分别是指?
透明代理虽然可以直接“隐藏”你的IP地址,但是还是可以从HTTP_X_FORWARDED_FOR来查到你是谁。
匿名代理比透明代理进步了一点:别人只能知道你用了代理,无法知道你的IP地址。
与匿名代理相同,如果使用了混淆代理,别人还是能知道你在用代理,但是会得到一个假的IP地址,伪装的更
逼真:
高匿代理让别人根本无法发现你是在用代理
8. 编写过哪些爬虫中间件?
user-agent、代理池、cookies池、selenium
9. 爬的那些内容数据量有多大,多久爬一次,爬下来的数据是怎么存储?
京东整站的数据大约在1亿左右,爬下来的数据存入数据库,mysql数据库中如果有重复的url建议去重存入数据
库,可以考虑引用外键。评分,评论如果做增量,Redis中url去重,评分和评论建议建立一张新表用id做关联。
多久爬一次这个问题要根据公司的要求去处理,不一定是每天都爬。 Mongo 建立唯一索引键(id)可以做数据去
重 前提是数据量不大 2台电脑几百万的数据库需要做分片 (数据库要设计合理)。 例:租房的网站数据量每天大
概是几十万条 ,每周固定爬取。
10. requests返回的content和text的区别?
response.text
类型:str
解码类型: 根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
如何修改编码方式:response.encoding=”gbk
response.content
类型:bytes
解码类型: 没有指定
如何修改编码方式:response.content.deocde(“utf8”)