关于Python 的Scrapy简介

Python Scrapy Introduction

Python Scrapy库是一个非常流行的网络刮削软件包。网络刮削是使用该软件以编程方式从在线网页中提取关键数据的过程。使用这种技术,可以从单个页面中刮取数据,也可以在多个页面中爬行,边爬边刮取每个页面的数据。这第二种方法被称为网络爬行,当软件机器人跟随链接找到新的数据进行抓取。Scrapy使得以自动化方式设置这些网络机器人爬虫成为可能,我们现在将学习如何开始使用Scrapy。


安装Scrapy

安装Scrapy非常简单,可以在终端完成。

pip install Scrapy

一旦完成,你可以通过使用这个命令查看帮助菜单来检查安装情况。

scrapy $scrapy --help
Scrapy 2.4.1 - no active project

Usage:
  scrapy  [options] [args]

Available commands:
  bench         Run quick benchmark test
  commands
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

  [ more ]      More commands available when run from project directory

Use "scrapy  -h" to see more info about a command

注意这个shell命令。


启动Scrapy项目

Scrapy是一个功能丰富的框架,因此,你开始项目的方式与你在Django中的方式类似。下面的命令指示Scrapy建立一个名为scrapy_testing的项目。

scrapy $scrapy startproject scrapy_testing
New Scrapy project 'scrapy_testing' created in:
    C:\python\scrapy\scrapy_testing

    cd scrapy_testing
    scrapy genspider example example.com

PyCharm中的Scrapy

在Scrapy生成了存放[Scrapy项目]的文件夹和文件后,我们可以在PyCharm或Visual Studio Code这样的优秀IDE中打开它。
scrapy startproject


Scrapy项目文件

一个新的Scrapy项目会为你创建一个包含所有需要的文件的脚手架。这些文件在这里列出,并有相关的链接指向有用的文档。

  • spiders持有你创建的Spider类,它定义了某个网站(或一组网站)如何被抓取,包括如何执行抓取(即跟随链接)以及如何从其页面中提取结构化数据
  • [items.py]在这里为你的搜刮项目定义模型。定义了我们要抓取的对象或实体。Scrapy Items的声明与类似,只是Scrapy Items要简单得多,因为没有不同字段类型的概念。
  • [middlewares.py]在这里为你的蜘蛛中间件,或Scapy钩子定义模型。当向一个网站发送请求时,请求可以被即时更新或修改,对响应也是如此。例如,如果你想给所有的请求添加一个代理,你可以在中间件中这样做。
  • [pipelines.py]在这里定义你的项目管道,定义了创建和过滤项目的函数。管道是用来清理HTML数据,验证搜刮的数据,检查重复的数据(并删除它们),如果需要的话,将搜刮的项目存储在数据库中。
  • [settings.py]项目设置,为了简单起见,这个文件只包含被认为重要或常用的设置。在设置文件中,你可以配置机器人的名称。BOT_NAME变量将在你创建Scrapy项目时自动设置为项目名称。如果你愿意,还可以在这里设置一个自定义的USER_AGENT。
  • scrapy.cfg保存配置信息

蜘蛛

一个Scrapy项目可以被认为是一个蜘蛛的集合。这里我们可以在Scrapy项目中创建一个新的网络蜘蛛。下面的命令指示Scrapy创建一个新的测试蜘蛛,从scrapethissite.com抓取数据。

cd scrapy_testing/spiders
spiders $scrapy genspider testing scrapethissite.com
Created spider 'testing' using template 'basic' in module:
  scrapy_testing.spiders.testing

spiders/testing.py
当你运行genspider命令时,默认的模板代码会为你创建。我们可以看到,生成的类使用[Python继承法]来继承蜘蛛类的所有功能。你可以手动创建一个Scrapy蜘蛛类,但如果你使用genspider命令,会快得多,而且不容易出错。

import scrapy


class TestingSpider(scrapy.Spider):
    name = 'testing'
    allowed_domains = ['scrapethissite.com']
    start_urls = ['http://scrapethissite.com/']

    def parse(self, response):
        pass

parse()函数通过Scrapy传递给我们一个响应对象,我们想在其中填入一些东西,以返回一个包含从我们网站刮取的数据的对象。换句话说,响应变量包含了请求的整个源标记和URL的内容。正是在这个parse()方法中,我们需要定义代码,将响应内容缩小到我们真正感兴趣的数据。下面是关于Spider的一些额外细节。

  • scrapy.Spider所有Scrapy蜘蛛的基类。你创建的蜘蛛必须继承自这个类。
  • name这个字符串设置蜘蛛的名称。Scrapy用它来实例化一个新的蜘蛛,所以它需要是唯一的。
  • allowed_domains这是一个可选的允许蜘蛛抓取的域的列表。
  • start_urls这是蜘蛛开始抓取的地方。

XPath或CSS

在我们开始填写parse()方法之前,我们需要看一下关于XPath和CSS选择器的一些细节。在Scrapy中,你可以使用[XPath]或CSS选择器从源网页中提取数据。[CSS选择器]往往在前端开发者中非常流行,而XPath则经常被那些喜欢正则表达式的人使用。两者都是选择所需数据的完全有效的方法,尽管XPath被称为更强大一些,所以这就是我们现在要看的。


刮取一个页面

我们要抓取的页面位于scrapethissite.com/pages/,看起来像…
!

为了成功地抓取这个页面,我们需要更新start_urls变量和我们蜘蛛类中的parse()函数。请注意,我们在下面使用的XPath表达式只是说:"找到第一个类别为'page-title'的h3标签,然后看一下子锚标签的文本内容"。在XPath表达式的末尾,我们附加了Scrapy**.get()**方法来获取第一个结果。

import scrapy


class TestingSpider(scrapy.Spider):
    name = 'testing'
    allowed_domains = ['scrapethissite.com']
    start_urls = ['https://scrapethissite.com/pages/']

    def parse(self, response):
        title = response.xpath('//h3[@class="page-title"]/a/text()').get()
        return {'title': title}

运行你的蜘蛛

为了运行你的蜘蛛,Scrapy提供了runspider命令,你可以像这样使用。

spiders $scrapy runspider testing.py

输出是相当冗长的,但如果你检查它,你会发现你想搜刮的数据。它成功了!

{'title': 'Countries of the World: A Simple Example'}

crawl 命令

另一种你可以运行你的蜘蛛的方式可能会更干净一些,那就是使用crawl命令。

scrapy crawl testing

Python Scrapy介绍摘要

就这样,对强大的Python Scrapy库进行了很好的介绍。我们学习了如何使用Scrapy来定义一个新的项目,创建一个新的网络蜘蛛,并从一个网页上获取一些数据。

猜你喜欢

转载自juejin.im/post/7125790351658319903