Skip to main content

教程:如何使用Python Scrapy爬取Amazon数据

Scrapy是一个用于爬网网站并提取结构化/非结构化数据的应用程序框架,可用于各种应用程序,例如数据挖掘,信息处理或信息归档

众所周知,这是"数据"时代。 数据无处不在,每个组织都希望与数据合作并将其业务推向更高的水平。 在这种情况下,Scrapy扮演着至关重要的角色,向这些组织提供数据,以便他们可以在各种应用程序中使用它。 Scrapy不仅能够从网站中抓取数据,而且还能够从Web服务中抓取数据。 例如,Amazon API,Twitter / Facebook API。

如何安装Scrapy?

以下是在系统中安装Scrapy所需安装的第三方软件和软件包。

・ Python:由于Scrapy是使用Python语言构建的,因此必须首先安装它。

・ pip:pip是python软件包管理器工具,可维护软件包存储库并自动安装python库及其依赖项。 最好根据系统OS安装pip,然后尝试按照标准方式安装Scrapy。

・ lxml:这是一个可选软件包,但如果愿意删除html数据,则需要安装。 lxml是一个python库,可帮助构造html树,因为网页使用html层次结构来组织信息或数据。

可以使用pip安装Scrapy(这是安装Python软件包的典型方法)。 要使用Scrapy安装,请运行:

pip install scrapy 

如何开始使用Scrapy?

Scrapy是一个应用程序框架,它提供了许多命令来创建和使用应用程序。 在创建应用程序之前,必须先建立一个新的Scrapy项目。 输入您要存储代码并运行的目录:

scrapy startproject test_project

 

这将在同一目录中创建一个名为xyz的目录,其内容如下:

test_project/

    scrapy.cfg

 test_project/

     __init__.py

     items.py

     pipelines.py

     settings.py

     spiders/

          __init__.py

 

作为应用程序框架,Scrapy遵循项目结构以及面向对象的编程风格,以定义整个应用程序的项目和蜘蛛程序。 scrapy为用户创建的项目结构具有

・ scrapy.cfg:这是一个项目配置文件,其中包含用于设置项目模块的信息以及其部署信息。

・ test_project:这是一个应用程序目录,其中包含许多不同的文件,这些文件实际上负责运行和从Web URL抓取数据。

・ items.py:项目是将与抓取的数据一起加载的容器; 它们就像简单的Python字典一样工作。 尽管人们可以将普通的python字典与Scrapy结合使用,但Items提供了针对填充未声明字段的附加保护,从而防止了输入错误。 通过创建scrapy.Item类并将其属性定义为scrapy.Field对象来声明它们。

・ pipelines.py:处理组件,蜘蛛抓取了一个项目后,将其发送到项目管道,该项目通过多个顺序执行的组件对其进行处理。每个项目管道组件都是一个Python类,必须实现一个称为process_item的方法来处理被抓取的项目 项目。 它接收一个项目并对其执行操作,还决定该项目是应该继续通过管道,还是应该删除并不再处理。 如果要删除项目,则会引发DropItem异常以删除它。

・ settings.py:它允许自定义所有Scrapy组件的行为,包括核心,扩展,管道和蜘蛛本身。 它提供了键-值映射的全局名称空间,代码可用于从中提取配置值。

・ spiders:Spiders是一个目录,其中包含所有Python类的蜘蛛/爬虫。 每当有人运行/爬网任何蜘蛛时,scrapy都会查看该目录并尝试查找其名称由用户提供的蜘蛛。 蜘蛛定义了将如何爬取某个站点或一组站点,包括如何执行爬网以及如何从其页面中提取数据。 换句话说,Spider是定义一个特定网站的爬网和解析行为的自定义行为的地方,Spiders必须定义三个主要属性,即start_urls指示要删除的URL,allowed_domains仅定义那些需要的域名 抓取并解析是一种方法,当任何响应来自于已提交的请求时都会被调用。 这些属性很重要,因为它们构成了Spider定义的基础。

开始抓取Amazon网页 

为了了解Scrapy的工作原理以及在实际情况下如何使用Scrap,我们来看一个例子,在该示例中我们将爬取与某种产品相关的数据,例如产品名称,价格,类别及其在amazon.com网站上的可用性。 让我们将此项目命名为amazon。 如前所述,在执行任何操作之前,请先使用以下命令创建一个scrapy项目。

scrapy startproject amazon 

该命令将在本地文件夹中创建名称amazon的目录,其结构如前所述。 现在我们需要创建三个不同的部件,以使抓取过程成功进行,它们是,

00001. 使用我们要提取的字段更新items.py。 例如产品名称,类别,价格等。

00002. 创建一个新的爬虫,在其中我们需要定义必要的元素,例如allowed_domains,start_urls,parse方法以解析响应对象。

