网络爬虫丨基于scrapy+mysql爬取博客信息

news2024/11/24 20:40:02

文章目录

  • 写在前面
  • 实验描述
    • 实验框架
    • 实验需求
  • 实验内容
    • 1.安装依赖库
    • 2.创建Scrapy项目
    • 3.配置系统设置
    • 4.配置管道文件
    • 5.连接数据库
    • 6.分析要爬取的内容
    • 7.编写爬虫文件
  • 运行结果
  • 写在后面

写在前面

本期内容:基于scrapy+mysql爬取博客信息并保存到数据库中

实验需求

  • anaconda丨pycharm
  • python3.11.4
  • scrapy
  • mysql

项目下载地址:https://download.csdn.net/download/m0_68111267/88740730

实验描述

本次实验实现了:使用Scrapy框架爬取博客专栏的目录信息并保存到MySQL数据库中,实验主要涉及到Python的爬虫技术以及MySQL的基本操作,需要有一定的基础。

实验框架

  • Scrapy

1

实验需求

  • Scrapy: Scrapy是一个基于Python的开源网络爬虫框架,用于快速、高效地获取网页数据。它具有强大的抓取能力,支持多线程和分布式爬虫,能够并行爬取多个网页。Scrapy提供了方便的API和丰富的功能,可以自定义爬虫规则和处理流程,支持数据的持久化存储和导出。它还提供了可视化的调试工具和强大的反爬虫策略,可以帮助开发者更轻松地构建和管理网络爬虫。Scrapy是一个成熟、稳定和广泛应用的爬虫框架,被广泛用于数据抓取、搜索引擎和大数据分析等领域。
  • MySQL: MySQL是一个开源的关系型数据库管理系统,由Oracle Corporation开发和维护。它具有高性能、可靠性和稳定性,能够在各种不同规模的应用中存储和管理大量的数据。MySQL使用SQL语言进行数据操作和查询,支持多用户并发操作和事务处理,提供了丰富的功能和灵活的配置选项。它可以在多种操作系统上运行,并且与多种编程语言和开发工具兼容。MySQL被广泛应用于Web应用、企业级应用和大数据分析等领域。

实验内容

1.安装依赖库

本次实验需要安装scrapy库,如果没有scrapy库的话可以运行下面的命令进行安装哦~

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy

2.创建Scrapy项目

  1. 在终端输入以下命令可以创建一个scrapy项目:
scrapy startproject myblog
  1. 项目框架如下:(此时你们应该没有"db.py"和"sp_blogs.py"文件)

2

  • spiders:spiders 文件夹是 Scrapy 框架中存放爬虫代码的目录。在 spiders 文件夹中,会包含一个或多个 Python 文件,每个 Python 文件代表一个独立的爬虫。每个爬虫文件都需要继承自 Scrapy 的 Spider 类,并定义爬虫的名称、起始 URL、解析页面的方法等。在爬虫文件中,还可以定义一些其他的属性和方法,来实现对网页的抓取和解析。Scrapy 框架通过读取 spiders 文件夹中的爬虫文件来识别和启动爬虫。在运行爬虫时,可以指定要运行的爬虫名称,Scrapy 将会找到对应的爬虫文件并执行相应的代码。spiders 文件夹是 Scrapy 爬虫的核心部分,开发者可以根据需要在该文件夹下创建多个爬虫文件,以支持同时抓取和解析多个网站。
  • items.py:items.py文件是Scrapy框架中用于定义数据模型的文件,用于指定爬取的数据结构。它定义了爬虫需要爬取和保存的数据字段,类似于数据库表的结构,方便数据的提取和存储。在items.py文件中,使用Python的类来定义数据模型,每个类的属性对应一个需要爬取和保存的字段。
  • middlewares.py:middlewares.py文件是Scrapy框架中用于处理请求和响应的中间件文件。中间件是Scrapy框架的一个重要组成部分,用于对请求进行预处理、对响应进行处理或者是处理异常情况。middlewares.py文件中定义了多个中间件类,每个中间件类都有特定的功能,例如设置请求头、代理设置、处理重定向等。通过在settings.py中配置中间件的顺序,Scrapy框架会按照顺序依次使用不同的中间件对请求和响应进行处理。
  • pipelines.py:pipelines.py文件是Scrapy框架中用于处理数据的管道文件。在Scrapy中,管道是一个用于处理爬取到的数据的组件,可以对数据进行清洗、验证、存储或者是发送到其他系统。pipelines.py文件中定义了多个管道类,每个管道类都有特定的功能,例如将数据存储到数据库、写入文件、发送邮件等。通过在settings.py中配置管道的优先级,Scrapy框架会按照优先级顺序依次使用不同的管道对爬取到的数据进行处理。
  • settings.py:settings.py 文件是 Scrapy 框架中的配置文件,用于管理和配置爬虫的各种设置选项。在 settings.py 文件中,可以设置爬虫的名称、启用或禁用的中间件、管道、下载器、并发请求数、延迟、日志级别等。settings.py 文件包含了许多可配置的选项,可以根据实际需求进行调整。通过修改 settings.py 文件,可以改变爬虫的行为,并对其进行个性化定制。此外,settings.py 文件还提供了一些默认的全局配置选项,这些选项可以决定爬虫的运行方式和输出结果。
  1. 在终端输入以下命令创建爬虫文件
