scrapy框架了解与使用

news2024/11/13 21:25:55

scrapy介绍与安装

Scrapy 是开源和协作的一个基于 Twisted 实现的异步处理爬虫框架使用纯 Python 语言编写,被誉为爬虫界的Django,Scrapy 框架应用广泛,常用于数据采集、网络监测,以及自动化测试等

Scrapy安装

mac、linux系统

pip install scrapy

在Windows中可能会出现报错等情况这是因为依赖没有安装需要先安装相关依赖

1.pip install scrapy # 报错安装下面依赖

2、pip3 install wheel #安装后,便支持通过wheel文件安装软件   xx.whl
3、pip3 install lxml
4、pip3 install pyopenssl
5、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/
6、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted
7、执行pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd64.whl
8、pip3 install scrapy
        

创建Scrapy爬虫项目

创建爬虫项目:scrapy startproject 项目名

创建爬虫:scrapy genspider 名字 网址

启动爬虫:scrapy crawl 爬虫名字 --nolog

在pycharm中运行

# 新建run.py
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', '爬虫名','--nolog'])

Scrapy架构工作流程

Scrapy 框架构成组件:

引擎(EGINE)引擎负责控制系统所有组件之间数据流,并在某些动作发生时触发事件。
调度器(SCHEDULER)用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回,可以想像成一个URL的优先级队列,由它来决定下一个抓取的网址是什么,同时去除重复网址
下载器(DOWLOADER)用于下载网页内容,并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的
爬虫(SPIDERS)开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求
项目管道(ITEM PIPLINES)在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作
下载中间件(Downloader Middlewares)位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,可用该中间件做一下几件事:设置请求头,设置cookie,使用代理,集成selenium
爬虫中间件(Spider Middlewares)位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)

Scrapy 工作流程示意图如下所示:

 Scrapy相关配置

1.1settings基础配置

#1  是否遵循爬虫协议
ROBOTSTXT_OBEY = True
#2 LOG_LEVEL 日志级别
LOG_LEVEL='ERROR'  # 报错如果不打印日志,在控制台看不到错误

# 3 USER_AGENT
USER_AGENT = ''

# 4 DEFAULT_REQUEST_HEADERS 默认请求头
DEFAULT_REQUEST_HEADERS = {
   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
   'Accept-Language': 'en',
}

# 5 SPIDER_MIDDLEWARES 爬虫中间件
SPIDER_MIDDLEWARES = {
    'cnblogs.middlewares.CnblogsSpiderMiddleware': 543,
}
# 6 DOWNLOADER_MIDDLEWARES  下载中间件
DOWNLOADER_MIDDLEWARES = {
    'cnblogs.middlewares.CnblogsDownloaderMiddleware': 543,
}

# 7 ITEM_PIPELINES 持久化配置
ITEM_PIPELINES = {
    'cnblogs.pipelines.CnblogsPipeline': 300,
}


#8 爬虫项目名字
BOT_NAME = 'onefirstscrapy'

#9 指定爬虫类的py文件的位置
SPIDER_MODULES = ['onefirstscrapy.spiders']
NEWSPIDER_MODULE = 'onefirstscrapy.spiders'

1.2增加爬虫的爬取效率

#1 增加并发:默认16
默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改
CONCURRENT_REQUESTS = 100
值为100,并发设置成了为100。
#2 降低日志级别:
在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:
LOG_LEVEL = 'INFO'
# 3 禁止cookie:
如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:
COOKIES_ENABLED = False
# 4 禁止重试:
对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:
RETRY_ENABLED = False
# 5 减少下载超时:
如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:
DOWNLOAD_TIMEOUT = 10 超时时间为10s

持久化方案

一般常用基于管道的持久化存储scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可。要想使用scrapy的持久化操作功能

items.py:数据结构模板文件。定义数据属性。
pipelines.py:管道文件。接收数据(items),进行持久化操作。

 持久化流程:

-1 在items.py中写一个类[相当于写django的表模型],继承scrapy.Item
-2 在类中写属性,写字段,所有字段都是scrapy.Field类型

title = scrapy.Field()

-3 在爬虫中导入类,实例化得到对象,把要保存的数据放到对象中

item['title'] = title   # 注意用[]取而不是.
解析类中 yield item

-4 修改配置文件,指定pipline,数字表示优先级,越小越大

ITEM_PIPELINES = {
    'crawl_cnblogs.pipelines.CrawlCnblogsPipeline': 300,
}

