scrapy

scrapy介绍安装--架构

Scrapy 是一个爬虫框架(底层代码封装好了,只需要在固定位置写固定代码即可),应用领域比较广泛---》爬虫界的django# 安装
#Windows平台1、pip3 install wheel #安装后,便支持通过wheel文件安装软件,wheel文件官网:https://www.lfd.uci.edu/~gohlke/pythonlibs3、pip3 install lxml4、pip3 install pyopenssl5、下载并安装pywin32:https://sourceforge.net/projects/pywin32/files/pywin32/6、下载twisted的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted7、执行pip3 install 下载目录\Twisted-17.9.0-cp36-cp36m-win_amd64.whl8、pip3 install scrapy#Linux,mac平台1、pip3 install scrapy# scrapy架构
# 引擎(EGINE):引擎负责控制系统所有组件之间的数据流,并在某些动作发生时触发事件。大总管,负责整个爬虫数据的流动# 调度器(SCHEDULER)用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL的优先级队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址#下载器(DOWLOADER) 用于下载网页内容, 并将网页内容返回给EGINE,下载器是建立在twisted这个高效的异步模型上的(效率很高,同时可以发送特别多请求出出)#爬虫(SPIDERS) SPIDERS是开发人员自定义的类,用来解析responses,并且提取items,或者发送新的请求#项目管道(ITEM PIPLINES) 在items被提取后负责处理它们,主要包括清理、验证、持久化(比如存到数据库)等操作# 下载器中间件(Downloader Middlewares)位于Scrapy引擎和下载器之间,主要用来处理从EGINE传到DOWLOADER的请求request,已经从DOWNLOADER传到EGINE的响应response,你可用该中间件做以下几件事# 爬虫中间件(Spider Middlewares)位于EGINE和SPIDERS之间,主要工作是处理SPIDERS的输入(即responses)和输出(即requests)# 创建scrapy项目---》使用命令# 创建项目-scrapy startproject 项目名字# 创建爬虫 -scrapy genspider cnblogs www.cnblogs.com# 启动爬虫scrapy crawl cnblogs# 使用脚本运行爬虫
# run.py
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'cnblogs','--nolog'])

 

scrapy项目目录结构

mysfirstscrapy  # 项目名mysfirstscrapy # 包spiders    # 包,里面放了自定义的爬虫,类似于app__init__.pybaidu.py  # 百度爬虫cnblogs.py#cnblogs爬虫items.py      #类似于django的 models表模型,一个个模型类middlewares.py # 中间件pipelines.py #管道---》写持久化settings.py #项目配置文件scrapy.cfg  # 项目上线配置# 后期我们只关注spiders中得爬虫和pipelines持久化即可

scrapy解析数据

