Python - 网页抓取数据处理

  • 简述

    在前面的章节中,我们学习了如何通过各种 Python 模块从网页或网页抓取中提取数据。在本章中,让我们研究各种技术来处理已抓取的数据。
  • 介绍

    要处理已抓取的数据,我们必须将数据以特定格式(如电子表格 (CSV)、JSON)或有时存储在 MySQL 等数据库中的特定格式存储在本地机器上。
  • CSV 和 JSON 数据处理

    首先,我们将从网页抓取信息后,将信息写入 CSV 文件或电子表格。让我们首先通过一个简单的例子来理解,在这个例子中我们将首先使用BeautifulSoup模块,如前所述,然后通过使用 Python CSV 模块,我们将该文本信息写入 CSV 文件。
    首先,我们需要导入必要的 Python 库,如下所示 -
    
    import requests
    from bs4 import BeautifulSoup
    import csv
    
    在以下代码行中,我们使用 requests 为 url 发出 GET HTTP 请求: https ://authoraditiagarwal.com/通过发出 GET 请求。
    
    r = requests.get('https://authoraditiagarwal.com/')
    
    现在,我们需要创建一个 Soup 对象,如下所示 -
    
    soup = BeautifulSoup(r.text, 'lxml')
    
    现在,在下一行代码的帮助下,我们将抓取的数据写入一个名为 dataprocessing.csv 的 CSV 文件。
    
    f = csv.writer(open(' dataprocessing.csv ','w'))
    f.writerow(['Title'])
    f.writerow([soup.title.text])
    
    运行此脚本后,网页的文本信息或标题将保存在本地计算机上的上述 CSV 文件中。
    同样,我们可以将收集到的信息保存在 JSON 文件中。以下是一个易于理解的 Python 脚本,用于执行相同的操作,我们在其中获取与上一个 Python 脚本中相同的信息,但这次获取的信息使用 JSON Python 模块保存在 JSONfile.txt 中。
    
    import requests
    from bs4 import BeautifulSoup
    import csv
    import json
    r = requests.get('https://authoraditiagarwal.com/')
    soup = BeautifulSoup(r.text, 'lxml')
    y = json.dumps(soup.title.text)
    with open('JSONFile.txt', 'wt') as outfile:
       json.dump(y, outfile)
    
    运行此脚本后,抓取到的信息,即网页的标题将保存在您本地机器上的上述文本文件中。
  • 使用 AWS S3 进行数据处理

    有时我们可能希望将抓取的数据保存在本地存储中以用于存档目的。但是,如果我们需要大规模存储和分析这些数据怎么办?答案是名为 Amazon S3 或 AWS S3(简单存储服务)的云存储服务。基本上,AWS S3 是一种对象存储,旨在从任何地方存储和检索任意数量的数据。
    我们可以按照以下步骤在 AWS S3 中存储数据 -
    步骤 1− 首先,我们需要一个 AWS 帐户,该帐户将为我们提供在存储数据时在 Python 脚本中使用的密钥。它将创建一个 S3 存储桶,我们可以在其中存储我们的数据。
    步骤 2− 接下来,我们需要安装boto3用于访问 S3 存储桶的 Python 库。它可以在以下命令的帮助下安装 -
    
    pip install boto3
    
    步骤 3− 接下来,我们可以使用以下 Python 脚本从网页中抓取数据并将其保存到 AWS S3 存储桶中。
    首先,我们需要导入 Python 库进行抓取,这里我们正在使用requests, 和boto3将数据保存到 S3 存储桶。
    
    import requests
    import boto3
    
    现在我们可以从我们的 URL 中抓取数据。
    
    data = requests.get("Enter the URL").text
    
    现在要将数据存储到 S3 存储桶,我们需要按如下方式创建 S3 客户端 -
    
    s3 = boto3.client('s3')
    bucket_name = "our-content"
    
    下一行代码将创建 S3 存储桶,如下所示 -
    
    s3.create_bucket(Bucket = bucket_name, ACL = 'public-read')
    s3.put_object(Bucket = bucket_name, Key = '', Body = data, ACL = "public-read")
    
    现在您可以从您的 AWS 账户中检查名为 our-content 的存储桶。
  • 使用 MySQL 进行数据处理

    让我们学习如何使用 MySQL 处理数据。如果你想了解 MySQL,那么你可以点击链接https://www.cainiaoya.com/mysql/mysql-jiaocheng.html
    借助以下步骤,我们可以将数据抓取并处理到 MySQL 表中 -
    步骤 1− 首先,通过使用 MySQL,我们需要创建一个数据库和表来保存我们抓取的数据。例如,我们正在使用以下查询创建表 -
    
    CREATE TABLE Scrap_pages (id BIGINT(7) NOT NULL AUTO_INCREMENT,
    title VARCHAR(200), content VARCHAR(10000),PRIMARY KEY(id));
    
    步骤 2− 接下来,我们需要处理 Unicode。注意 MySQL 默认不处理 Unicode。我们需要借助以下命令打开此功能,这些命令将更改数据库、表和两列的默认字符集 -
    
    ALTER DATABASE scrap CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
    ALTER TABLE Scrap_pages CONVERT TO CHARACTER SET utf8mb4 COLLATE
    utf8mb4_unicode_ci;
    ALTER TABLE Scrap_pages CHANGE title title VARCHAR(200) CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;
    ALTER TABLE pages CHANGE content content VARCHAR(10000) CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;
    
    步骤 3− 现在,将 MySQL 与 Python 集成。为此,我们需要 PyMySQL,它可以在以下命令的帮助下安装
    
    pip install PyMySQL 
    
    步骤 4− 现在,我们之前创建的名为 Scrap 的数据库已准备好将数据从 Web 抓取后保存到名为 Scrap_pages 的表中。在我们的示例中,我们将从 Wikipedia 中抓取数据,并将其保存到我们的数据库中。
    首先,我们需要导入所需的 Python 模块。
    
    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    import datetime
    import random
    import pymysql
    import re
    
    现在,建立一个连接,将它与 Python 集成。
    
    conn = pymysql.connect(host='127.0.0.1',user='root', passwd = None, db = 'mysql',
    charset = 'utf8')
    cur = conn.cursor()
    cur.execute("USE scrap")
    random.seed(datetime.datetime.now())
    def store(title, content):
       cur.execute('INSERT INTO scrap_pages (title, content) VALUES ''("%s","%s")', (title, content))
       cur.connection.commit()
    
    现在,连接维基百科并从中获取数据。
    
    def getLinks(articleUrl):
       html = urlopen('http://en.wikipedia.org'+articleUrl)
       bs = BeautifulSoup(html, 'html.parser')
       title = bs.find('h1').get_text()
       content = bs.find('div', {'id':'mw-content-text'}).find('p').get_text()
       store(title, content)
       return bs.find('div', {'id':'bodyContent'}).findAll('a',href=re.compile("^(/wiki/)((?!:).)*$"))
    links = getLinks('/wiki/Kevin_Bacon')
    try:
       while len(links) > 0:
          newArticle = links[random.randint(0, len(links)-1)].attrs['href']
          print(newArticle)
          links = getLinks(newArticle)
    
    最后,我们需要关闭游标和连接。
    
    finally:
       cur.close()
       conn.close()
    
    这将从维基百科收集的数据保存到名为 scrap_pages 的表中。如果你熟悉 MySQL 和网页抓取,那么上面的代码就不难理解了。
  • 使用 PostgreSQL 进行数据处理

    PostgreSQL 由全球志愿者团队开发,是一个开源关系数据库管理系统 (RDMS)。使用 PostgreSQL 处理爬取数据的过程与 MySQL 类似。会有两个变化:首先,命令将与 MySQL 不同,其次,我们将在这里使用psycopg2Python 库来执行其与 Python 的集成。
    在以下命令的帮助下,我们可以安装 psycopg2 Python 库 -
    
    pip install psycopg2