Python bs4 结合 Scrapy,进行数据爬取和处理

news2024/11/9 10:02:57

Python bs4 结合 Scrapy,进行数据爬取和处理

在现代数据分析和机器学习领域,数据爬取是获取网页数据的常用方法。Python 提供了许多工具来进行网页爬取,其中 ScrapyBeautifulSoup(bs4)是最常用的两个库。Scrapy 是一个强大的爬虫框架,适用于大规模、高效的数据抓取任务,而 BeautifulSoup 则擅长解析和处理复杂的 HTML 数据。将两者结合使用,可以有效提升数据抓取和处理的能力。

本篇文章将详细介绍如何使用 Scrapy 爬取数据,并结合 BeautifulSoup 进行数据处理,帮助新手快速上手。

在这里插入图片描述

一、什么是 Scrapy?

Scrapy 是一个用于抓取网站数据的 Python 爬虫框架,它能自动地从网页上提取数据,并支持多线程和异步处理,适合爬取大量数据。Scrapy 的优点包括:

  • 速度快:支持异步请求,能并发抓取多个网页。
  • 易扩展:Scrapy 的组件化设计使其可以灵活扩展和定制。
  • 内置功能强大:支持自动化处理网页跳转、错误处理、Cookies 以及请求头管理等功能。

二、什么是 BeautifulSoup?

BeautifulSoup 是用于解析 HTML 和 XML 的 Python 库,它能将复杂的网页文档转化为便于处理的结构化数据。BeautifulSoup 的优点在于它的易用性,特别是在提取特定标签、属性或文本时,代码简洁且直观。虽然 Scrapy 自带解析工具(如 XPath),但 BeautifulSoup 的灵活性在处理复杂 HTML 数据时尤其突出。

三、安装 Scrapy 和 BeautifulSoup

首先,我们需要确保系统中安装了 ScrapyBeautifulSoup 及其依赖库。你可以使用以下命令进行安装:

pip install scrapy beautifulsoup4 requests

此外,requests 库是一个常用的 HTTP 请求库,虽然 Scrapy 自带 HTTP 请求功能,但有时结合 requests 可以更方便地进行调试。

四、Scrapy 爬虫的基本结构

使用 Scrapy 爬取网页数据时,通常我们会创建一个爬虫项目并定义爬取逻辑。Scrapy 的项目结构如下:

my_scrapy_project/
    scrapy.cfg
    my_scrapy_project/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            my_spider.py
  • spiders:存放所有爬虫脚本。每个爬虫都定义如何获取某一网站的数据。
  • items:定义数据结构,类似于数据库的表结构,用于存放从网页中提取的内容。
  • pipelines:定义数据处理逻辑,例如数据清洗、存储到数据库等操作。
  • middlewares:定义爬虫中间件,可定制请求和响应的处理方式。
  • settings:配置文件,包含爬虫的参数设定,如请求延迟、并发数、代理等。

1. 创建 Scrapy 项目

首先,我们可以通过以下命令创建一个新的 Scrapy 项目:

scrapy startproject my_scrapy_project

这个命令会在当前目录下创建一个名为 my_scrapy_project 的项目。接下来,我们可以在 spiders 目录中创建新的爬虫。

2. 编写 Scrapy 爬虫

假设我们想要抓取一个包含产品信息的网站,我们可以在 spiders 文件夹中创建一个名为 my_spider.py 的爬虫脚本:

import scrapy

