0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)
目录
0.0、Scrapy基础
Python2:适合爬取非中文
Python3:适合爬取中文
Scrapy是一种快速的高级Web爬行和Web抓取框架,用于抓取网站并从其页面中提取结构化数据。它可用于各种用途,从数据挖掘到监控和自动化测试。
0.1、Scrapy 框架图

0.2、Scrapy主要包括了以下组件:
- 引擎(Scrapy): 用来处理整个系统的数据流处理, 触发事务(框架核心)
- 调度器(Scheduler): 用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
- 下载器(Downloader): 用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
- 爬虫(Spiders): 爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
- 项目管道(Pipeline): 负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
- 下载器中间件(Downloader Middlewares): 位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
- 爬虫中间件(Spider Middlewares): 介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
- 调度中间件(Scheduler Middewares): 介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
0.3、Scrapy简单示例如下:
我们将以最简单的方式运行蜘蛛,它在将访问并获取 http://quotes.toscrape.com上的名言(文本)、作者 :
import scrapy
class QuotesSpider(scrapy.Spider):
name = 'quotes'
start_urls = [
'http://quotes.toscrape.com/',
]
def parse(self, response):
for quote in response.css('div.quote'):
yield {
'text': quote.css('span.text::text').get(),
'author': quote.css('small.author::text').get(),
}
next_page = response.css('li.next a::attr("href")').get()
if next_page:
yield response.follow(response.urljoin(next_page), self.parse)
将以上代码放在一个文本文件中,将其命名为quotes_spider.py ,并使用 以下命令运行蜘蛛:
scrapy runspider quotes_spider.py -o quotes.json
运行上述命令后,代码将在命令运行的目录下创建一个名为quotes.json的文件,该文件包含JSON格式的列表,其中包含文本和作者,如下所示(为了更好的可读性,此处重新格式化):
[
{
"text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d",
"author": "Albert Einstein"
},
{
"text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d",
"author": "J.K. Rowling"
},
{
"text": "\u201cThere are only two ways to live your life. One is as though nothing is a miracle. The other is as though everything is a miracle.\u201d",
"author": "Albert Einstein"
},
...省略97条...
]
0.4、Scrapy运行流程如下:
当我们运行“scrapy runspider quotes_spider.py”命令时,Scrapy会查找Spider的定义并通过其爬虫引擎运行它;
通过向start_urls 属性中定义的URL发出请求(在上述示例中即:start_urls = ['http://quotes.toscrape.com/'])开始爬行,并调用默认回调方法parse,将响应对象作为参数进行传递;
在parse回调方法中,我们使用CSS Selector循环遍历quote元素,并将提取的名言文本和作者生成Python dict,除此之外我们还查找指向下一页的链接,将获得的下一页链接再次以同样的方式进行请求处理;
在这里,我们可以看到Scrapy的一个主要优点:请求是 异步调度与处理的。
这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。
这也意味着即使某些请求失败或在处理错误时发生错误,其他请求也可以继续运行。
虽然这使得我们能够进行非常快速的爬网(以容错的方式同时发送多个并发请求),但Scrapy还可以通过一些设置让我们的蜘蛛以更加绅士的方式去爬网。
我们可以执行以下操作:在每个请求之间设置下载延迟,限制每个域或每个IP的并发请求数量,甚至使用自动限制扩展,以尝试自动解决这些问题。
注意:我们在这里使用的是Feed导出生成JSON文件,除此之外我们还可以轻松更改导出格式(例如XML或CSV),存储于后端服务(例如FTP或Amazon S3),还可以编写 item pipeline 用以将 items 存储在数据库中。
运行流程小结:
- 首先,引擎从调度器中取出一个链接(URL)用于接下来的抓取;
- 引擎把URL封装成一个请求(Request)传给下载器,下载器把资源下载下来,并封装成应答包(Response);
- 然后,爬虫解析Response;
- 若是解析出实体(Item),则交给实体管道进行进一步的处理;
- 若是解析出的是链接(URL),则把URL交给Scheduler等待抓取。
0.5、还有什么?
通过上述实践,我们已经了解了如何使用Scrapy从网站中提取和存储项目,但这只是表面。
Scrapy提供了许多强大的功能,可以帮助我们轻松高效地进行抓取,例如:
内置支持使用扩展的CSS选择器和XPath表达式,让我们可以高效地从HTML / XML源代码中选择和提取数据,并使用正则表达式提取辅助方法;
提供交互式Shell控制台(支持IPython),用于尝试使用CSS和XPath表达式来抓取数据,在编写或调试蜘蛛时非常有用;
内置支持以多种格式(JSON,CSV,XML)生成Feed导出并将其存储在多个后端服务(FTP、S3、数据库、本地文件系统)中;
强大的编码支持和自动检测,用于处理外部,非标准和损坏的编码声明;
强大的可扩展性支持,允许使用Signals(信号)和定义良好的API(中间件,扩展和 管道)插入自己的自定义功能;
诸多的内置扩展和中间件用于处理:
- Cookie和会话处理
- HTTP功能,如压缩,身份验证,缓存
- User-Agent 代理请求
- robots.txt
- 爬行深度限制...
一个Telnet控制台,用于连接到Scrapy进程内运行的Python控制台,用以调试爬虫;
还有其他好东西,比如可重复使用的蜘蛛,可以从Sitemaps(站点地图:网站管理员向搜索引擎通知可用于爬行的网站页面的一种简单方法。)和XML / CSV Feed中抓取网站,自动下载与抓取项目相关联的图像(或任何其他媒体)的媒体管道,缓存DNS解析器等等!
0.6、下一步是什么?
接下来的步骤是安装Scrapy, 按照教程学习如何创建一个完整的Scrapy项目。感谢加入社区,谢谢大家的关注!
原文链接:
0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)
(完)
0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)的更多相关文章
- Python爬虫学习:一、相关概念与基础知识
爬虫: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽 ...
- Python爬虫的简单入门(一)
Python爬虫的简单入门(一) 简介 这一系列教学是基于Python的爬虫教学在此之前请确保你的电脑已经成功安装了Python(本教程使用的是Python3).爬虫想要学的精通是有点难度的,尤其是遇 ...
- 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射
使用Code First建模自引用关系笔记 原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...
- APP测试入门篇之APP基础知识(001)
前言 最近两月比较多的事情混杂在一起,静不下心来写点东西,月初想发表一遍接口测试的总结,或者APP测试相关的内容,一晃就月底了,总结提炼一时半会也整不完.放几个早年总结内部培训PPT出来 ...
- Python爬虫三年没入门,传授一下绝世神功,经理唏嘘不已!
长期枯燥的生活,敲代码的时间三天两头往吸烟室跑,被项目经理抓去训话. "入门"是学习Python最重要的阶段,虽然这个过程也许会非常缓慢.当你心里有一个目标时,那么你学习起来就不会 ...
- 这个Python爬虫的简单入门及实用的实例,你会吗?
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:HOT_and_COOl 利用爬虫可以进行数据挖掘,比如可以爬取别人的网 ...
- Thrift入门初探(2)--thrift基础知识详解
昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...
- WCF入门教程:WCF基础知识问与答(转)
学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...
- Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)
简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...
随机推荐
- 一步步带你做vue后台管理框架
1.登录 (1). 一步步带你做vue后台管理框架(三)——登录功能 2.权限控制 (1) 基于Vue2.0实现后台系统权限控制 (2) 手摸手,带你用vue撸后台 系列二(登录权限篇)
- shell的常用脚本一
批量创建用户名脚本: ######################################################################### # File Name: cr ...
- C# MODBUS 通信
背景 电厂有多组监控设备,需要在指定的设备上显示某些数据(其他设备对接过来的).通信协议是modbus主从结构. 源码: http://download.csdn.net/download/wolf1 ...
- hibernate框架的搭建
1 导入所需的jar包 1 导入hibernate必须的jar包 2 导入驱动包 2 创建数据库,准备表,实体 1 创建hibernate数据库 CREATE DATABASE hibernate; ...
- SQL脚本整理系列 三
触发器 SQL 2008 怎么实现删除学生表里面的一条记录,成绩表里面关于这个学生的记录也同时删掉,谢求具体代码 --创建表 DROP TABLE tstudent GO CREATE TABLE t ...
- SpringSecurity 3.2入门(3)单用户登录
1.增加web.xml文件配置如下 <!-- 获取Spring Security session的生命周期,这个监听器会在 session 创建和销毁的时候通知 Spring Security ...
- WPF-MVVM学习心德(WinForm转WPF心德)
接触MVVM接近一段时间了,有一点理解,写下来. 之前是做winform的,工作需要,学习wpf.优缺点就不用说类,网上一大堆.我自己理解的话,有下面几点: 1.首先是界面的xmal和界面分离:wpf ...
- 写C#代码时用到的中文简体字 、繁体字 对应的转化 (收藏吧)
简体字 下面有与之对应的繁体字 private const String Jian = "啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆疤巴拔跋靶 ...
- svn自动更新网站代码
运行环境说明:svn的执行目录: /usr/bin/svnsvn版本库目录: /usr/local/nginx/html/svnrepos/coinhello (其中svnrepos是我各个项目版本库 ...
- mysql六:mysql内置功能(视图、触发器、事务、存储过程、函数)
一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 通过使用视图可以把查询过程中的 ...