scrapy genspider sp_blogs "https://want595.blog.csdn.net/category_12039968_1.html"

该命令将使用Scrapy生成一个名为"sp_blogs"的爬虫,并将爬虫的起始URL设置为"https://want595.blog.csdn.net/category_12039968_1.html"。(本次实验需要爬取的就是这个专栏的目录)

输入完这个命令后,在spiders的目录下就会出现"sp_blogs.py"这个文件啦~

3.配置系统设置

打开"settings.py"文件,配置系统设置:

3
4
5

4.配置管道文件

"pipelines.py"文件,主要用于编写代码处理爬取的数据,例如存放到文件中,数据库中等等

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html


# useful for handling different item types with a single interface
import pymysql
from twisted.enterprise import adbapi


class MyblogPipeline:

    def __init__(self, dbpool):
        self.dbpool = dbpool

    @classmethod
    def from_settings(cls, settings):
        dbparams = dict(
            host=settings['MYSQL_HOST'],  # 读取settings中的配置
            db=settings['MYSQL_DBNAME'],
            user=settings['MYSQL_USER'],
            passwd=settings['MYSQL_PASSWD'],
            charset='utf8',  # 编码要加上,否则可能出现中文乱码问题
            cursorclass=pymysql.cursors.DictCursor,
            use_unicode=False,
        )
        dbpool = adbapi.ConnectionPool('pymysql', **dbparams)  # **表示将字典扩展为关键字参数,相当于host=xxx,db=yyy....
        return cls(dbpool)  # 相当于dbpool付给了这个类,self中可以得到

    # pipeline默认调用
    def process_item(self, item, spider):
        query = self.dbpool.runInteraction(self.insert, item)  # 调用插入的方法
        query.addErrback(self.error, item, spider)  # 调用异常处理方法
        return item

    # 写入数据库中
    def insert(self, db, item):
        # print item['name']
        sql = "insert ignore into blogs(title,url) values(%s,%s)"
        params = (item["name"], item["url"])
        db.execute(sql, params)

    # 错误处理方法
    def error(self, failue, item, spider):
        print(failue)

该代码是一个Twisted框架下的MySQL数据库存储的Pipeline。Twisted是一个事件驱动的网络框架,使用异步的方式处理网络请求。

该代码中的MyblogPipeline类继承自object类,并且实现了__init__from_settingsprocess_iteminserterror方法。

  • __init__方法初始化了一个数据库连接池dbpool,并将其赋值给self.dbpool

  • from_settings方法从配置文件中读取数据库的相关配置信息,并利用这些信息创建一个数据库连接池dbpool

  • process_item方法是Pipeline默认调用的方法,用于处理item并存储到数据库中。在该方法中,首先调用self.dbpool.runInteraction()方法创建一个操作数据库的事务,并调用self.insert方法将item插入到数据库中。然后,通过addErrback方法添加了一个异常处理方法self.error

  • insert方法接收两个参数,一个是数据库连接对象db,一个是item。在该方法中,定义了一个SQL语句和参数,并通过db.execute()方法执行了数据库插入操作。

  • error方法用于处理插入数据库时的异常情况,将异常信息打印出来。