class ProductSpider(scrapy.Spider):
    name = "product_spider"
    start_urls = ['https://example.com/products']

    def parse(self, response):
        # 查找所有产品条目
        for product in response.css('div.product'):
            yield {
                'name': product.css('h2::text').get(),
                'price': product.css('span.price::text').get(),
                'availability': product.css('p.availability::text').get(),
            }

        # 处理分页
        next_page = response.css('a.next::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

这个爬虫做了以下几件事:

  • 使用 start_urls 定义了要爬取的初始页面。
  • 使用 parse 方法处理响应,提取产品的名称、价格和库存情况。
  • 处理分页逻辑,自动抓取下一页的内容。

3. 运行爬虫

编写完爬虫后,可以通过以下命令运行它:

scrapy crawl product_spider

五、结合 BeautifulSoup 进行数据处理

Scrapy 提供了多种提取网页数据的方法,例如使用 XPathCSS Selectors。不过,有些时候网页结构过于复杂,Scrapy 自带的方法可能无法轻松解析此类网页。这时,我们可以结合 BeautifulSoup 进行更灵活的 HTML 解析。

假设我们抓取到的网页包含复杂的嵌套结构,Scrapy 提供的解析工具处理起来不太方便,那么我们可以将网页响应传递给 BeautifulSoup 进行解析。

1. 使用 BeautifulSoup 解析复杂 HTML

在 Scrapy 爬虫的 parse 方法中,我们可以将 response.body 传递给 BeautifulSoup 进行进一步解析。以下是一个简单的示例:

from bs4 import BeautifulSoup
import scrapy

class ProductSpider(scrapy.Spider):
    name = "product_spider"
    start_urls = ['https://example.com/products']

    def parse(self, response):
        # 使用 BeautifulSoup 解析 HTML 内容
        soup = BeautifulSoup(response.body, 'html.parser')
        
        # 查找所有产品条目
        for product in soup.find_all('div', class_='product'):
            name = product.find('h2').get_text()
            price = product.find('span', class_='price').get_text()
            availability = product.find('p', class_='availability').get_text()

            yield {
                'name': name,
                'price': price,
                'availability': availability,
            }

        # 处理分页
        next_page = soup.find('a', class_='next')
        if next_page:
            yield response.follow(next_page['href'], self.parse)

在这个示例中,我们使用 BeautifulSoup 来查找网页中的 div 元素,并提取其中的产品名称、价格和库存信息。使用 BeautifulSoup 的好处是,它的解析器对不规范的 HTML 具有更好的容错性,并且处理复杂嵌套结构时更加直观。

2. BeautifulSoup 提取嵌套数据

假设我们要从以下 HTML 结构中提取嵌套数据:

<div class="product">
    <h2>Product 1</h2>
    <span class="price">$10</span>
    <p class="availability">In stock</p>
</div>
<div class="product">
    <h2>Product 2</h2>
    <span class="price">$20</span>
    <p class="availability">Out of stock</p>
</div>

使用 BeautifulSoup 可以轻松提取这些嵌套信息:

for product in soup.find_all('div', class_='product'):
    name = product.find('h2').text
    price = product.find('span', class_='price').text
    availability = product.find('p', class_='availability').text

    yield {
        'name': name,
        'price': price,
        'availability': availability,
    }

通过 BeautifulSoup 的 findfind_all 方法,我们可以轻松解析复杂的 HTML 结构,提取嵌套数据。

六、处理数据与存储

爬取到的数据通常需要经过清洗和处理后存储。Scrapy 提供了多种数据存储选项,例如将数据存储到 CSV 文件、JSON 文件或者数据库中。

1. 将数据存储到 CSV 文件

我们可以通过 Scrapy 自带的 Feed Exports 功能将爬取的数据存储到 CSV 文件中。运行爬虫时指定输出文件:

scrapy crawl product_spider -o products.csv

Scrapy 会自动将提取的数据存储到 products.csv 文件中。

2. 将数据存储到数据库

如果你想将爬取的数据存储到数据库中,可以在 pipelines.py 中定义数据存储逻辑。以下是一个将数据存储到 SQLite 数据库的示例:

import sqlite3

class SQLitePipeline:
    def open_spider(self, spider):
        self.connection = sqlite3.connect('products.db')
        self.cursor = self.connection.cursor()
        self.cursor.execute('''
            CREATE TABLE IF NOT EXISTS products (
                name TEXT,
                price TEXT,
                availability TEXT
            )
        ''')

    def

 close_spider(self, spider):
        self.connection.commit()
        self.connection.close()

    def process_item(self, item, spider):
        self.cursor.execute('''
            INSERT INTO products (name, price, availability) VALUES (?, ?, ?)
        ''', (item['name'], item['price'], item['availability']))
        return item

settings.py 文件中启用该管道:

ITEM_PIPELINES = {
    'my_scrapy_project.pipelines.SQLitePipeline': 300,
}

七、总结

通过将 Scrapy 和 BeautifulSoup 结合使用,Python 能够高效地进行网页爬取和数据处理。Scrapy 负责调度、抓取和异步处理请求,而 BeautifulSoup 提供了强大的 HTML 解析能力,特别适合处理复杂网页结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2228260.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【p2p、分布式,区块链笔记 Torrent】webtorrent.min.js的实现之appendTo()函数

官方给出的示例通过appendTo函数渲染文件对象&#xff0c;通过torrent.files的元素对象调用&#xff1a; const WebTorrent require(webtorrent)const client new WebTorrent()// Sintel, a free, Creative Commons movie const torrentId magnet:?xturn:btih:08ada5a7a61…

ALIGN_ Tuning Multi-mode Token-level Prompt Alignment across Modalities

文章汇总 当前的问题 目前的工作集中于单模提示发现&#xff0c;即一种模态只有一个提示&#xff0c;这可能不足以代表一个类[17]。这个问题在多模态提示学习中更为严重&#xff0c;因为视觉和文本概念及其对齐都需要推断。此外&#xff0c;仅用全局特征来表示图像和标记是不…

MySQL数据集成至金蝶云星空的解决方案

MySQL数据集成至金蝶云星空的解决方案 SYB生产用料清单新增-深圳天一-半成品-好&#xff1a;MySQL数据集成到金蝶云星空的技术实现 在企业信息化系统中&#xff0c;数据的高效流转和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体案例——如何将MySQL中的生产用料清…

javaweb----VS code

前端开发神器&#xff1a;VS Code → 速度快、体积小、插件多 VS Code 安装官网&#xff1a;https://code.visualstudio.com/download VS Code一些必备的插件安装&#xff1a; 1、Chinese (Simplified) 简体中文 2、Code Spell Checker 检查拼写 3、HTML CSS Support 4…

【新闻转载】“假冒 LockBit”来袭:勒索软件借助 AWS S3 偷窃数据,威胁升级

关键要点 Trend团队发现了一些利用 Amazon S3&#xff08;简单存储服务&#xff09;传输加速功能的 Golang 勒索软件样本&#xff0c;用于窃取受害者的文件并上传至攻击者控制的 S3 存储桶。 这些样本中硬编码的 Amazon Web Services (AWS) 凭证被用于追踪与恶意活动关联的 AW…

第十五章 Vue工程化开发及Vue CLI脚手架

目录 一、引言 二、Vue CLI 基本介绍 三、安装Vue CLI 3.1. 安装npm和yarn 3.2. 安装Vue CLI 3.3. 查看 Vue 版本 四、创建启动工程 4.1. 创建项目架子 4.2. 启动工程 五、脚手架目录文件介绍 六、核心文件讲解 6.1. index.html 6.2. main.js 6.3. App.vue 一、…

BEV:针孔相机坐标转换

一 、背景 自动驾驶中经常涉及到不同坐标系之间的坐标转换&#xff0c;在BEV方案中用的比较多的是自车坐标到图像坐标的转换&#xff0c;系统整理了一下坐标转换过程流程。 二 、方法 旋转矩阵计算方法&#xff1a; translation: 平移参数[‘x’, ‘y’, ‘z’] 高阶畸变模型…

开关灯问题(c语言)

样例&#xff1a;10 10 &#xff0c;输出&#xff1a;1&#xff0c;4&#xff0c;9 5 5 &#xff0c;输出&#xff1a;1&#xff0c;4 代码如下 #include<stdio.h> //引入bool值的概念 #include<stdbool.h> int main() {int n 0;//n为灯的数量int m 0;…

centos虚拟机部署opengauss数据库

一、基本信息 1、虚拟机安装的centos版本 2、opengauss版本 地址&#xff1a;https://opengauss.org/zh/download/ 3、opengauss和gaussdb的区别 高斯数据库&#xff08;GaussDB&#xff09;是云数据库&#xff0c;需要购买。 openGaussDB是开源数据库&#xff0c;可以免费…

搜索TV 1.2.4 | 适用于TV端的浏览器应用,设计简洁,功能强大

Klonsdif搜索TV版是一款专为TV端设计的浏览器应用&#xff0c;界面简洁&#xff0c;操作简单&#xff0c;保留最纯粹的浏览体验。支持使用百度、必应、360、搜狗、秘塔AI搜索、360AI搜索、bilibili等内置搜索引擎&#xff0c;也可以直接输入网址访问。全免费、无广告&#xff0…

Spring Boot 实现文件上传下载功能

文章目录 一、原理分析1.1 请求类型1.2 服务器解析 二、功能实现2.1 创建项目并导入依赖2.2 文件上传功能实现2.2.1 文件上传 Service2.2.2 文件上传 Controller 2.3 文件下载功能实现2.3.1 文件下载 Service2.3.2 文件下载 Controller 2.4 文件上传前端代码(可选)2.4.1 上传文…

注册信息合理性验证

表单是网页中的一个重要功能,主要用于用户信息的收集。使用JavaScript进行表单验证对于提升用户体验、减轻服务器负担、确保数据准确性、增强安全性和提高开发效率等方面都具有重要意义。本文详细敍述进行合理化验化必要性和具体实现方法。 一 表单项合理性必要性 主要体现在…

4款专业音频在线剪辑工具帮你开启创意之路。

音频在线剪辑工具能够为我们提供很大的便利&#xff0c;对于不管是专业的音乐制作人还是音频创作爱好者来说&#xff0c;都能借助一些音频编辑工具来充分发挥自己的创意。所以这一次&#xff0c;我要给大家介绍几个专业方便的音频剪辑工具。 1、福昕音频在线 直达链接&#x…

pdf页面提取全攻略,试试这几个简单方法,提升工作效率(收藏篇)

怎么提取pdf页面&#xff1f;在日常的办公生活中&#xff0c;我们经常需要使用到pdf文件&#xff0c;因此我们经常需要对PDF文档进行一些页面处理&#xff0c;比如提取PDF文件中的其中一个页面。那要怎么提取pdf文件中的其中一页呢&#xff1f;其实很简单&#xff0c;下面分享几…

【计算机网络】单播帧和广播帧在一个局域网内部的传播过程

我们引入这样的一个模型。 路由器可以连接多个网络&#xff0c;在路由器的这一端&#xff0c;我们用交换机集线器连接了很多节点。 这些节点共同组成了一个局域网。 而路由器的另外两个端口又分别连接了其他的网络。MAC地址这个概念是数据链路层才拥有的东西&#xff0c;物理…

翻译新体验:四款在线翻译工具让你沟通更顺畅!

如果你还拿着手里的外文文件干瞪眼&#xff1f;别担心&#xff0c;今天&#xff0c;我要给大家介绍几款超给力的在线翻译工具&#xff0c;它们就像是你的语言小助手&#xff0c;随时待命&#xff0c;帮你搞定那些让人头疼的翻译问题&#xff01; 福昕在线翻译 直达链接&#…

不用求人,4个方法快速恢复小米手机删除短信

手机短信作为我们日常办理事情的重要验收通道&#xff0c;往往承载着许多重要的信息。然而&#xff0c;由于各种原因&#xff0c;我们可能会不小心删除了重要的短信。那么&#xff0c;小米手机用户如何恢复这些被删除的短信呢&#xff1f;接下来&#xff0c;我们将分点为您详细…

macOS 15 Sequoia dmg格式转用于虚拟机的iso格式教程

想要把dmg格式转成iso格式&#xff0c;然后能在虚拟机上用&#xff0c;最起码新版的macOS镜像是不能用UltraISO&#xff0c;dmg2iso这种软件了&#xff0c;你直接转放到VMware里绝对读不出来&#xff0c;办法就是&#xff0c;在Mac系统中转换为cdr&#xff0c;然后再转成iso&am…

打造自己的RAG解析大模型:(新技能)企业垂类数据标注(一)

在上一篇文章中&#xff0c;我们以通用版面分析服务为例&#xff0c;展示了从模型发布到API集成的完整流程。如果你成功完成了这些步骤&#xff0c;值得庆祝&#xff01;这不仅意味着你已成功安装PaddleX&#xff0c;还掌握了利用它发布OCR和目标检测等大模型服务的能力&#x…

基于vue框架的的驾校练习时段预约系统z94u5(程序+源码+数据库+调试部署+开发环境)文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,驾校教练,车辆信息,训练场,教练预约,时间段,预约取消,学员签到,学员签退 开题报告内容 基于Vue框架的驾校练习时段预约系统开题报告 一、研究背景与意义 随着汽车保有量的持续增长&#xff0c;驾驶培训需求日益旺盛。然而&#…