使用Scrapy框架爬取博客信息

随着网络的发展,越来越多有价值的信息存储在网络上。使用爬虫技术可以从这些信息源中提取出有用的数据。本文将介绍如何使用Python中的Scrapy框架来爬取博客站点上的文章标题、作者以及阅读数,并将其保存到JSON文件中。

一、项目背景

Scrapy是一个快速高级的web爬虫框架,用于抓取网站数据,提取结构化数据。它可以处理大量的网站,提供了灵活的API来适应各种需求。本文将使用Scrapy来爬取来自Cnblogs的技术博客信息。

二、环境搭建

在开始编写爬虫之前,需要确保安装了Python环境,并且安装了Scrapy库。可以通过如下命令安装Scrapy:

pip install scrapy

创建一个新的Scrapy项目:

scrapy startproject DemoProject
cd DemoProject

在项目的spiders目录下创建一个爬虫:

scrapy genspider bkySpider cnblogs.com

三、定义Item类

首先,我们需要定义一个数据模型来存储爬取的数据。在DemoProject/DemoProject/items.py中定义如下类:

class BkyItem(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
    readNum = scrapy.Field()

这里定义了三个字段:titleauthorreadNum,分别用于存储文章标题、作者名称和阅读数量。

四、编写爬虫逻辑

接下来,在DemoProject/spiders/bkySpider.py中编写爬虫逻辑:

import scrapy
from DemoProject.items import BkyItem

class BkyspiderSpider(scrapy.Spider):
    name = "bkySpider"
    allowed_domains = ["cnblogs.com"]
    start_urls = ["https://cnblogs.com"]

    def parse(self, response):
        # 创建item对象
        item = BkyItem()
        # 使用 XPath 选择器获取所有文章元素
        article = response.xpath("//article[@class='post-item']")

        item["title"] = article.xpath(
            ".//section[@class='post-item-body']//div[@class='post-item-text']//a[@class='post-item-title']/text()"
        ).extract()
        item["author"] = article.xpath(
            ".//footer[@class='post-item-foot']//a[@class='post-item-author']//span/text()"
        ).extract()
        item["readNum"] = article.xpath(
            ".//footer[@class='post-item-foot']//a[contains(@title,'阅读')]//span/text()"
        ).extract()
        return item

这里定义了一个名为bkySpider的爬虫类,指定了起始URL,并在parse方法中解析了页面内容,提取了所需的字段。

五、实现Pipeline处理

为了处理爬取到的数据,我们还需要定义一个Pipeline。在DemoProject/DemoProject/pipelines.py中添加如下代码:

import json

class DemoProjectPipeline(object):
    def __init__(self):
        # 打开edu.json文件
        self.file = open("D:\\PyCharmProject\\pP1\\work2.json", "w", encoding='utf-8')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        print("Processing an item in the pipeline...")
        # 通过for循环以此处理每条博文数据,从item对象中读取
        # 构建json格式
        self.file.write('[')
        # 开始for循环写入
        for index in range(0, len(item['title'])):
            # 逐层提取,赋值
            title = item['title'][index]
            # 注意:原始代码中缺少对href的处理,这里假设href存在
            href = item['href'][index]
            # 重构生成一条json记录,json的标准格式
            record = {"title": title, "href": href}
            # 写入到json文件里
            line = json.dumps(dict(record), ensure_ascii=False)
            self.file.write(line)
            # 如果不是最后一行,要加入逗号换行符
            if index != len(item["title"]) - 1:
                self.file.write(',\n')
        self.file.write(']')
        return item

注意:原始代码中并没有href字段的提取,此处假设它存在于item中,否则需要删除或调整。

六、执行爬虫

现在,可以在命令行中运行爬虫:

scrapy crawl bkySpider

执行完毕后,指定路径下的work2.json文件将包含爬取的数据。

相关推荐
大叔是90后大叔17 小时前
scrapy在pipelines中获取项目根目录
python·scrapy
咬着布丁的龙猫19 小时前
前端JS接口加密攻防实操
前端·javascript·功能测试·安全·网络爬虫
码点1 天前
Python PyCharm DeepSeek接入
数据库·python·pycharm
huiyuanzhenduo2 天前
pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
ide·python·pycharm
张扬飞舞2 天前
PyCharm2024使用Python3.12在Debug时,F8步进时如同死机状态
开发语言·python·pycharm
码点2 天前
Pythong 解决Pycharm 运行太慢
ide·python·pycharm
B站计算机毕业设计超人4 天前
计算机毕业设计Tensorflow+LSTM空气质量监测及预测系统 天气预测系统 Spark Hadoop 深度学习 机器学习 人工智能
大数据·python·深度学习·机器学习·网络爬虫·课程设计·数据可视化
北京-宏哥4 天前
《刚刚问世》系列初窥篇-Java+Playwright自动化测试-22- 操作鼠标拖拽 - 下篇(详细教程)
java·前端·javascript·pycharm·自动化
墨者清风4 天前
在 PyCharm 中接入deepseek的API的各种方法
ide·python·pycharm