1.爬虫大概流程
- 发起请求
- 通过HTTP库向目标站点发起请求,也就是发送一个 Request,请求可以包含额外的header等信息,等待服务器响应
- 获取响应内容
- 如果服务器能正常响应,会得到一个 Response,Response 的内容便是所要获取的页面内容,类型可能是 HTML,Json 字符串,二进制数据(图片或者视频)等类型
- 解析内容
- 得到的内容可能是 HTML,可以用正则表达式,页面解析库等进行解析,可能是Json,可以直接转换为 Json 对象解析,可能是二进制数据,可以做保存或者进一步的处理
- 保存数据
- 保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件
2.反反爬措施
- 添加 headers,比如常用的 user-agent,cookie 等
- 设置 ip 代理池
- 设置休眠时间,每次请求之前停顿一下
- 验证码识别
- 解决 ajax 动态加载
3.scrapy 核心组件
- 调度器
- 用来接受引擎发过来的请求,由过滤器过滤重复的url并将其压入队列中,在引擎再次请求的时候返回,可以想象成一个URL(抓取网页的网址或者说是链接)的优先队列,由他决定下一个要抓取的网址是什么,用户可以根据自己的需求定制调度器
- 下载器
- 下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源,Scrapy的下载器代码不会太复杂,但效率高(原因:Scrapy下载器是建立在twisted这个高效的异步模型上的)
- 爬虫
- 爬虫是主要干活的,用户最关心的部分, 它可以生成url, 并从特定的url中提取自己需要的信息, 即所谓的实体(Item). 用户也可以从中提取出链接, 让Scrapy继续抓取下一个页面
- 实体管道
- 负责处理爬虫从网页中抽取的实体, 主要的功能是持久化实体、验证实体的有效性、清除不需要的信息. 当页面被爬虫解析后, 将被发送到项目管道, 并经过几个特定的次序处理数据.
- 引擎
- Scrapy引擎是整个框架的核心。它用来控制调度器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。对整个系统的数据流进行处理, 触发事务(框架核心).
scrapy 工作流程
- spider中的url被封装成请求对象交给引擎(每一个对应一个请求对象)
- 引擎拿到请求对象之后,将全部交给调度器
- 调度器拿到所有请求对象后,通过内部的过滤器过滤掉重复的url,最后将去重后的所有url对应的请求对象压入到队列中,随后调度器调度出其中一个请求对象,并将其交给引擎
- 引擎将调度器调度出的请求对象交给下载器
- 下载器拿到该请求对象去互联网中下载数据
- 数据下载成功后会被封装到response中,随后response会被交给下载器
- 下载器将response交给引擎
- 引擎将response交给spiders
- spiders拿到response后调用回调方法进行数据解析,解析成功后生成item,随后spiders将item交给引擎
- 引擎将item交给管道,管道拿到item后进行数据的持久化存储