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 存储在数据库中。

运行流程小结:

  1. 首先,引擎从调度器中取出一个链接(URL)用于接下来的抓取;
  2. 引擎把URL封装成一个请求(Request)传给下载器,下载器把资源下载下来,并封装成应答包(Response);
  3. 然后,爬虫解析Response;
  4. 若是解析出实体(Item),则交给实体管道进行进一步的处理;
  5. 若是解析出的是链接(URL),则把URL交给Scheduler等待抓取。

0.5、还有什么?

通过上述实践,我们已经了解了如何使用Scrapy从网站中提取和存储项目,但这只是表面。

Scrapy提供了许多强大的功能,可以帮助我们轻松高效地进行抓取,例如:

  1. 内置支持使用扩展的CSS选择器和XPath表达式,让我们可以高效地从HTML / XML源代码中选择和提取数据,并使用正则表达式提取辅助方法;

  2. 提供交互式Shell控制台(支持IPython),用于尝试使用CSS和XPath表达式来抓取数据,在编写或调试蜘蛛时非常有用;

  3. 内置支持以多种格式(JSON,CSV,XML)生成Feed导出并将其存储在多个后端服务(FTP、S3、数据库、本地文件系统)中;

  4. 强大的编码支持和自动检测,用于处理外部,非标准和损坏的编码声明;

  5. 强大的可扩展性支持,允许使用Signals(信号)和定义良好的API(中间件,扩展和 管道)插入自己的自定义功能;

  6. 诸多的内置扩展和中间件用于处理:

    1. Cookie和会话处理
    2. HTTP功能,如压缩,身份验证,缓存
    3. User-Agent 代理请求
    4. robots.txt
    5. 爬行深度限制...
  7. 一个Telnet控制台,用于连接到Scrapy进程内运行的Python控制台,用以调试爬虫;

  8. 还有其他好东西,比如可重复使用的蜘蛛,可以从Sitemaps(站点地图:网站管理员向搜索引擎通知可用于爬行的网站页面的一种简单方法。)和XML / CSV Feed中抓取网站,自动下载与抓取项目相关联的图像(或任何其他媒体)的媒体管道,缓存DNS解析器等等!

0.6、下一步是什么?

接下来的步骤是安装Scrapy, 按照教程学习如何创建一个完整的Scrapy项目。感谢加入社区,谢谢大家的关注!

原文链接:

0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)

OpsRoad(运维之路社区)

(完)

0.Python 爬虫之Scrapy入门实践指南(Scrapy基础知识)的更多相关文章

  1. Python爬虫学习:一、相关概念与基础知识

    爬虫: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽 ...

  2. Python爬虫的简单入门(一)

    Python爬虫的简单入门(一) 简介 这一系列教学是基于Python的爬虫教学在此之前请确保你的电脑已经成功安装了Python(本教程使用的是Python3).爬虫想要学的精通是有点难度的,尤其是遇 ...

  3. 使用Code First建模自引用关系笔记 asp.net core上使用redis探索(1) asp.net mvc控制器激活全分析 语言入门必学的基础知识你还记得么? 反射

    使用Code First建模自引用关系笔记   原文链接 一.Has方法: A.HasRequired(a => a.B); HasOptional:前者包含后者一个实例或者为null HasR ...

  4. APP测试入门篇之APP基础知识(001)

    前言        最近两月比较多的事情混杂在一起,静不下心来写点东西,月初想发表一遍接口测试的总结,或者APP测试相关的内容,一晃就月底了,总结提炼一时半会也整不完.放几个早年总结内部培训PPT出来 ...

  5. Python爬虫三年没入门,传授一下绝世神功,经理唏嘘不已!

    长期枯燥的生活,敲代码的时间三天两头往吸烟室跑,被项目经理抓去训话. "入门"是学习Python最重要的阶段,虽然这个过程也许会非常缓慢.当你心里有一个目标时,那么你学习起来就不会 ...

  6. 这个Python爬虫的简单入门及实用的实例,你会吗?

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:HOT_and_COOl 利用爬虫可以进行数据挖掘,比如可以爬取别人的网 ...

  7. Thrift入门初探(2)--thrift基础知识详解

    昨天总结了thrift的安装和入门实例,Thrift入门初探--thrift安装及java入门实例,今天开始总结一下thrift的相关基础知识. Thrift使用一种中间语言IDL,来进行接口的定义, ...

  8. WCF入门教程:WCF基础知识问与答(转)

    学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...

  9. Appium+python自动化(十五)- Android 这些基础知识,你知多少???(超详解)

    简介 前边具体操作和实战已经讲解和分享了很多了,但是一些android的一些基础知识,你又知道多少了,你都掌握了吗?这篇就由宏哥给小伙伴们既是一个分享,又是对前边的一次总结.为什么要对这些做一个简单的 ...

随机推荐

  1. llinux 目录结构 及Linux文件分享

    llinux 基础命令 及个人Linux文件分享 一, root用户名 @ 分隔符 kingle 主机名 ~当前所在目录 # root权限 $ 没分配权限用户 二, 书写格式:空格 [命令参数] 空格 ...

  2. 学习javscript函数笔记(二)

    定义: 函数包含一组语句,他们是JavaScript的基础模块单元,用于代码复用.信息隐藏和组合调用.函数用于指定对象的行为. 1.函数对象 JavaScript中的函数就是对象,函数对象连接到Fun ...

  3. Java基础21-构造函数之间的调用

    public class Test{ public static void main(String[] args){ Persion p2=new Persion("小明",22) ...

  4. 第二十一章:deploy and live updates

    通常我们开发一个app之后,需要把他们放到对应的应用商店上去以供下载.在此期间,需要经过应用商店的审核,包括初次上传和更新上传.短则需要数天,多则需要几个星期,这对于我们的快速产品迭代和hotfix来 ...

  5. 023-将表单序列化为json对象

    使用jQuery将表单序列化为json对象,其中serializeJson方法的名字任意,serializeArray()这个jQuery提供的方法.this指的就是谁调用了这个方法. $.fn.se ...

  6. OpenGL进阶之Instancing

    Instancing Instancing绘制我想很多童鞋都不陌生,这个技术主要用来快速渲染大量相同的几何体,可以大大提高绘制效率.每个instance在shader中都有一个独一无二的索引,可以用来 ...

  7. 负载均衡服务器中存在大量的TIME_WAIT怎么解决

    首先需要明白什么是TIME_WAIT.TIME_WAIT是在tcp断开连接时进行四次回收的时候,主动断开端在收到被动关闭端的FIN包并发送ACK包给被动关闭后进入的状态.这个状态默认情况下是2倍的MS ...

  8. 净推荐值(NPS):用户忠诚度测量的基本原理及方法

    文章分享了一个衡量用户与产品或服务之间关系的指标:NPS,干货满满,希望对你有益. 初识NPS 作为互联网行业的用户体验从业者,我们都或多或少会接触一些衡量用户与产品或服务之间关系的指标,常见的指标如 ...

  9. 2017年10月29日 数据库查询总结&45道题

    日期函数: 当前时间:GetDate() 两个时间差:DateDiff() 一. 设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Tea ...

  10. PAT 1064 Complete Binary Search Tree

    #include <iostream> #include <cstdio> #include <cstdlib> #include <vector> # ...