。。。

一.项目问题:

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

 

你可能感兴趣的:(。。。)