让我们用砂纸创建端到端的网络刮擦管道!
#python #sql #webscraping #dataengineering

介绍

Web刮擦已成为收集数据的必不可少的工具,使开发人员和数据爱好者从网络中访问有价值的信息。诸如BeautifureSoup4和Selenium之类的工具是用户友好的工具,可以使此任务尽可能简单,尤其是对于一次性脚本和基本工作流程。

然而,网络刮擦通常只是提取,转换,负载(ETL)的更广泛过程中的第一步。随着您需求的增长,自定义脚本的数量也将随着需求的增长。没有组织这些一次性脚本的框架,这将不可避免地导致道路上的混乱。

正如阿尔伯特·爱因斯坦(Albert Einstein)曾经说过的那样:“一切都应该使一切变得更简单,但不是更简单。

在本教程中,我将使用收集像Einstein引用的报价的废料引导您完成网络刮擦ETL过程,并将它们加载到SQLite数据库中。我们将使用Quotes to Scrape作为目标刮擦站点:

Image description

我们将介绍以下内容:

  • 为Python创建虚拟环境。
  • 设置零食,一个python的网络刮擦框架。
  • 使用砂纸从网站上提取报价。
  • 配置零工管道以处理和存储刮擦数据。
  • 使用Python创建SQLite数据库。
  • 将刮擦数据存储在SQL数据库中。
  • (有趣)用大熊猫和matplotlib分析刮擦数据

步骤1:创建虚拟环境

在我们潜入之前,使用虚拟环境创建一个干净且孤立的Python环境的好主意。这样可以确保您的零工项目的包装和依赖项会干扰您的系统范围内的安装,并且它将自动在虚拟环境的路径上进行零食,以最大程度地使用。

这是创建虚拟环境的步骤:

  1. 在您的计算机上打开终端或命令提示符。
  2. 导航到要创建废除项目的目录。你
  3. 一旦您使用所需目录,请运行以下命令来创建一个名为quotesenv的虚拟环境(您可以用首选名称替换quotesenv):
python -m venv quotesenv

运行此命令后,您将在项目目录中有一个名为myenv(或您选择的名称)的新目录。该目录包含一个干净的Python环境,您可以在其中安装软件包而不影响系统范围的Python安装。

既然您已经建立了虚拟环境,则可以继续下一步:安装零食和创建零工项目。

步骤2:安装砂纸并创建您的第一个项目

是时候安装零食并为我们的网络刮擦创建一个零工项目了。

  1. 如果尚未激活虚拟环境,请激活您的虚拟环境。您可以通过运行来做到这一点:
source quotesenv/bin/activate

如果是不同的,则用虚拟环境的名称替换quotesenv

  1. 现在,您可以使用pip在虚拟环境中安装砂纸:
pip install scrapy
  1. 一旦安装了砂纸,您就可以使用以下命令来创建一个新的废弃项目:
scrapy startproject quotes\_project

此命令将为您的废除项目创建目录结构,包括所有必要的文件和样板,以使您入门:

\>quotes\_project/  
    scrapy.cfg  
    quotes\_project/  
        \_\_init\_\_.py  
        items.py  
        middlewares.py  
        pipelines.py  
        settings.py  
        spiders/  
            \_\_init\_\_.py  
            quotes\_spider.py

在这里,它们都是如何一起工作的:

  • scrapy.cfg:这是砂纸项目配置文件。它包含您的废除项目的设置和配置。
  • quotes_project(目录):这是您的零工项目的Python包。
  • init.py:这是一个空的python文件,使目录成为python包。
  • items.py:这是您定义将持有刮擦数据的项目结构的地方。您可以使用与要刮擦的数据相对应的字段创建项目类。
  • middlewares.py:此文件用于定义您的砂纸项目的自定义中间件组件。中间件可以在刮擦过程中修改请求和响应。
  • pipelines.py:在这里,您可以定义数据处理管道以处理和存储刮擦数据。您可以实现诸如将数据存储在数据库中,将数据导出到文件或执行其他处理之类的操作。
  • settings.py:这是您的废品项目的主要配置文件。您可以设置各种项目特定的设置,包括用户代理,并发等等。
  • 蜘蛛(目录):此目录包含您的网络搭式蜘蛛。
  • init.py:这是一个空的python文件,使目录成为python包。
  • quotes_spider.py:这是一个示例蜘蛛文件,您可以在其中定义蜘蛛以爬网和从网站刮擦数据。您可以创建从scrapy.Spider继承的类,并定义蜘蛛如何从网页中导航和提取数据。我们将一起创建第一个。

此文件夹和文件结构为您的砂纸项目提供了一个明确的组织,分开配置,项目定义,蜘蛛代码和数据处理逻辑。

既然您已经安装了废品,并且您的项目已经设置了,那么让我们继续定义蜘蛛来从网站上刮擦报价。请继续关注步骤3!

步骤3:为我们的数据结构创建项目类

在此步骤中,我们将定义将持有刮擦数据的项目的结构。废纸使用项目来构造和存储您从网站上提取的数据。

