Python scrapy爬取小说代码案例详解
本文将详细介绍使用Python的scrapy框架实现小说网站爬取的过程。使用Python进行网络爬虫开发,scrapy框架是一个强大的工具。
安装scrapy
使用pip安装scrapy视频,命令如下:
pip install scrapy
创建scrapy项目
使用命令行创建项目:
scrapy startproject novelSpider
编写小说爬虫
在novelSpider
文件夹中创建名为novel_spider.py
的文件。在该文件中创建一个类,继承自scrapy.Spider
,代码如下:
import scrapy
class NovelSpider(scrapy.Spider):
name = "novels"
allowed_domains = ["novel.com"]
start_urls = [
"https://novel.com/novel/novelid"
]
def parse(self, response):
# 解析小说页面数据
pass
在上面的代码中:
name
为爬虫的名称,爬虫启动时需要使用该名称。allowed_domains
为爬取数据的域名,限制了可以爬取的网站。start_urls
为爬取数据的第一个URL。parse
方法用于解析小说页面数据。
解析小说页面
我们需要学习如何使用XPath及其选择器来提取数据。在parse
函数中添加以下代码:
def parse(self, response):
# 提取小说名称,作者和简介
novel_name = response.xpath('//div[@class="novel-name"]/text()')
author = response.xpath('//div[@class="author"]/text()')
brief = response.xpath('//div[@class="brief"]/text()')
# 打印提取结果
print('小说名称:', novel_name.extract_first())
print('作者:', author.extract_first())
print('简介:', brief.extract_first())
在上面的代码中,我们使用xpath
选择器来提取小说名称,作者和简介。extract_first()
方法用于获取第一个值。在命令行中输入以下命令,启动爬虫:
scrapy crawl novels
执行后我们可以在控制台中找到解析出来的小说名称,作者和简介。
解析小说章节
接下来,我们需要进入小说章节页面,并解析出所有章节及其链接。在parse
方法中添加以下代码:
def parse(self, response):
# 章节链接列表
urls = response.xpath('//ul[@class="chapter-list"]/li/a/@href')
for url in urls:
# 依次解析每一章节
yield scrapy.Request(url.urljoin(url), callback=self.parse_chapter)
def parse_chapter(self, response):
# 解析章节内容
pass
在上面的代码中,我们使用xpath
选择器提取章节链接,并对每个链接都发起一个请求,调用parse_chapter
方法。
解析章节内容
在parse_chapter
方法中添加以下代码,提取章节标题及内容:
def parse_chapter(self, response):
# 提取章节标题及内容
title = response.xpath('//h1/text()')
content = response.xpath('//div[@class="content"]/text()')
# 将结果保存到本地
with open(title.extract_first() + '.txt', 'w', encoding='utf-8') as f:
f.write(title.extract_first())
f.write(content.extract_first())
在上面的代码中,我们提取章节的标题及内容,然后使用文件保存在本地。
示例一
在执行scrapy的同时,顺便爬取小说的封面图片
该小说网站提供了小说的封面图片,我们可以在parse
函数中下载小说封面图片。在以下示例中,我们使用Python的os
模块创建图片文件夹,并保存下载的图片到该文件夹中。
import scrapy
from urllib.parse import urljoin
import os
class NovelSpider(scrapy.Spider):
name = "novels"
allowed_domains = ["novel.com"]
start_urls = [
"https://novel.com/novel/novelid"
]
# 创建图片文件夹
if not os.path.exists('cover_imgs'):
os.mkdir('cover_imgs')
def parse(self, response):
# 提取小说名称,作者和简介
novel_name = response.xpath('//div[@class="novel-name"]/text()')
author = response.xpath('//div[@class="author"]/text()')
brief = response.xpath('//div[@class="brief"]/text()')
# 下载封面图片并保存到指定文件夹中
cover_url = response.xpath('//div[@class="cover"]/img/@src')[0]
yield scrapy.Request(urljoin(response.url, cover_url), callback=self.parse_cover)
def parse_cover(self, response):
# 将封面图片保存到指定文件夹中
with open('cover_imgs/{}.jpg'.format(self.novel_name), 'wb') as f:
f.write(response.body)
在上面的代码中,os.mkdir()
方法用于创建一个名为“cover_imgs”的文件夹。parse_cover()
方法用于将封面图片保存到该文件夹中。
示例二
使用导出csv格式的方式,将小说章节信息导出到本地
我们可以将小说章节信息导出为csv格式,以便于后续的数据分析。在以下示例代码中,我们使用Python的csv
模块创建csv文件,并将提取的章节信息写入该文件中。
import scrapy
import csv
class NovelSpider(scrapy.Spider):
name = "novels"
allowed_domains = ["novel.com"]
start_urls = [
"https://novel.com/novel/novelid"
]
def parse(self, response):
# 解析小说章节
urls = response.xpath('//ul[@class="chapter-list"]/li/a/@href')
for url in urls:
# 依次解析每一章节
yield scrapy.Request(url.urljoin(url), callback=self.parse_chapter)
def parse_chapter(self, response):
# 提取章节标题及内容
title = response.xpath('//h1/text()')
content = response.xpath('//div[@class="content"]/text()')
# 将结果保存到csv文件中
with open('chapter.csv', 'a', newline='') as f:
writer = csv.writer(f)
writer.writerow([title.extract_first(), content.extract_first()])
在上面的代码中,我们使用csv.writer()
方法创建一个名为chapter.csv
的文件,然后将提取的章节信息写入该文件。newline=''
表示不写入回车换行符。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python scrapy爬取小说代码案例详解 - Python技术站