基于scrapy框架的爬虫
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。
scrapy 框架
- 高性能的网络请求
- 高性能的数据解析
- 高性能的持久化存储
- 深度爬取
- 全站爬取
- 分布式
- 中间件
- 请求传参
环境的安装
- mac/linux:pip install scrapy
- windows:
- pip install wheel
- twisted(异步相关,scrapy 的异步由twisted实现)
- 一定要在twisted安装成功的情况下执行后面的安装
环境测试: cmd中 输入scrapy 就安装成功
基本使用
新建一个工程:
终端下
scrapy startproject ProName
- 如果环境变量中没有,前面加
python -m scrapy startproject ProName
- 如果环境变量中没有,前面加
目录结构
- spiders(包):空包
修改配置文件(settings.py)
不遵从robots
ROBOTSTXT_OBEY = False
UA伪装
USER_AGENT = 'xxx'
日志等级的指定
LOG_LEVEL = 'ERROR'
LOG_FILE = './file.txt'
scrapy crawl spiderName --nolog
不推荐
CONCURRENT_REQUESTS = 16 默认开启的线程数量
AUTOTHROTTLE_START_DELAY = 3 开始下载时限速并延迟时间
AUTOTHROTTLE_MAX_DELAY = 60 高并发请求时最大延迟时间
cd ProName
: 进入到工程目录在spiders(爬虫文件夹)中创建一个爬虫文件
scrapy genspider spiderName www.xxx.com
- url 随意,后面再改
编写代码:主要代码会编写在爬虫文件中
- 爬虫类:父类(spider),后面还有4中爬虫类
- 爬虫文件的名称:当前爬虫源文件的唯一标识
- 通常注释掉 allowed_domains , 因为有些资源是存在别的域名的
- 起始的url列表:
- 列表中存放的url都可以被scrapy进行异步的网络请求
执行工程:
scrapy crawl spiderName
scrapy的数据解析
parse用作数据解析
参数:response 就是响应对象
extract、extract_first() 作用
scrapy的持久化存储
基于终端指令进行持久化存储
- 只可以将parse方法的返回值存储到本地的磁盘文件(指定形式后缀)中。
sracpy crawl spiderName -o filePath
- 局限性:
- 只能是parse的返回值
- 不能存到数据库中
基于管道进行持久化存储(推荐)
编码流程:
- 在爬虫文件中进行数据解析
- 在item类中定义相关的属性/字段
- 将解析到的数据存储到一个item类型的对象中
- Field类型视为一个万能的数据类型
- 将item类型的对象提交给管道
- 采用这样的规则是比手动存效率高的。
- 管道负责持久化存储
- yield item 将item提交给管道
- 管道类的process_item方法负责接收item,接收到后可以对item实现任意形式的持久化存储操作。
- return item 会将item传递给下一个即将执行的管道类。
- 重写父类方法 open_spider 该方法只会被执行一次,并且在爬虫之前执行
- 重写父类方法 close_spider 该方法只会被执行一次,并且在爬虫结束执行
- 在配置文件中开启管道。
- 300 表示的是优先级,数值越小优先级越高,可以定义多个管道类,这样优先级就会起作用。
note:一个管道类对应一种平台的持久化存储
例子:爬取抽屉网热榜
需求:爬取抽屉网热榜的作者和内容并做持久化存储
地址为:https://dig.chouti.com/
①修改spider
生成 spider 文件: scrapy genspider first www.xxx.com
补充数据解析的逻辑:
1 |
# first.py |
②定义Item
定义Item,来将数据从 spider 传入管道并进行处理。
1 |
# items.py |
③定义pipeline
定义 pipeline 来做持久化存储。
1 |
# pipelines.py |
请求传参(深度爬取)
深度爬取:
- 爬取的数据没有存在同一张页面中。
如何实现请求传参:
例如:yield scrapy.Request(detail_url, callback=self.parse_detail, meta={'item': item})
meta= {}
: 可以将meta字典传递给 callback- 在 callback 接收
item = response.meta['item']
scrapy的五大核心组件
- 引擎依据接接受到的数据流的类型调用相关事务!
Scrapy运行流程
①:spider中的url被封装成请求对象交给引擎(每一个对应一个请求对象)
②:引擎拿到请求对象之后,将全部交给调度器
③:调度器过滤掉重复的请求对象(request)(重复的url),然后使用队列来存储非重复的请求对象,并将去重的消息队列回发给引擎
④:引擎将调度器调度出的请求对象交给下载器
⑤:下载器拿到该请求对象去互联网中下载数据
⑥:数据下载成功后会被封装到response中,随后response会被交给下载器
⑦:下载器将response交给引擎
⑧:引擎将response对象交给spiders(爬虫文件)
⑨:spiders拿到response后调用回调方法进行数据解析,解析成功后生成item,随后spiders将item交给引擎
⑩:引擎将解析好的item对象交给管道,管道拿到item后进行数据的持久化存储
引擎
所有组件的交互都要经过引擎,它控制着整个流程。
引擎定义了很多方法(parse,process_item),那它什么时候该执行这是如何做到的呢?
- 通过数据流来判断
作用:
- 接收所有事务流
- 对事务流进行判断来执行下一步
spider
封装成请求对象
调度器
- 调度请求对象
过滤器
- 过滤掉重复的请求对象
队列
- 存储非重复的请求的对象
实体管道
- 做持久化存储
下载器
- 将下载好的数据封装成response对象
- 异步体现在下载器这里
scrapy的异步也体现在下载器的异步,是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。
scrapy的中间件
中间件有哪些?
下载中间件
引擎和下载器之间
爬虫中间件
引擎和spider之间
下载中间件的作用
- 批量拦截所有的请求和响应
为什么需要拦截请求?
- 篡改请求的头信息(headers)(UA)
- 建一个UA池
- request.headers[‘User-Agent’] = ‘xxx’
- 代理
- request.meta[‘proxy’] = ‘http://ip:port'
为什么拦截响应?
- 篡改响应数据
- 篡改响应对象(推荐)
1 |
# middlewares.py |
爬取网易新闻
- 基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法)
(国内、国际、军事、航空、无人机) 新闻数据的标题和内容
分析:
每一个板块下对应的新闻数据都是动态加载出来的
会对5个板块的响应数据进行数据解析,但是板块对应的响应对象中是不包含动态加载的新闻数据的,意味着目前获取的每一个板块对应的响应对象是不满足需求的响应对象!!!
将不满足需求的5个响应对象篡改(工程中一共有1 + 5 + n),修改成满足需求的
- 找到指定的5个不满足需求的响应对象(中间件中完成)
- 使用selenium加载动态数据,获取标题和新闻详情的url
持久化存储:
mysql
redis
完整代码如下:
- wangyi.py
1 |
# wangyi.py |
- items.py
1 |
# items.py |
- middlewares.py
1 |
# middlewares.py |
- pipelines.py
1 |
# pipelines.py # -*- coding: utf-8 -*- import pymysql |
redis
- 启动server 启动cle
- 查看数据 keys *
- lpush key value
- lpush names 123
redis如果不可以写入字典:
- pip install - U redis == 2.10.6
基于scrapy框架的爬虫的更多相关文章
- 基于scrapy框架的爬虫基本步骤
本文以爬取网站 代码的边城 为例 1.安装scrapy框架 详细教程可以查看本站文章 点击跳转 2.新建scrapy项目 生成一个爬虫文件.在指定的目录打开cmd.exe文件,输入代码 scrapy ...
- 基于Scrapy框架的Python新闻爬虫
概述 该项目是基于Scrapy框架的Python新闻爬虫,能够爬取网易,搜狐,凤凰和澎湃网站上的新闻,将标题,内容,评论,时间等内容整理并保存到本地 详细 代码下载:http://www.demoda ...
- 基于scrapy框架输入关键字爬取有关贴吧帖子
基于scrapy框架输入关键字爬取有关贴吧帖子 站点分析 首先进入一个贴吧,要想达到输入关键词爬取爬取指定贴吧,必然需要利用搜索引擎 点进看到有四种搜索方式,分别试一次,观察url变化 我们得知: 搜 ...
- 基于scrapy框架的分布式爬虫
分布式 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取. 原生的scrapy是无法实现分布式 调度器无法被共享 管道无法被共享 基于 scrapy+redi ...
- Scrapy 框架,爬虫文件相关
Spiders 介绍 由一系列定义了一个网址或一组网址类如何被爬取的类组成 具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. 简单来说就是帮助你爬取数据的地方 内部行为 #1.生成初始的Re ...
- 群辉6.1.7安装scrapy框架执行爬虫
只针对会linux命令,会python的伙伴, 使用环境为: 群辉ds3615xs 6.1.7 python3.5 最近使用scrapy开发了一个小爬虫,因为很穷没有服务器可已部署. 所以打起了我那台 ...
- 09 Scrapy框架在爬虫中的使用
一.简介 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.它集成高性能异步下载,队列,分布式,解析,持久化等. Scrapy 是基于twisted框架开发而来,twisted是一个 ...
- 一个scrapy框架的爬虫(爬取京东图书)
我们的这个爬虫设计来爬取京东图书(jd.com). scrapy框架相信大家比较了解了.里面有很多复杂的机制,超出本文的范围. 1.爬虫spider tips: 1.xpath的语法比较坑,但是你可以 ...
- 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案
Python爬虫总结 总的来说,Python爬虫所做的事情分为两个部分,1:将网页的内容全部抓取下来,2:对抓取到的内容和进行解析,得到我们需要的信息. 目前公认比较好用的爬虫框架为Scrapy,而且 ...
随机推荐
- Python:出现UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in position 0: invalid continuation byte问题
我在导入一个csv文件的时候出现了一个问题 报错的内容是这样的: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc9 in positio ...
- bzoj 1787 && bzoj 1832: [Ahoi2008]Meet 紧急集合(倍增LCA)算法竞赛进阶指南
题目描述 原题连接 Y岛风景美丽宜人,气候温和,物产丰富. Y岛上有N个城市(编号\(1,2,-,N\)),有\(N-1\)条城市间的道路连接着它们. 每一条道路都连接某两个城市. 幸运的是,小可可通 ...
- 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)
P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in B ...
- visual studio 和visual studio code 的区别是什么?
区别有三: 区别一:含义不一样. Visual Studio(简称VS)是美国微软公司的开发工具包系列产品,是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具.代码 ...
- [NOI2016]循环之美——结论+莫比乌斯反演
原题链接 好妙的一道神仙题 题目大意 让你求在\(k\)进制下,\(\frac{x}{y}\)(\(x\in [1,n],y\in [1,m]\))中有多少个最简分数是纯循环小数 SOLUTION 首 ...
- javascript内置对象:Date
JavaScript内置函数:Date时间<script> var today=new Date(); weeks=["日","一",& ...
- Codeforces Round #346 (Div. 2) E题 并查集找环
E. New Reform Berland has n cities connected by m bidirectional roads. No road connects a city to it ...
- java实现上传文件夹
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
- 7.20套娃(tao)
套娃(tao) input7 39 53 710 65 102 610 104 110 53 53 9output012 sol: 把查询想象成(x1,y1)向(x2,y2)有边当且仅当(x1< ...
- python_glob模块的使用
glob是Python自己带的一个文件操作相关模块,用它可以查找符合自己目的的文件,就类似于Windows下的文件搜索,支持通配符操作,*,?,[]这三个通配符,*代表0个或多个字符,?代表一个字符, ...