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

相关推荐
小杨4044 小时前
python入门系列十三(多线程)
人工智能·python·pycharm
叫我王富贵i16 小时前
0基础入门scrapy 框架,获取豆瓣top250存入mysql
爬虫·python·scrapy
九月镇灵将20 小时前
6.git项目实现变更拉取与上传
git·python·scrapy·scrapyd·gitpython·gerapy
步木木21 小时前
Anaconda和Pycharm的区别,以及如何选择两者
ide·python·pycharm
莓事哒1 天前
selenium和pytessarct提取古诗文网的验证码(python爬虫)
爬虫·python·selenium·测试工具·pycharm
我的大老婆1 天前
【Python】Python 环境 + Pycharm 编译器 官网免费下载安装(图文教程,新手安装,Windows 10 系统)
开发语言·windows·经验分享·python·青少年编程·pycharm
莓事哒1 天前
使用pytesseract和Cookie登录古诗文网~(python爬虫)
爬虫·python·pycharm·cookie·pytessarct
hljqfl2 天前
pip安装第三方库,但PyCharm中却无法识别
ide·pycharm·pip
守城小轩2 天前
突破反爬困境:SDK开发,浏览器模块(七)
网络爬虫·指纹浏览器·浏览器开发·浏览器爬虫
海天一色y3 天前
Pycharm(十一):字符串练习题
ide·python·pycharm