总体而言,该代码实现了将爬取的数据存储到MySQL数据库中的功能。

5.连接数据库

新建一个"db.py"文件,输入以下代码连接到本地数据库,运行后创建一个表,用于保存等会爬取的数据。

import pymysql
from scrapy.utils.project import get_project_settings  # 导入seetings配置


class DBHelper:

    def __init__(self):
        self.settings = get_project_settings()  # 获取settings配置,设置需要的信息

        self.host = self.settings['MYSQL_HOST']
        self.port = self.settings['MYSQL_PORT']
        self.user = self.settings['MYSQL_USER']
        self.passwd = self.settings['MYSQL_PASSWD']
        self.db = self.settings['MYSQL_DBNAME']

    # 连接到具体的数据库(settings中设置的MYSQL_DBNAME)
    def connectDatabase(self):
        conn = pymysql.connect(host=self.host,
                               port=self.port,
                               user=self.user,
                               passwd=self.passwd,
                               db=self.db,
                               charset='utf8')  # 要指定编码,否则中文可能乱码
        return conn

    # 创建表
    def createTable(self, sql):
        conn = self.connectDatabase()
        cur = conn.cursor()
        try:
            cur.execute(sql)
            cur.close()
            conn.close()
            print("创建表成功!")
        except:
            print("创建表失败!")
            pass

    # 插入数据
    def insert(self, sql, *params):  # 注意这里params要加*,因为传递过来的是元组,*表示参数个数不定
        conn = self.connectDatabase()
        cur = conn.cursor();
        cur.execute(sql, params)
        conn.commit()  # 注意要commit
        cur.close()
        conn.close()

if __name__ == "__main__":
    dbHelper = DBHelper()
    sql = "create table pictures(id int primary key auto_increment,name varchar(50) unique,url varchar(200))"
    dbHelper.createTable(sql)

这段代码是一个用于操作MySQL数据库的助手类。它使用了Scrapy框架的get_project_settings函数来获取配置信息,然后根据配置信息连接到数据库。

在初始化方法中,它获取到了MySQL数据库的主机地址、端口号、用户名、密码和数据库名,并保存在实例变量中。

  • connectDatabase方法用于连接到具体的数据库,并返回一个数据库连接对象。

  • createTable方法用于创建表,它接受一个SQL语句作为参数,使用数据库连接对象执行SQL语句来创建表。

  • insert方法用于插入数据,它接受一个SQL语句和参数作为参数,使用数据库连接对象执行SQL语句来插入数据。

最后在主函数中,创建了一个DBHelper对象,并调用createTable方法来创建一个名为pictures的表。

6.分析要爬取的内容

本实验要爬取的是博客专栏的目录信息:

7
8

7.编写爬虫文件

编写"spiders"目录下的"sp_blogs.py"文件,实现博客信息的爬取:

import scrapy
from scrapy import Selector, cmdline


class MyblogItem(scrapy.Item):
    name = scrapy.Field()
    url = scrapy.Field()


class SpBlogsSpider(scrapy.Spider):
    name = "sp_blogs"
    allowed_domains = ["want595.blog.csdn.net"]

……请下载后查看完整代码哦

这段代码是一个基于Scrapy框架的爬虫,用于爬取一个博客网站的文章标题和链接。

首先定义了一个MyblogItem类,它继承自scrapy.Item,并定义了两个字段nameurl,用于保存文章的标题和链接。

然后定义了一个SpBlogsSpider类,它继承自scrapy.Spider,表示一个具体的爬虫。在SpBlogsSpider类中,指定了爬虫的名字为sp_blogs,指定了允许爬取的域名为want595.blog.csdn.net,并指定了要爬取的起始URL。起始URL使用了一个循环生成器,生成了多个URL,用于爬取多页的数据。

parse方法是默认的回调方法,在爬取网页的响应返回后自动被调用。在parse方法中,使用Selector对象对响应进行了解析,提取出了文章的标题和链接,并将它们保存到MyblogItem对象中,然后通过yield返回给引擎。

