Scrapy作为爬虫的进阶内容,可以实现多线程爬取目标内容,简化代码逻辑,提高开发效率,深受爬虫开发者的喜爱,本文主要以爬取某股票网站为例,简述如何通过Scrapy实现爬虫,仅供学习分享使用,如有不足之处,还请指正。

什么是Scrapy?

Scrapy是用python实现的一个为了爬取网站数据,提取结构性数据而编写的应用框架。使用Twisted高效异步网络框架来处理网络通信。Scrapy架构:

关于Scrapy架构各项说明,如下所示:

  • ScrapyEngine:引擎。负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 此组件相当于爬虫的“大脑”,是 整个爬虫的调度中心。
  • Schedule:调度器。接收从引擎发过来的requests,并将他们入队。初始爬取url和后续在页面里爬到的待爬取url放入调度器中,等待被爬取。调度器会自动去掉重复的url。
  • Downloader:下载器。负责获取页面数据,并提供给引擎,而后提供给spider。
  • Spider:爬虫。用户编些用于分析response并提取item和额外跟进的url。将额外跟进的url提交给ScrapyEngine,加入到Schedule中。将每个spider负责处理一个特定(或 一些)网站。
  • ItemPipeline:负责处理被spider提取出来的item。当页面被爬虫解析所需的数据存入Item后,将被发送到Pipeline,并经过设置好次序
  • DownloaderMiddlewares:下载中间件。是在引擎和下载器之间的特定钩子(specific hook),处理它们之间的请求(request)和响应(response)。提供了一个简单的机制,通过插入自定义代码来扩展Scrapy功能。通过设置DownloaderMiddlewares来实现爬虫自动更换user-agent,IP等。
  • SpiderMiddlewares:Spider中间件。是在引擎和Spider之间的特定钩子(specific hook),处理spider的输入(response)和输出(items或requests)。提供了同样简单机制,通过插入自定义代码来扩展Scrapy功能。

Scrapy数据流:

  1. ScrapyEngine打开一个网站,找到处理该网站的Spider,并向该Spider请求第一个(批)要爬取的url(s);
  2. ScrapyEngine向调度器请求第一个要爬取的url,并加入到Schedule作为请求以备调度;
  3. ScrapyEngine向调度器请求下一个要爬取的url;
  4. Schedule返回下一个要爬取的url给ScrapyEngine,ScrapyEngine通过DownloaderMiddlewares将url转发给Downloader;
  5. 页面下载完毕,Downloader生成一个页面的Response,通过DownloaderMiddlewares发送给ScrapyEngine;
  6. ScrapyEngine从Downloader中接收到Response,通过SpiderMiddlewares发送给Spider处理;
  7. Spider处理Response并返回提取到的Item以及新的Request给ScrapyEngine;
  8. ScrapyEngine将Spider返回的Item交给ItemPipeline,将Spider返回的Request交给Schedule进行从第二步开始的重复操作,直到调度器中没有待处理的Request,ScrapyEngine关闭。

Scrapy安装

在命令行模式下,通过pip install scrapy命令进行安装Scrapy,如下所示:

当出现以下提示信息时,表示安装成功

Scrapy创建项目

在命令行模式下,切换到项目存放目录,通过scrapy startproject stockstar 创建爬虫项目,如下所示:

根据提示,通过提供的模板,创建爬虫【命令格式:scrapy genspider 爬虫名称 域名】,如下所示:

注意:爬虫名称,不能跟项目名称一致,否则会报错,如下所示:

通过Pycharm打开新创建的scrapy项目,如下所示:

爬取目标

本例主要爬取某证券网站行情中心股票ID与名称信息,如下所示:

Scrapy爬虫开发

通过命令行创建项目后,基本Scrapy爬虫框架已经形成,剩下的就是业务代码填充。

item项定义

定义需要爬取的字段信息,如下所示:

class StockstarItem(scrapy.Item):"""定义需要爬取的字段名称"""# define the fields for your item here like:# name = scrapy.Field()stock_type = scrapy.Field()  # 股票类型stock_id = scrapy.Field()  # 股票IDstock_name = scrapy.Field()  # 股票名称

定制爬虫逻辑

