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

相关推荐
漫无目的行走的月亮4 小时前
基于Python Scrapy的豆瓣Top250电影爬虫程序
爬虫·python·scrapy
music0ant5 小时前
Idean 处理一个项目引用另外一个项目jar 但jar版本低的问题
java·pycharm·jar
Tttian62215 小时前
Pycharm访问MongoDB数据库
数据库·mongodb·pycharm
西格玛懒大王1 天前
[python] 基于matplotlib实现雷达图的绘制
数据库·python·pycharm·pip
等一场春雨1 天前
linux 根据名称 杀死linux 上某个jar进程或其他进程
linux·pycharm·jar
坤坤不会编程1 天前
新版pycharm下载第三方库时太慢
ide·python·pycharm
黑色叉腰丶大魔王3 天前
《Python 解释器和 PyCharm 详解》
开发语言·python·pycharm
几度热忱3 天前
【Pycharm相关设置】新版Pycharm关闭主菜单,取消自动隐藏工具栏
ide·python·pycharm
昨天今天明天好多天3 天前
【PyCharm】
ide·python·pycharm
Eiceblue3 天前
用Python在Excel工作表中创建、修改及删除表格区域
开发语言·vscode·python·pycharm·数据分析·excel