最后,通过调用cmdline.execute函数来执行爬虫。执行时会根据给定的参数调用对应的爬虫。在这里,使用'scrapy crawl sp_blogs'参数来执行sp_blogs爬虫。(也可以在终端项目的根目录下运行scrapy crawl sp_blogs命令来执行爬虫。)

运行结果

爬取的博客信息如下:

9

写在后面

我是一只有趣的兔子,感谢你的喜欢!

图片

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

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

相关文章

欧科云链做客Google Cloud与WhalerDAO专题论坛,畅谈Web3数据机遇

3月10日,由Google Cloud、WhalerDAO和baidao data主办,以Web3AI 2024 DATA POWER为主题的分享会在北京中关村举行。欧科云链高级研究员Jason Jiang受邀参加活动,带来“从链上数据发掘Web3时代的无限机遇”的主题分享。 Web3.0核心要素始终是链…

波奇学Linux:信号量环形队列,原生线程池,封装线程

基于信号量的多生产多消费环形队列 代码 const static int defaultcap5;template<class T> class RingQueue { private:void P(sem_t &sem){sem_wait(&sem); //资源-1}void V(sem_t &sem){sem_post(&sem); //资源加一}void Lock(pthread_mutex_t &…

c++实现简单搜索二叉树<K,V>形

文章目录 搜索二叉树节点类BSTreeNode(节点类的构造) BSTree(功能实现类)Insert(插入)Erase(删除)Find(查找这个节点) 搜索二叉树 搜索二叉树本质:左节点比我小 右节点比我大 节点类 BSTreeNode:给自身节点封装一个类 用这个类来添加节点的操作 我们写的是一个key.value型的搜…

【现代C++】移动语义和右值引用

现代C++中的移动语义和右值引用是C++11引入的重要特性,旨在优化资源管理和提升性能。这些特性允许资源的转移而非复制,特别是对于临时对象和大型对象。 1. 右值引用 右值引用是对临时对象的引用,它允许你修改临时对象。使用&&来声明右值引用。 #include <iost…

【电路笔记】-MOSFET作为开关

MOSFET 作为开关 文章目录 MOSFET 作为开关1、概述2、MOSFET特性曲线2.1 截住区域2.2 饱和区域3、MOSFET作为开关的示例4、功率MOSFET电机控制5、P沟道MOSFET作为开关6、互补MOSFET作为开关电机控制器当 MOSFET 在截止区和饱和区之间工作时,MOSFET 是非常好的电子开关,用于控…

wsl ubuntu 安装的正确方式

目录 wsl ubuntu 安装的正确方式&#xff1a; 将wsl2设置为默认版本&#xff1a; 1、打开powershell 2、设置wsl的版本为2 ​编辑 3、更新wsl程序 4、强制关闭子系统 5、查看wsl支持的列表 6、安装指定版本的系统 wsl ubuntu 安装的正确方式&#xff1a; 此时&#xff0c…

一体成型PFA尖头镊子高纯特氟龙材质镊子适用半导体新材料

PFA镊子用于夹取小型片状、薄状、块状样品&#xff0c;广泛应用在半导体、新材料、新能源、原子能、石油化工、无线电、电力机械等行业。 具有耐高低温性&#xff08;可使用温度-200℃&#xff5e;&#xff0b;260℃&#xff09;、耐腐蚀、表面不粘性等特点&#xff0c;用于苛…

基于Springboot+Redis+mysql实现的闲置二手交易网站管理系统

1.1 背景分析 二手商品是学生比较青睐的廉价商品&#xff0c;网站设计应着重突出实用和廉价。也有一部分消费者是淘宝者&#xff0c;他们对相中的商品有着急切的拥有欲望。网上交易的好学生提供一个供需平台&#xff0c;学生可以将自己不用的东西放在网上&#xff0c;也可在网…

解决quest2激活后更新卡0%(内附全套工具)

注意:顺序很重要,一定是要先开移动热点,再开Netch 下载工具包https://wwi.lanzoup.com/iXaX61rou8hi ,密码在下方 解压后,先安装这个 开启移动热点网络名称和密码随便写下就行 开启后会有个 本地连接 开启Netch添加VLESS 服务器 然后点击启动,启动后 会有一个 aioClou…

设计模式 --3:装扮模式

结构图 代码 #include<iostream>using namespace std;class person { public:person() {};person(string name) { this->name name; }virtual void show() {cout << "装扮的:" << this->name << endl;} private:string name; }; //装…

活动图高阶讲解-05

115 00:06:30,540 --> 00:06:39,060 那我们可以把它和 116 00:06:39,060 --> 00:06:41,260 序列图对比一下 117 00:06:41,260 --> 00:06:41,740 你看 118 00:06:41,740 --> 00:06:42,660 序列图上 119 00:06:42,660 --> 00:06:47,500 同样的一个过程 120 0…

Python之Web开发中级教程----ubuntu中下载安装Postman

Python之Web开发中级教程----ubuntu中下载安装Postman PostMan 是一款功能强大的网页调试与发送网页 HTTP 请求的 Chrome 插件&#xff0c;可以直接去对我们写出来的路由和视图函数进行调试&#xff0c;作为后端程序员是必须要知道的一个工具。 查看ubuntu系统中是否已经安装了…

栈与队列|20.有效的括号

力扣题目链接 class Solution { public:bool isValid(string s) {if (s.size() % 2 ! 0) return false; // 如果s的长度为奇数&#xff0c;一定不符合要求stack<char> st;for (int i 0; i < s.size(); i) {if (s[i] () st.push());else if (s[i] {) st.push(});el…

免费开源:自动会议记录接口调用|语音识别接口|语音识别API

一、开源项目介绍 一款多模态AI能力引擎&#xff0c;专注于提供自然语言处理&#xff08;NLP&#xff09;、情感分析、实体识别、图像识别与分类、OCR识别和语音识别等接口服务。该平台功能强大&#xff0c;支持本地化部署&#xff0c;并鼓励用户体验和开发者共同完善&#xf…

java的前缀和算法

前缀和的概念 对于一个给定的数组A&#xff0c;它的前缀和数组S中S[i]表示从第1个元素到第i个元素的总和&#xff0c;用公式表示为&#xff1a; SiA1A2A3...An 前缀和的作用 在O(1)的时间求出数组任意区间的区间和。 降低求解的复杂度 算法模板 int n10; int [] arrnew in…

Linux 基础-查看和设置环境变量

一&#xff0c;查看环境变量 在 Linux中&#xff0c;环境变量是一个很重要的概念。环境变量可以由系统、用户、Shell 以及其他程序来设定&#xff0c;其是保存在变量 PATH 中。环境变量是一个可以被赋值的字符串&#xff0c;赋值范围包括数字、文本、文件名、设备以及其他类型…

C语言中,基本数据类型介绍

C语言当中各种数据类型的大小&#xff0c;首先要了解有哪些数据类型。 一 字符型&#xff1a; 整数&#xff08;字符&#xff09;类型存储大小值范围char1 字节-128 到 127 或 0 到 255&#xff08;2的8次方&#xff09;unsigned char1 字节0 到 255&#xff08;&#xff09;s…

面试经典-MySQL篇

一、MySQL组成 MySQL数据库的连接池&#xff1a;由一个线程来监听一个连接上请求以及读取请求数据&#xff0c;解析出来一条我们发送过去的SQL语句SQL接口&#xff1a;负责处理接收到的SQL语句查询解析器&#xff1a;让MySQL能看懂SQL语句查询优化器&#xff1a;选择最优的查询…

MATLAB环境下基于决策树和随机森林的心力衰竭患者生存情况预测

近年来&#xff0c;随着医学数据的不断积累和计算机技术的快速发展&#xff0c;许多机器学习技术已经被用在医学领域&#xff0c;并取得了不错的效果。与传统的基于医学知识经验的心衰预后评估模型相比&#xff0c;机器学习方法可以快速、高效地从繁杂的、海量的心衰病人数据中…

SQLite数据库使用指南以及相关API编程

SQLite介绍 SQLite是一种基于C语言开发的轻量级、快速、自包含、高可靠性和全功能的SQL数据库引擎。它是全球范围内使用最为广泛的数据库引擎&#xff0c;被嵌入到所有移动设备和大部分计算机中&#xff0c;并且伴随着无数日常使用的应用程序一起提供。SQLite的文件格式具有稳…