随着网络的发展,越来越多有价值的信息存储在网络上。使用爬虫技术可以从这些信息源中提取出有用的数据。本文将介绍如何使用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 BkyItemclass 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 jsonclass 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
文件将包含爬取的数据。