1 response对象有css方法和xpath方法-css中写css选择器-xpath中写xpath选择
2 重点1:-xpath取文本内容'.//a[contains(@class,"link-title")]/text()'-xpath取属性'.//a[contains(@class,"link-title")]/@href'-css取文本'a.link-title::text'-css取属性'img.image-scale::attr(src)'
3 重点2:.extract_first()  取一个.extract()        取所有
import scrapy# 爬虫类,继承了scrapy.Spider
class CnblogsSpider(scrapy.Spider):name = 'cnblogs'  # 爬虫名字allowed_domains = ['www.cnblogs.com']  # 允许爬取的域---》start_urls = ['http://www.cnblogs.com/']  # 开始爬取的地址# css解析解析方法# def parse(self, response):#     # print(response.text) # http响应包装成了response#     # scrapy 内置了解析库,不需要使用第三方:支持xpath和css#     ######css选择器######     # 解析出所有文章#     article_list = response.css('article.post-item')  # 列表中放对象#     print(len(article_list))#     # 继续解析文章详情:文章标题,文章摘要,作者图片,作者名字,文章详情地址#     for article in article_list:#         title = article.css('section>div>a.post-item-title::text').extract_first()#         desc = article.css('p.post-item-summary::text').extract()#         real_desc = desc[0].replace('\n', '').replace(' ', '')#         if real_desc:#             desc = real_desc#         else:#             real_desc = desc[1].replace('\n', '').replace(' ', '')#             desc = real_desc#         author_img = article.css('p.post-item-summary img::attr(src)').extract_first()#         author_name = article.css('footer.post-item-foot span::text').extract_first()#         url = article.css('div.post-item-text a::attr(href)').extract_first()#         print('''#         文章名字:%s#         文章摘要:%s#         作者图片:%s#         作者名字:%s#         文章地址:%s#         ''' % (title, desc, author_img, author_name, url))def parse(self, response):######xpath选择器###### 解析出所有文章article_list = response.xpath('//article[contains(@class,"post-item")]')  # 列表中放对象print(len(article_list))# 继续解析文章详情:文章标题,文章摘要,作者图片,作者名字,文章详情地址for article in article_list:# title = article.xpath('./section/div/a/text()').extract_first()title = article.xpath('.//a/text()').extract_first()desc = article.xpath('.//p[contains(@class,"post-item-summary")]/text()').extract()real_desc = desc[0].replace('\n', '').replace(' ', '')if real_desc:desc = real_descelse:real_desc = desc[1].replace('\n', '').replace(' ', '')desc = real_desc# p.post-item-summary img::attr(src)author_img = article.xpath('.//p//img/@src').extract_first()#div.post-item-text a::attr(href)author_name = article.xpath('.//footer//span/text()').extract_first()url = article.xpath('.//div[contains(@class,"post-item-text")]//a/@href').extract_first()print('''文章名字:%s文章摘要:%s作者图片:%s作者名字:%s文章地址:%s''' % (title, desc, author_img, author_name, url))'''
一启动爬虫:把start_urls地址包装成request对象---》
丢给引擎---》调度器---》排队---》引擎---》下载中间件---》下载器---》下载完成---》引擎---》爬虫----》就回到了parse'''

setting配置

基础配置

#1 了解
BOT_NAME = "firstscrapy"  #项目名字,整个爬虫名字
#2 爬虫存放位置    了解
SPIDER_MODULES = ["firstscrapy.spiders"]
NEWSPIDER_MODULE = "firstscrapy.spiders"#3  记住 是否遵循爬虫协议,一般都设为False
ROBOTSTXT_OBEY = False
# 4 记住
USER_AGENT = "firstscrapy (+http://www.yourdomain.com)"#5  记住  日志级别
LOG_LEVEL='ERROR'#6   记住 DEFAULT_REQUEST_HEADERS 默认请求头
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',
}#7 记住 后面学  SPIDER_MIDDLEWARES 爬虫中间件
SPIDER_MIDDLEWARES = {'cnblogs.middlewares.CnblogsSpiderMiddleware': 543,
}
#8 后面学 DOWNLOADER_MIDDLEWARES  下载中间件
DOWNLOADER_MIDDLEWARES = {'cnblogs.middlewares.CnblogsDownloaderMiddleware': 543,
}#9 后面学 ITEM_PIPELINES 持久化配置
ITEM_PIPELINES = {'cnblogs.pipelines.CnblogsPipeline': 300,
}

高级配置(提高爬虫效率--scarpy框架)

#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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 Proteus仿真全自动洗衣机洗涤脱水-0074

STM32 Proteus仿真全自动洗衣机洗涤脱水-0074 Proteus仿真小实验: STM32 Proteus仿真全自动洗衣机洗涤脱水-0074 功能: 硬件组成:STM32F103R6单片机LCD1602显示器 L298N驱动电机正反转蜂鸣器LED指示灯多个按键(标准洗,快速洗&a…

java中json和对象之间相互转换的运用

1.目录结构 2.配置相关文件 2.1.引入相关的pom文件 pom.xml <dependencies><!-- JSON --><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</vers…

MySQL基本查询

目录 create 替换 Retrieve select 全列查询 限制查询长度 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 where条件​编辑 结果排序 筛选分页结果 Update Delete 删除整张表 截断表 插入查询结果 聚合函数 group by子句的使用 create INSERT…

STM32单片机语音识别台灯控制系统人检测亮度调节

实践制作DIY- GC00156-语音识别台灯控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别台灯控制系统 二、功能说明&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器 1.任何时候没有人则关闭灯。有人可以自动打开灯。…

【PHP面试题28】Redis中的connect和pconnect如何使用,有什么区别

文章目录 一、背景二、connect函数三、pconnect函数四、区别和使用场景五、总结 一、背景 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题&#xff0c;对标资深工程师/架构师序列&#xff0c;欢迎大家提前关注锁定。 Redis是一个开…

挖矿记录+解决方案:利用GitLab组件对服务器进行挖矿导致CPU占用200%

文章目录 什么是云服务器挖矿?事件记录事件分析产生影响解决方案后期预防什么是云服务器挖矿? 云服务器挖矿是指利用云服务器从事赚取比特币的活动。比特币是一种虚拟数字货币,挖矿是将一段时间内比特币系统中发生的交易进行确认,并记录在区块链上形成新区块的过程。 用于…

复习opencv:螺丝螺纹缺陷检测

螺牙缺陷检测 简述去噪椒盐噪声高斯噪声 小波变换引导滤波求最大凸包判断曲直全部代码 简述 今天收到了一个检测螺牙缺陷的问题&#xff0c;当复习opencv练个手&#xff0c;记录一下基础知识。这里的代码是检测弯曲的&#xff0c;其他缺陷用yolo处理。东家给的图片有的是有干扰…

能翻译维吾尔语的软件有哪些?这几个可以用用看

能翻译维吾尔语的软件有哪些&#xff1f;在如今全球化的背景下&#xff0c;不同语言之间的沟通交流变得尤为重要。维吾尔语作为中国特有的少数民族语言之一&#xff0c;它的翻译需求日益增长。本文将介绍几款精选的维吾尔语翻译软件&#xff0c;帮助大家顺利实现跨语言沟通。 智…

驱动 day10 作业

要求&#xff1a;platform驱动实现 现象&#xff1a; test.c应用程序 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #in…

Linux系统编程(信号处理 sigacation函数和sigqueue函数 )

文章目录 前言一、sigaction二、sigqueue函数三、代码示例总结 前言 本篇文章我们来介绍一下sigacation函数和sigqueue函数。 一、sigaction sigaction 是一个用于设置和检查信号处理程序的函数。它允许我们指定信号的处理方式&#xff0c;包括指定一个函数作为信号处理程序…

XML文档详解

目录 XML文档 一、XML文件 二、Dom4J解析XML文件 三、Sax解析XML文件 四、使用Dom4j的XPath解析XML文件 4.1XPath语法 4.2 获取sys-config.xml文件的配置信息 4.3 获取server.xml文件的配置信息 4.4 获取bookstore.xml文件的配置信息 XML文档 一、XML文件 1.1 学习重…

MySQL 主从延迟的常见原因及解决方法

主从延迟作为 MySQL 的痛点已经存在很多年了&#xff0c;以至于大家都有一种错觉&#xff1a;有 MySQL 复制的地方就有主从延迟。 对于主从延迟的原因&#xff0c;很多人将之归结为从库的单线程重放。 但实际上&#xff0c;这个说法比较片面&#xff0c;因为很多场景&#xf…