-5 写一个pipline:CrawlCnblogsPipeline
        open_spider:数据初始化,打开文件,打开数据库链接
         process_item:真正存储的地方
         一定不要忘了return item,交给后续的pipline继续使用
        close_spider:销毁资源,关闭文件,关闭数据库链接

 爬虫和下载中间件

scrapy的所有中间件都写在middlewares.py中做一些拦截

有两种中间件:下载器中间件(Downloader Middleware)和爬虫中间件(Spider Middleware)

# 爬虫中间件
MyfirstscrapySpiderMiddleware
    def process_spider_input(self, response, spider): # 进入爬虫会执行它
    def process_spider_output(self, response, result, spider): #从爬虫出来会执行它
    def process_spider_exception(self, response, exception, spider):#出了异常会执行
    def process_start_requests(self, start_requests, spider):#第一次爬取执行
    def spider_opened(self, spider): #爬虫开启执行

# 下载中间件
MyfirstscrapyDownloaderMiddleware
    def process_request(self, request, spider): # request对象从引擎进入到下载器会执行
    def process_response(self, request, response, spider):# response对象从下载器进入到引擎会执行
    def process_exception(self, request, exception, spider):#出异常执行它
    def spider_opened(self, spider): #爬虫开启执行它

下载中间件的process_request,process_response返回值

# 下载中间件的process_request返回值:
    - return None: 继续执行下面的中间件的process_request
    - return a Response object: 不进入下载中间件了,直接返回给引擎,引擎把它通过6给爬虫
    - return a Request object:不进入中间件了,直接返回给引擎,引擎把它放到调度器中
    - raise IgnoreRequest: process_exception() 抛异常,会执行process_exception

# 下载中间件的process_response返回值:
    - return a Response object:正常,会进入到引擎,引擎把它给爬虫
    - return a Request object: 会进入到引擎,引擎把它放到调度器中,等待下次爬取
    - raise IgnoreRequest     会执行process_exception

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/69392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【入门AI】利用Paddle实现简单的数字识别

梳理逻辑 整个流程 准备好Paddle的环境准备好训练样本设计模型(定义模型)训练模型模型测试 1、准备好环境 #加载飞桨和相关类库 import paddle from paddle.nn import Linear import paddle.nn.functional as F import os import numpy as np import matplotlib.pyplot as plt…

集美大学第14届蓝桥校选题解

本次比赛的出题表如下: 退役一年,勋总还是那么强呜呜呜 目录填空题[1] 十甚至九题意思路拓展[蓝桥杯] XXX 进制减法第十三届蓝桥杯C/C省赛B组 E题[2] 九大于十题意思路[3] N皇后签到题[1] JMU最强蓝人[2] 哪有赌狗一直输[3] 元胞自动机题意思路代码实…

PLC程序实例二:ModBusTCP客户端编程实例与测试方法

一、需求描述 1、设备作为服务端时,需要给出对应的测试方法,即要求 PLC 作为客户端,设备作为服务端,因此要求编写 PLC 的ModBusTCP客户端 2、先了解一下设备作为服务端的ModBusTCP网络触发业务逻辑 (1)设…

SQL 语法速成手册

基本概念 数据库术语 数据库(database):保存有组织的数据的容器(通常是一个文件或一组文件)。数据表(table) :某种特定类型数据的结构化清单。模式(schema)…

JAVA SCRIPT设计模式--创建型设计模式之抽象工厂(1)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…

这俩个技巧 解决了90%的冲突

解决冲突的关键技巧 关于本书作者: 达纳.卡斯帕森,冲突调节的专家,尚普兰大学人际冲突专业的硕士。三次获得芭蕾舞国际协会搬的最佳舞者奖。 关于本书: 这是一本引导别人如何化解一段冲突,达成一次有效沟通的社交类…

DataX 及 DataX-Web 安装使用详解

文章目录一、DataX安装1、解压datax.tar.gz2、运行自检脚本二、Datax-Web安装1、解压DataXWeb安装包2、执行一键安装脚本3、启动服务前段时间在项目上使用了阿里的离线数据同步工具datax,在大批量的表同步过程中踩了一些坑,所以详细介绍一下,…

五、伊森商城 前端基础-Vue Vue脚手架原理与使用 p27

