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. Android 中判断网络状态

    首先在AndroidManifest.xml添加权限 <uses-permission android:name="android.permission.ACCESS_NETWORK_ ...

  2. WEB 倒计时

    <%@ Page Language="C#" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Trans ...

  3. Ubuntu 14.04 下安装搜狗输入法,不要删除ibus

    今天安装了 sougou输入法.在ubuntu下面,然后网上一般的帖子都是要求你先删除 ibus 但是你删除了ibus之后,就会导系统设置被删除很多设置项,甚至无法打开, 所有你设置ubuntu输入法 ...

  4. 8、列表:ion-list

    1.基本样式 no-lines 属性 隐藏列表项之间的分割符 inset 属性 去掉 ion-list的 外边框. 默认 的 ion-list 是有外边框的.   /* ---示例代码----*/ & ...

  5. C#委托的好处

    C#委托的好处 先来看一个例子: 某人有三子,让他们各自带一样东西出门,并带回一头猎物. 可以理解为一种父亲对儿子的委托: 猎物  办法(工具 某工具) 三个人执行委托的方法各不相同 兔子 打猎(工具 ...

  6. JS数组遍历方法

    常用数组遍历方法: 1.原始for循环 var a = [1,2,3]; for(var i=0;i<a.length;i++){ console.log(a[i]); //结果依次为1,2,3 ...

  7. 不同线程不能获取其他线程设置的ThreadLocal里面的值

    背景: 最近在项目用到了ThreadLocal,存放一些值.起线程异步获取ThreadLocal中的值,得到null.这是由于,ThreadLocal.get()会获取当前线程的一个map对象,以Th ...

  8. 自己用到的vim常用命令

    一.前言 这里整理的是我在实习期间用到的常用vim命令,特记录如下,以免忘记. 二.vim常用命令 1.vim中的光标移动 shift+6(^):跳到行首(第一个非空格字符)(注:在shell跳到行首 ...

  9. PAT 1037 Magic Coupon

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

  10. 正则表达式把所有Paul替换成Ringo:Paul Puala Pualine paul Paul

    代码实现如下: <!DOCTYPE html><html><body> <h2>JavaScript Regular Expressions</h ...