Scrapy的爬虫结构是固定的,定义一个类,继承自scrapy.Spider,类中定义属性【爬虫名称,域名,起始url】,重写父类方法【parse】,根据需要爬取的页面逻辑不同,在parse中定制不同的爬虫代码,如下所示:

class StockSpider(scrapy.Spider):name = 'stock'allowed_domains = ['quote.stockstar.com']  # 域名start_urls = ['http://quote.stockstar.com/stock/stock_index.htm']  # 启动的urldef parse(self, response):"""解析函数:param response::return:"""item = StockstarItem()styles = ['沪A', '沪B', '深A', '深B']index = 0for style in styles:print('********************本次抓取' + style[index] + '股票********************')ids = response.xpath('//div[@class="w"]/div[@class="main clearfix"]/div[@class="seo_area"]/div[''@class="seo_keywordsCon"]/ul[@id="index_data_' + str(index) + '"]/li/span/a/text()').getall()names = response.xpath('//div[@class="w"]/div[@class="main clearfix"]/div[@class="seo_area"]/div[''@class="seo_keywordsCon"]/ul[@id="index_data_' + str(index) + '"]/li/a/text()').getall()# print('ids = '+str(ids))# print('names = ' + str(names))for i in range(len(ids)):item['stock_type'] = styleitem['stock_id'] = str(ids[i])item['stock_name'] = str(names[i])yield item

数据处理

在Pipeline中,对抓取的数据进行处理,本例为简便,在控制进行输出,如下所示:

class StockstarPipeline:def process_item(self, item, spider):print('股票类型>>>>'+item['stock_type']+'股票代码>>>>'+item['stock_id']+'股票名称>>>>'+item['stock_name'])return item

注意:在对item进行赋值时,只能通过item['key']=value的方式进行赋值,不可以通过item.key=value的方式赋值。

Scrapy配置

通过settings.py文件进行配置,包括请求头,管道,robots协议等内容,如下所示:

# Scrapy settings for stockstar project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.htmlBOT_NAME = 'stockstar'SPIDER_MODULES = ['stockstar.spiders']
NEWSPIDER_MODULE = 'stockstar.spiders'# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'stockstar (+http://www.yourdomain.com)'# Obey robots.txt rules 是否遵守robots协议
ROBOTSTXT_OBEY = False# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)
#COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {# 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Mobile Safari/537.36' #,# 'Accept-Language': 'en,zh-CN,zh;q=0.9'
}# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    'stockstar.middlewares.StockstarSpiderMiddleware': 543,
#}# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    'stockstar.middlewares.StockstarDownloaderMiddleware': 543,
#}# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'stockstar.pipelines.StockstarPipeline': 300,
}# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

Scrapy运行

因scrapy是各个独立的页面,只能通过终端命令行的方式运行,格式为:scrapy crawl 爬虫名称,如下所示:

scrapy crawl stock

如下图所示:

备注

本例内容相对简单,仅为说明Scrapy的常见用法,爬取的内容都是第一次请求能够获取到源码的内容,即所见即所得。实例源码

遗留两个小问题:

  1. 对于爬取的内容需要翻页才能完成,即多次请求,如何处理?
  2. 对于爬取的内容是异步传输,页面请求只是获取一个框架,内容是异步填充,即常见的ajax方式,如何处理?

以上两个问题,待后续遇到时,再进一步分析。一首陶渊明的归田园居,与君共享。

归园田居(其一)

【作者】陶渊明 【朝代】魏晋

少无适俗韵,性本爱丘山。误落尘网中,一去三十年。

羁鸟恋旧林,池鱼思故渊。开荒南野际,守拙归园田。

方宅十余亩,草屋八九间。榆柳荫后檐,桃李罗堂前。

暧暧远人村,依依墟里烟。狗吠深巷中,鸡鸣桑树颠。

户庭无尘杂,虚室有余闲。久在樊笼里,复得返自然。

