使用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文件将包含爬取的数据。

相关推荐
杰瑞不懂代码2 小时前
playwright 基础入门教程,更便捷的数据获取
python·网络爬虫·playwright·自动化处理
hui函数3 小时前
如何解决 PyCharm 控制台 pip install 报错 OSError: [Errno 18] Cross-device link 问题
ide·pycharm·pip
hui函数1 天前
Python系列Bug修复PyCharm控制台pip install报错:如何解决 pip install 网络报错 企业网关拦截 User-Agent 问题
python·pycharm·bug
arthur.dy.lee1 天前
在pycharm中使用powershell7解决conda,ohmyposh报错的问题
ide·pycharm·conda
Autumn72991 天前
【 jupyter 】PyCharm配置服务器连接jupyter
服务器·jupyter·pycharm
技术宅学长2 天前
关于CLS与mean_pooling的一些笔记
人工智能·pytorch·笔记·pycharm
love530love2 天前
EPGF 新手教程 13在 PyCharm(中文版 GUI)中创建 Hatch 项目环境,并把 Hatch 做成“项目自包含”(工具本地化为必做环节)
开发语言·ide·人工智能·windows·python·pycharm·hatch
小树苗m2 天前
将dockers通过远程ssh配置在pycharm中
运维·pycharm·ssh
love530love2 天前
EPGF 新手教程 11在 PyCharm(中文版 GUI)中创建 uv 环境,并把 uv 做到“项目自包含”(工具本地化为必做环节)
ide·人工智能·python·pycharm·conda·uv·epgf
love530love2 天前
升级到 ComfyUI Desktop v0.7.0 版本后启动日志报 KeyError: ‘tensorrt‘ 错误解决方案
开发语言·windows·python·pycharm·virtualenv·comfyui·comfyui desktop