一.项目问题:
1. 你写爬虫的时候都遇到过什么反爬虫措施,你最终是怎样解决的
1、基于User-agent反爬
2、基于IP地址进行反爬
2. 你写爬虫的时候 使用的什么框架 选择这个框架的原因是什么
python中的爬虫框架:
pyspider、crawley
scrapy,这是一个异步框架,基于python的web爬虫框架,抓取web站点并从页面提取结构化的数据
使用scrapy的原因:
容易构建大规模的抓取项目
异步处理请求的速度快
使用自动调节机制自动调整爬取的速度
二.框架问题:
1.scrapy的基本结构(五个部分都是什么,请求发出去的整个流程)
调度器
下载器
爬虫
实体管道
引擎
流程:
首先爬虫将需要发送请求的url通过引擎交给调度器
排序处理之后,经过ScrapyEngine,DownloadeMiddlewares(这里面有User_Agent、Proxy代理)交给Downloader
Downloader向互联网发送请求,并接受下载相应,将响应经过ScrapyEngine,可以选择交给Spiders;
Spiders处理response,提交数据并将数据经过ScrapyEngine交给ItemPipeline进行保存
提取url重新经过ScrapyEngine交给Scheduler进行下一次循环。直到Url请求程序停止结束
2.scrapy的去重原理(指纹去重到底是什么原理)
Scrapy本身是自带一个中间件的,在源码中可以找到一个dupefilters.py的去重器
需要将dont_filter设置为False设置为False开启去重,默认就是False去重的,要是改成True的话就是没有开启去重
对于每一个url的请求,调度器都会根据请求得相关信息加密得到一个指纹信息,并且将指纹信息和set集合中的指纹信息进行比对,如果set集合中已经存在了这个数据,那么就不再就不再将这个request放入到队列中,如果set集合中不存在这个加密后的数据的话,就将这个request对象放入到队列中等待被调用
3.scrapy中间件有几种类,你用过哪些中间件
downloadermiddleware
spidermiddleware
4.scrapy中间件在哪里起的作业(面向切片编程)
三.代理问题:
1.为什么会用到代理
爬虫程序从本质上讲也是浏览网页的用户,只不过不是那么的守规矩而已,服务器通常不喜欢这类型的用户,所以就会采取各种手段识别和禁止爬虫用户。比较常见的就是通过判断访问频率发现某个IP访问异常就会封禁该IP地址,但是做爬虫的就是要采集大量的数据,如果你的爬虫和一个普通人的访问频率差不多,那么你的爬虫存在意义也就不大了,所以这时候就凸现了代理IP的作用了,有些代理能够有效的隐藏真实的IP,突破服务器的反爬虫机制,同时降低你的爬虫速度,那样的话IP被封禁的概率就会大大降低了
2.代理怎么使用(具体代码, 请求在什么时候添加的代理)
在下载中间件中进行设置,设置完之后,需要在settings中对设置的中间件进行调用
3.代理失效了怎么处理
设置线程池,要是其中的某个代理IP失效了就将它从这里面移除
4、如何设置代理
内置添加代理功能os.environ['HTTP_PROXY'] = '代理IP'
自定义下载中间件在中间件中进行配置
四.验证码处理:
1.登录验证码处理
2.爬取速度过快出现的验证码处理
可以在适当的位置模拟一下延迟
3.如何用机器识别验证码
利用极验进行破解
五.模拟登陆问题:
1.模拟登陆流程
有些网站要求你登录之后才会将数据从服务端发送给你,这时候你就需要模拟登录的流程,让爬虫来进行自动登录,一般用的是selenium,但是现在出现了pyppeteer,
对登录页面进行请求,从请求的页面源码中解析下载验证图片
使用打码平台对验证进行识别
基于登录按钮发起一个post请求(处理参数)
2.cookie如何处理
在模拟登录之后,将获取到的cookie进行格式化,然后保存在当前文件夹中的某个位置,后面需要对网页解析的时候,就可以直接读取这个文件来进行使用了
3.如何处理网站传参加密的情况
六.分布式:
1.分布式原理
虽然爬虫是异步加多线程的,但是我们只能在一台主机上运行,所以爬取的效率还是有限制的,分布式爬虫就是将多台主机组合在了一起,来共同完成一个爬取任务,会大大提高效率
2.分布式如何判断爬虫已经停止了
如果是利用scrapy框架进行抓取的时候,可以通过对请求队列的判断,如果请求队列为空的话就代表当前爬虫已经运行结束了
如果是单个爬虫的话就需要对
3.分布式的去重原理
七.数据存储和数据库问题:
1.关系型数据库和非关系型数据库的区别
2.爬下来数据你会选择什么存储方式,为什么
mongodb,非关系型数据库,就是一个个的kv键值对
3.各种数据库支持的数据类型,和特点
4.是否支持事务...
八.Python基础问题:
1.Python2和Python3的区别,如何实现python2代码迁移到Python3环境
2.Python2和Python3的编码方式有什么差别
3.迭代器,生成器,装饰器
4.Python的数据类型
九.协议问题:
1.http协议,请求由什么组成,每个字段分别有什么用,https和http有什么差距
请求是由请求首行(标识HTTP协议的版本,当前请求的方式)、请求头(一对kv键值对)、\r\n、请求体(post请求携带的数据)
http和https之间多了一个SSL加密协议
2.证书问题
https是HTTP+SSL的简称,是在HTTP传输方式的基础上将之前的明文进行了加密传输,在传输之前就会确定信息的加密方式和密钥,在传输过程中即使是被捕获或者伪造,那么也能保证信息不被泄露
而爬虫就是伪装成一个浏览器,发送请求给服务器,参与了整个过程,所以即使是https链接也可以抓取,但是前提是伪造的这个客户端拥有正确的SSL证书
当爬虫在运行过程中要是碰到SSL error的错误,一般是本地证书或者相关的SSL库没有正确的安装,服务器使用了自己制作的CA证书,没有权威机构的认证
3.TCP,UDP各种相关问题
十.数据提取问题:
1.主要使用什么样的结构化数据提取方式,可能会写一两个例子
2.正则的使用
3.动态加载的数据如何提取
4.json数据如何提取
十一.算法问题:
1.你们要善用Python的数据类型,对Python的数据结构深入了解。、
mongodb中的分布式和单只
JS逆向解析
过程:
如何找到登录接口
登录form表单中的action对应的url的地址
通过抓包发现,在这个url地址中和请求体中均是有参数的,切换到手机版参数的个数变少然后再分析JS
确定JS的位置
通过点击按钮,然后点击Event Listener,部分网站可以找到绑定的事件,对应的只需要点击就可以跳转到JS的位置就可以了
部分网站的按钮可能没有绑定JS事件监听,那么这个时候可以通过搜索请求中的关键字来找到JS的位置
观察JS的执行过程
找到JS的位置之后,我们可以通过观察JS的位置,找到JS具体好是如何执行的,后续我们可以通过python程序来模拟JS的执行,或者是使用类似js2py直接把JS代码转化为python 程序去执行
观察JS的执行过程最简单的方式就是添加断点
添加断点之后继续点击登录,每次程序在断点的位置上都会停止,如果这一行有变量产生的话,都会将变量的结果展示在Scoope中
直到JS的执行方法
观察代码知道需要哪些参数
1、我们要登录需要对密码进行加密和获取rkey字段的值
2、rkey字段的值我们直接发送请求rkey请求就可以获取到了
3、密码是先反转然后使用RSA进行加密,JS代码很复杂,我们使用python代码来执行JS实现
1、使用session发送rKey获取登录需要的信息
2、根据获取信息对密码进行加密
3、使用session发送登录请求
scrapy中如何实现暂停爬虫
一个把调度请求保存在磁盘的调度器
一个把访问请求保存在磁盘的副本过滤器[duplicates filter]
一个能持续保持爬虫(键值对)的扩展
job工作路径
要启用持久化支持,只需要通过JOBDIR设置job directory选项
这个路径将会存在所有的请求数据来保持一个单独任务的状态,要注意的是这个目录不允许被不同的spider共享,甚至是同一个spider的不同jobs/runs也不行,也就是说这个目录就是存储一个单独job的状态信息
scrapy中的pipelines工作原理
scrapy通过pipeline模块来执行保存数据的操作
在创建的scrapy项目中自动创建了一个pipeline.py文件,同时创建了一个默认的pipeline类,我们可以根据需要自定义Pipeline类,然后在settings中进行配置就可以了
scrapy的pipelines如何丢弃一个item对象
通过raise DropItem方法
scrapy中的爬虫中间件和下载中间件的作用
scrapy_redis组件的作用
实现了分布式爬虫,url去重、调度器、数据持久化
scheduler:调度器
dupefilter:URL去重规则,被调度器使用
pipeline:数据持久化
scrapy-redis组件中如何实现多任务的去重
内部进行配置,连接redis数据库
去重的规则通过redis的集合完成
去重规则中将url转换成唯一标识,然后在redis中检查是否已经在集合存在了
正反向代理:
正向代理:
客户端出去找一个代理去访问服务器,服务器不知道你的真实的IP
反向代理:
服务器找一个代理给你响应,你不知道服务器的真实IP