spider基础知识

不羁的心 提交于 2020-03-18 03:29:30

1. 描述下scrapy框架运行的机制?
答:从start_urls里获取第一批url并发送请求,请求由引擎交给调度器入请求队列,获取完毕后,调度器将请求队列里的请求交给下载器去获取请求对应的响应资源,并将响应交给自己编写的解析方法做提取处理:1. 如果提取出需要的数据,则交给管道文件处理;2. 如果提取出url,则继续执行之前的步骤(发送url请求,并由引擎将请求交给调度器入队列...),直到请求队列里没有请求,程序结束。


2. scrapy和scrapy-redis有什么区别?为什么选择redis数据库?
答:
1) scrapy是一个Python爬虫框架,爬取效率极高,具有高度定制性,但是不支持分布式。

而scrapy-redis一套基于redis数据库、运行在scrapy框架之上的组件,可以让scrapy支持分布式策略,Slaver端共享Master端redis数据库里的item队列、请求队列和请求指纹集合。
2) 为什么选择redis数据库,因为redis支持主从同步,而且数据都是缓存在内存中的,所以基于redis的分布式爬虫,对请求和数据的高频读取效率非常高。


3. 反爬虫的机制有哪些?
答:
1) User—Agent
2) 代理ip
3) 访问频率限制
4) 验证码处理
5) Cookie
6) 动态HTML数据加载


4. 实现模拟登录的方式有哪些?
答:
1) 使用一个具有登录状态的cookie,结合请求报头一起发送,可以直接发送get请求,访问登录后才能访问的页面。
2) 先发送登录界面的get请求,在登录页面HTML里获取登录需要的数据(如果需要的话),然后结合账户密码,再发送post请求,即可登录成功。然后根据获取的cookie信息,继续访问之后的页面。


5. get和post请求有什么区别?分别应该在什么场合下。
答:
1) get请求用于直接获取指定url的响应数据,和服务器没有交互信息。
2) post请求在获取响应数据前,会先发送form表单,服务器会根据form表单来返回响应数据。


6. Selenium、PhantomJS是什么?可以为爬虫做哪些事情?
答:
1) Selenium是一个Web的自动化测试工具,可以导入使用指定的浏览器,在发送请求获取响应后,响应数据则会在指定的浏览器里执行完毕。而PhantomJS是一种无界面浏览器,相比传统的Chrome或Firefox浏览器等,资源消耗会更少。
2) 在Python爬虫代码里使用Selenium和PhantomJS组合,相当于真实浏览器的执行状态,可以直接获取动态HTML数据(如JavaScript、Ajax加载的数据等),并且支持模拟键盘事件、鼠标点击事件、执行JavaScript语句等。在一些反爬虫极端情况下,Selenium+PhantomJS可以作为终极解决方案。


7、简单介绍下scrapy的异步处理。
答:scrapy框架的异步机制是基于twisted异步网络框架处理的,在settings.py文件里可以设置具体的并发量数值(默认是并发量16)。

 

scrapy-redis架构

Scheduler: 把这个Scrapy queue换成redis数据库(也是指redis队列),从同一个redis-server存放要爬取的request,便能让多个spider去同一个数据库里读取。
Duplication Filter:去重,redis的set 不重复的特性,
Item Pipeline: 管道
Base Spider: 重写的RedisSpider继承了Spider和RedisMixin这两个类

流程:

每当一个spider产出一个request的时候,scrapy引擎会把这个reuqest递交给这个spider对应的scheduler对象进行调度,scheduler对象通过访问redis对request进行判重,如果不重复就把他添加进redis中的调度器队列里。当调度条件满足时,scheduler对象就从redis的调度器队列中取出一个request发送给spider,让他爬取。

当spider爬取的所有暂时可用url之后,scheduler发现这个spider对应的redis的调度器队列空了,于是触发信号spider_idle,spider收到这个信号之后,直接连接redis读取strart_url池,拿去新的一批url入口,然后再次重复上边的工作。

 

python2 和 python3 的区别?

编码方面:Py3.X 源码文件默认使用 utf-8 编码 

语法方面:1)去除了<>,全部改用!=

     2)关键词加入 as 和 with,还有 True,False,None 

     3)输入函数改变了,删除了 raw_input,用 input 代替: 

字符串和字节串: 字符串只有 str 一种类型  关于字节串

面向对象: 引入抽象基类,

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!