Python基础之Scrapy简介相关推荐

  1. Python基础之Scrapy进阶

    在上一篇文章Python基础之Scrapy简介中,简述了Scrapy的基本原理,安装步骤,创建项目以及如何通过Scrapy进行简单的爬虫,同时遗留了两个问题,即分页爬取,和异步内容爬取.本文以一个简单 ...

  2. Python基础之py简介和基础语法

    一.Python简介 百度百科对Python的解释是:"Python是一种计算机程序设计语言,由吉多·范罗苏姆创造,第一版发布于1991年,可以视之为一种改良的LISP.Python的设计哲 ...

  3. 萌新向Python数据分析及数据挖掘 第一章 Python基础 第三节 列表简介 第四节 操作列表...

    第一章 Python基础 第三节 列表简介 列表是是处理一组有序项目的数据结构,即可以在一个列表中存储一个序列的项目.列表中的元素包括在方括号([])中,每个元素之间用逗号分割.列表是可变的数据类型, ...

  4. Python基础教程(一):简介、环境搭建、中文编码

    Python 基础教程 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像P ...

  5. python基础(一):python简介

    前言 本系列python基础教程均采用python3.8并向前兼容,所谓吃水不忘挖井人,希望我的教程能够帮助到大家,当然此教程也是参阅了许多博文结合自己的见解而来,仅供参考. python是一款非常友 ...

  6. Python爬虫——Scrapy 简介和安装

    文章目录 Python爬虫--Scrapy 简介和安装 1.Scrapy 简介 2.Scrapy 下载安装 Python爬虫--Scrapy 简介和安装 1.Scrapy 简介 Scrapy 简介 S ...

  7. python基础教程目录-Python基础教程(第2版 修订版) 简介,目录书摘

    编辑推荐: <Python基础教程(第2版·修订版)>是经典的Python入门教程,层次鲜明,结构严谨,内容翔实,特别是最后几章,作者将前面讲述的内容应用到10个引人入胜的项目中,并以模板 ...

  8. Python基础入门学习和简介

    1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...

  9. python的django介绍_【Python基础知识】Django框架简介

    很多初学Python的小伙伴不知道该从何开始学起,其实零基础学习的话可以先学习一些Python基础知识,等基础打牢之后再去接触更加深入的技术,接下来小编就为大家简单介绍一下有关于 Django框架内容 ...

  10. Python高级爬虫框架Scrapy简介

    2019独角兽企业重金招聘Python工程师标准>>> Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框 ...

最新文章

  1. 线性布局与相对布局的嵌套
  2. python 类调用不存在的方法_[python] 类常用的内置方法
  3. Bootstrap3栅格系统布局实例
  4. ubuntu classicmenu-indicator
  5. property_自己编写一个读取Property文件的Util类
  6. js室内地图开发_我开发的开源 JS 地图引擎 maptalks.js, 请大家不吝赐教!
  7. linux 批量删除任务,Linux-Shell脚本学习心得之批量创建、删除用户
  8. 水电水利建设项目水环境与水生生态保护技术政策
  9. 【FPGA】Quartus Prime 20.1 精简版下载安装教程记录
  10. 基于Spark的新闻推荐系统,包含爬虫项目、web网站以及spark推荐系统
  11. Maven命令行查看依赖树
  12. System.Diagnostics.Process.Start的妙用
  13. huge形式_big的最高级形式
  14. 末日边境_永恒的末日是变相的第一人称黑暗灵魂
  15. 最新7z,sdk下载地址
  16. 强烈推荐 | 基于飞桨的五大目标检测模型实战详解
  17. 【Bug】Origin平台,建立EA账号时,显示“很抱歉,我们目前发生技术问题,请稍后再试一次”
  18. 清华博士 计算机 论文,清华博士毕业生获智能交通系统学会最佳博士论文奖-清华大学新闻网...
  19. 像经营公司一样经营自己
  20. 2022年度互联网平均薪资出炉!高到离谱!

热门文章

  1. java 获取本年月份、本月/本周所有日期
  2. 遥感影像处理-NDVI
  3. ios 网速监控_ios app 网速实时监控
  4. 银河麒麟服务器修改ip,银河麒麟配置DNS服务器
  5. (VS2008)Cannot open include file: 'windows.h': No such file or directory 解决办法
  6. 一键生成属于自己的QQ历史报告,看看你对自己的QQ了解程度有多深?
  7. 广东第一高中生_广东男篮签下全美第一高中生 NBA状元热门征战CBA
  8. linux bz2 xz gz,压缩介绍、bz2、gz、xz压缩工具
  9. 使用cs与msf进行内网横向移动
  10. 支付宝APP支付-Android+springboot搭建后端