在您的砂纸项目目录中打开[items.py](http://items.py/)文件。当您使用scrapy startproject命令创建废除项目时,将自动生成此文件。

[items.py](http://items.py/)中,您会注意到CLI已经创建了从scrapy.item继承的引号craperitem类。添加以下代码并删除Pass语句以定义QuotesScraperItem的结构:

import scrapy  
class QuotesScraperItem(scrapy.Item):  
    text = scrapy.Field()  
    author = scrapy.Field()

此代码段定义一个具有两个字段的项目类:titleauthor。您也可以获取tags数据,但这超出了本教程的范围。这些字段对应于我们将从网站上刮擦的数据。

根据定义的项目结构,我们准备继续创建蜘蛛,这是负责我们ETL管道提取部分的类。我完成了检查目标网站并找到我们将要刮擦的数据的选择。

步骤4:定义废弃蜘蛛刮擦报价

废纸蜘蛛是一类,其中包含有关如何从网站导航和提取数据的规则。让我们开始:

  1. quotes_project/quotes_project/spiders目录中创建一个名为quotes_spider.py的新文件。这是我们定义蜘蛛的地方。
  2. 编辑quotes_spider.py并添加下面的代码
import scrapy  
from quotes\_project.items import QuotesScraperItem #made in the previous step  
class QuotesSpider(scrapy.Spider):  
            name = "quotes"  
            start\_urls = \[  
                'http://quotes.toscrape.com/page/1/',  
            \]  
            def parse(self, response):  
                for quote in response.css('div.quote'):  
                    item = QuotesScraperItem()  
                    item\['text'\] = ''.join(quote.css('span.text::text').get())  
                    item\['author'\] = ''.join(quote.css('span small::text').get())  
                    yield item  
                next\_page = response.css('li.next a::attr(href)').get()  
                if next\_page is not None:  
                    yield response.follow(next\_page, self.parse)

此代码定义了一个名为“引号”的废纸蜘蛛,该蜘蛛从指定的URL开始,并刮擦引号及其作者。它还为每个页面继续这样做,直到不再剩下页面为止。 .join()字符串函数是必要的

  1. 要运行蜘蛛并在行动中看到它,请在项目的根目录中使用以下命令:
scrapy crawl quotes

现在,您的蜘蛛将开始从网站上刮擦报价。但是您无处可言 - 不惧怕,接下来是!

步骤5:将刮擦数据保存到SQLITE数据库

现在您已经成功地从网络上刮了数据,现在该将数据存储在数据库中以供将来使用和分析。在此步骤中,我们将在运行管道时自动设置一个SQLite数据库作为我们管道中数据的目的地。

在砂纸中,管道负责处理刮擦数据。我们将创建一个自定义管道,将刮擦项目插入我们刚创建的SQLite数据库中。

  1. 在您的零工项目文件夹中,导航到quotes_scraper目录(或您的项目名称)并打开[pipelines.py](http://pipelines.py/)文件。
  2. 在文件末尾定义以下管道类。
import sqlite3  
            from itemadapter import ItemAdapter              
            class QuotesToSQLitePipeline:  
                def \_\_init\_\_(self):  
                    self.conn = sqlite3.connect('quotes.db')  
                    self.cursor = self.conn.cursor()  
                def process\_item(self, item, spider):  
                    adapter = ItemAdapter(item)  
                    self.cursor.execute('''  
                    CREATE TABLE IF NOT EXISTS quotes (  
                        id INTEGER PRIMARY KEY AUTOINCREMENT,  
                        text TEXT,  
                        author TEXT  
                    )  
                ''')  
                    self.cursor.execute('''  
                        INSERT INTO quotes (text, author)  
                        VALUES (?, ?)  
                    ''', (adapter\['text'\], adapter\['author'\]))  
                    self.conn.commit()  
                    return item  
                def close\_spider(self, spider):  
                    self.conn.close()

此管道类创建(如果还不存在)或连接到SQLITE数据库,将刮擦数据插入quotes表中,并在完成蜘蛛时关闭连接。 ItemAdapter允许我们在不必导入该项目本身的项目中数据(不太紧密的耦合,是的!)。

步骤3:启用管道

要启用自定义管道,请将其添加到scrapy项目文件夹中的[settings.py](http://settings.py/)文件:

\# settings.py  
\# ...  
        # Configure item pipelines  
        ITEM\_PIPELINES = {  
           'quotes\_scraper.pipelines.QuotesToSQLitePipeline': 300,  # Adjust the priority if needed  
        }  
        # ...

在此示例中,我将管道优先级设置为300,但是您可以根据需要进行调整。

步骤4:运行蜘蛛并保存数据

现在一切都设置了,您可以再次运行蜘蛛,并查看scrapy如何将刮擦数据保存到sqlite数据库:

scrapy crawl quotes

scrapy将执行您的蜘蛛,并使用自定义管道将刮擦的报价和作者保存到quotes.db数据库中,该数据库现在将在您的项目文件夹中。

这就是第4步!您成功设置了一个SQLite数据库,并配置了管道以保存刮擦数据。在接下来的步骤中,我们将涵盖如何检索和分析数据。

步骤5:从SQLITE数据库中检索数据

您成功地将数据成功地刮去并保存到了SQLite数据库中。在此步骤中,我们将探讨如何从数据库中检索该数据并执行基本查询。

步骤1:连接到数据库

要从SQLite数据库检索数据,我们需要建立连接并创建光标对象,然后执行选择,最后打印从光标返回的内容。在项目的根文件夹中创建一个名为retrieve_quotes.py的文件,并在以下复制:

import sqlite3  

def retrieve\_quotes():  
  # Create a context manager for the SQLite connection  
  with sqlite3.connect('quotes.db') as conn:  
      # Create a cursor within the context manager  
      cursor = conn.cursor   
      # Execute an SQL query to retrieve all quotes  
      cursor.execute('SELECT \* FROM quotes')                      
      # Fetch all the results from the cursor; fetchall() function returns a list.  
      quotes = cursor.fetchall(  
      # Display the retrieved data  
      for quote in quotes:  
          print(quote)  
if \_\_name\_\_ == "\_\_main\_\_":  
  retrieve\_quotes()

步骤2:运行脚本

要运行脚本并从数据库中检索数据,请使用以下命令或在IDE中运行它:

python retrieve\_data.py

脚本将连接到数据库,检索数据并在终端显示。

这是第5步!您了解了如何从SQLite数据库中检索数据,并保存了刮擦的报价和作者。在接下来的步骤中,我们将更深入地研究数据分析和可视化。

步骤6 :(为了娱乐)数据分析和可视化

在此可选步骤中,您可以通过执行数据分析和可视化来进一步探索刮擦数据。我们将使用Python库,例如Pandas和Matplotlib来实现这一目标。这几乎不足以困扰,但是我认为很高兴显示此步骤以完成最小的MVP,以完成完整的零工管道用例!

步骤1:导入所需库

首先,请确保您安装了必要的Python库。您可以使用PIP安装它们:

pip install pandas matplotlib

步骤2:分析数据

现在,让我们对刮擦数据进行一些基本分析。我们将使用PANDA将SQLite数据库中的数据加载到数据框架中,然后计算一些统计信息。在项目的根文件夹中,创建一个称为data_analysis.py的Python脚本并添加以下代码。这将使用熊猫打印记录总数。

import pandas as pd  
import sqlite3  
\# Connect to the SQLite database  
conn = sqlite3.connect('quotes.db')  
\# Load data into a Pandas DataFrame  
df = pd.read\_sql\_query('SELECT \* FROM quotes', conn)  
\# Calculate the number of quotes  
total\_quotes = len(df)  
\# Display the total number of quotes  
print(f'Total Number of Quotes: {total\_quotes}')

步骤3:可视化数据

接下来,让我们创建一个简单的条形图,以可视化作者的引号的分布。为此,我们将使用matplotlib。将导入添加到data_analysis.py的顶部,并复制从下面的代码正文到data_analysis.py的末尾的所有内容:

import matplotlib.pyplot as plt  
\# Group quotes by author and count the occurrences  
author\_counts = df\['author'\].value\_counts()  
\# Create a bar chart  
plt.figure(figsize=(12, 6))  
author\_counts.plot(kind='bar')  
plt.title('Quotes by Author')  
plt.xlabel('Author')  
plt.ylabel('Number of Quotes')  
plt.xticks(rotation=45)  
plt.tight\_layout()  
plt.show()

步骤4:运行脚本

使用以下命令运行脚本:

python data\_analysis.py

运行脚本后,您将看到控制台中显示的报价总数,并显示了作者报价分布的条形图。

结论步骤6,您可以选择对刮擦数据执行数据分析和可视化。

回顾和下一步

恭喜!您已经完成了我的网络刮擦和数据提取过程的教程。此时,您将有:

  1. 为您的Python项目创建一个虚拟环境来管理依赖。
  2. 建立一个废弃项目并定义了网络刮擦蜘蛛。
  3. 使用砂纸从网站上提取的报价和作者。
  4. 创建了一个SQLite数据库并存储了刮擦数据。
  5. 实施了一条零工管道以自动化数据存储。
  6. 对刮擦数据进行了数据分析和可视化。

下一步

既然您在网络刮擦方面拥有坚实的基础,则可以探索更高级的主题和现实世界的应用程序。在接下来的几周里,我将在构建这条简单管道的教程中写作和链接。他们将涵盖以下主题:

  • 从多个网站刮擦数据并将其组合在一起。
  • 处理不同的数据格式和结构。
  • 安排网络刮擦任务以特定的间隔运行。
  • 实施用户身份验证以在登录页面后面刮擦。
  • 通过分布式系统扩大您的刮擦工作。

可以随意应用您在这里学到的知识和技术来收集项目,研究或数据分析任务的数据。如果您在阅读此书后用砂纸管道使某些东西很酷,请告诉我!我很想看到它!

负责任地刮擦,玩得开心!