目录 Vue项目结构 一、使用vue脚手架进行模块化开发 1、main文件 1.1、首先new Vue创建了一个vue实例,这个实例挂载了index.html中的app元素 1.2、使用了路由,这个路由是简写的写法 1.3、components使用了一个组件叫App 1.4、最终渲染 2、App.vu…

卷积神经网络相关模型

卷积神经网络相关模型1. CNN架构2. CNN架构模型2.1LeNet模型2.2Alexnet模型2.3VGG16模型2.3.1 使用多层小卷积核代替一层大的卷积核优点2.3.2 使用1*1卷积核优点2.3.2 模型特点卷积神经网络基本概念相关知识连接 卷积神经网络基本概念相关知识连接 1. CNN架构 模型分为2部分【…

ubuntu1804在rviz中显示kitti数据集的2D检测框和激光雷达的3D检测框

之前所做的工作参考上篇博客ubuntu1804发布kitti数据集的gps资料,imu资料(包含发布图片,点云过程)_FYY2LHH的博客-CSDN博客 本次将详解如何在ros播放的kitti数据集上作出检测框,首先需要知道的是对于kitti数据集中的每一帧都必须提前进行标注,而这个工作已经被别人完成了…

42. Python range函数—生成器函数

42. range函数—生成器函数 文章目录42. range函数—生成器函数1. 什么是range( )函数2. 回顾列表切片的语法3. range( )函数的语法3. range函数实操3.1 只有1个参数3.2 有2个参数3.3 有3个参数3.4 步长为负数4. list不能完全替代range5. 总结1. 什么是range( )函数 range[reɪ…

基于遗传算法在机器人路径规划中的应用研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

第十七章 优先队列优化Dijkstra算法

第十七章 优先队列优化Dijkstra算法一、普通dijkstra算法的缺陷1、选出最小距离的过程:2、松弛所有点的过程:二、如何优化1、代码模板(1)问题:(2)模板:2、详细解读三、优化分析1、使…

5G赋能行业应用,助推数智化转型!

导语 | 5G 技术的蓬勃发展推动其行业应用的巨轮乘风破浪、扬帆启航,5G 技术不断落地布局于各行各业,基础建设也不断完善,5G to B 的时代已经到来。此次,我们邀请到了中国电信研究院工业互联网技术研发部主任、腾讯云 TVP 谭华老师…

知识图谱-KGE-语义匹配-双线性模型(打分函数用到了双线性函数)-2014:TATEC

【paper】 Effective Blending of Two and Three-way Interactions for Modeling Multi-relational Data 【简介】 本文是法国 Antoine Bordes 团队发表在 ECML-PKDD 2014 上的工作,提出了 TATEC(Two and Three-way Embeddings Combination)…

ERP+MES集成管理系统重要性有哪些?

随着企业信息化观念的提升,管理方式也愈来愈信息化,因此以信息化推动企业的不断发展趋势已变成企业存活和发展的主要核心理念。其中ERP 系统和 MES 系统在企业发展和改革中起着非常重要的作用。当各种信息化系统在企业内各个部门顺利执行的同…

RabbitMQ安装教程(超详细)

本教程是在centos8下试验的,其实linux系统的都差不多 RabbitMQ官方:Messaging that just works — RabbitMQ RabbitMQ是开源AMQP实现,服务器端用Erlang语言编写,Python、Ruby、 NET、Java、JMS、c、PHP、action screcrive AMQP …

python 爬虫入门该怎么学习?

前言 1、什么是爬虫和爬虫的基本逻辑 “爬虫”是一种形象的说法。互联网比喻成一张大网,爬虫是一个程序或脚本在这种大网上爬走。碰到虫子(资源),若是所需的资源就获取或下载下来。这个资源通常是网页、文件等等。可以通过该资源…

Android NDK 开发之 CMake 必知必会

Android Studio 从 2.2 版本起开始支持 CMake ,可以通过 CMake 和 NDK 将 C/C 代码编译成底层的库,然后再配合 Gradle 的编译将库打包到 APK 中。 这意味就不需要再编写 .mk 文件来编译 so 动态库了。 CMake 是一个跨平台构建系统,在 Android Studio 引…

12月7日 补充数据库链式操作,只生成sql语句,不执行sql的几种函数以及thinkphp中验证器

补充知识: 生成sql语句但是不会执行sql语句 public function fetchSqlTest(){$result Db::name(user)->fetchSql(true)->select();//dump($result);//使用正常select查询默认中select(true)改为false即可返回sql语句$result Db::name(user)->…