00003. 更新pipelines.py以进行进一步的数据处理。

让我们先从items.py开始。 下面的代码描述了框架中多个必填字段。

现在创建蜘蛛,我们有不同的选择。

1. 我们可以在Spiders目录中创建简单的Python类并将其导入必要的模块

2. 我们可以使用scrapy框架本身提供的默认实用程序。

在这里,我们将使用默认的实用程序genspider在框架中创建Spiders。 它将自动在Spiders目录中创建具有默认模板的类。

scrapy genspider AmazonProductSpider

在新创建的AmazonProductSpider中,我们需要定义其名称,URL和可能的域以爬取数据。 我们还需要实现parse方法,其中可以定义自定义命令来填充项目字段,并且可以对响应对象进行进一步处理。 这种解析方法不会返回结果,但会产生数据 python中的Yield表示python将从上次停止的地方开始执行。

这是Spider的代码。 为Spider定义了一个名称,该名称在所有Spider中都应该是唯一的,因为scrapy使用其名称搜索Spider。 我们将使用amazon.com初始化allowed_domains,因为我们要从该域中抓取数据,并且start_urls指向同一域的特定页面。

在解析方法中,定义了一个项目对象,并使用响应对象的xpathutility填充了必需的信息。 xpath是一个搜索功能,用于在html树结构中查找元素。 最后,让我们产生items对象,以便scrapy可以对其进行进一步处理。

接下来,在抓取数据之后,scrapy调用Item管道来处理它们。 这些被称为管道类,我们可以使用这些类将数据存储在文件或数据库中或以任何其他方式。 这是默认类(例如Items),scrapy为用户生成。

管道类实现了process_item方法,每一次由Spider生成项目时都会调用该方法。 它以item和spider类作为参数,并返回一个dict对象。 因此,对于此示例,我们只是按原样返回item dict。

在使用管道类之前,必须在settings.py模块中启用它们,以便scrapy可以在从Spider解析后调用item对象。

让我们将1-1000到管道类的数字指定为值,该值定义了scrapy框架调用这些类的顺序。 此值定义应首先通过scrapy运行哪个管道类。

现在,完成所有设置后,我们需要开始scrapy并调用Spider,以便它可以开始发送请求并接受响应对象。

我们可以通过蜘蛛网的名字来称呼它,因为蜘蛛网是唯一的,而且很容易找到它。

抓取抓取AmazonDeals

如果要将项目字段存储在文件中,则可以在管道类中编写代码,否则可以在调用Spider时定义文件名,以便scrapy可以自动将返回对象从管道类推入给定文件。

scrapy crawl AmazonDeals -o items.json

因此,以上命令会将item对象保存在items.json文件中。 当我们在管道类中返回项目对象时,scrapy会自动将这些项目对象存储到items.json中。 这是此过程的输出。

好了,目前为止,我们已经成功地使用scrapyAmazon进行抓取。 我们已经涵盖了与Scrapy及其相关模块有关的大多数内容,并且还通过示例了解了如何独立使用它。

 


Comments

Popular posts from this blog

span[class~="sr-only"]

  The  span[class~="sr-only"]  selector will select any  span  element whose  class   includes   sr-only . Create that selector, and give it a  border  property set to  0 . span [ class ~= "sr-only" ] {    border:   0 ; }

Use Recursion to Create a Range of Numbers

  function   rangeOfNumbers ( startNum ,  endNum ) {    if ( startNum <= endNum )   {      const   arrNumber  =  rangeOfNumbers ( startNum ,  endNum - 1 );      arrNumber . push ( endNum );      return   arrNumber ;   }    else  {      return  [];   }       }; console . log ( rangeOfNumbers ( 6 , 8 ));//[6,7,8] console . log ( rangeOfNumbers ( 3 , 12 )); //[ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ]

About the Little Lemon receipt maker exercise

 My homework and exercise of the lesson "About the Little Lemon receipt maker exercise" of the class "programming with Javascript" on coursera. const menu = [     {         Dish : "Italian pasta" ,         price : 9.55     },     {         Dish : "Rice with veggies" ,         price : 8.65     },     {         Dish : "Chicken with potatoes" ,         price : 15.55     },     {         Dish : "Vegetarian Pizza" ,         price : 6.45     } ]; function receiptMaker ( arr , bool ) {     if ( bool == false )     {         console . log ( "Prices without tax:" );         arr . forEach ( element => {             console . log ( `Dish: ${ element . Dish } Price (incl.tax):$ ${ element . price } ` );                     });     }     else     {         console . log ( "Prices with 20% tax:" );         arr . forEach ( element => {             console . log ( `Dish: ${ element . Dish } Price (inc