随着网络的发展,越来越多有价值的信息存储在网络上。使用爬虫技术可以从这些信息源中提取出有用的数据。本文将介绍如何使用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()
这里定义了三个字段:title
、author
和 readNum
,分别用于存储文章标题、作者名称和阅读数量。
四、编写爬虫逻辑
接下来,在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
文件将包含爬取的数据。