面对海量小说不知从何看起?不如写个爬虫让数据帮你决定
1. 准备工作:安装Scrapy并创建项目
首先,我们需要安装Scrapy框架。打开终端或命令提示符,执行以下命令:
pip install scrapy
安装完成后,验证是否成功安装:
scrapy version
接下来,创建一个Scrapy项目。假设我们的项目名为"qidian_spider":
scrapy startproject qidian_spider
cd qidian_spider
scrapy genspider novel www.qidian.com
这样,我们就创建了一个基本的Scrapy项目结构。
新手常踩的坑:在Windows系统上,有时会遇到依赖安装问题。建议使用conda install scrapy来避免这些麻烦。
2. 初识Scrapy:框架结构与工作原理
Scrapy就像一个高效的数字矿工,能自动遍历网页、提取数据。它的工作流程类似于餐厅运营:
- 引擎:前厅经理,负责协调各部门工作
- 调度器:排号系统,管理请求顺序
- 下载器:采购员,专门获取网页内容
- 爬虫:厨师,解析和提取所需数据
- Pipeline:服务员,负责数据存储
这种分工明确的架构,使得Scrapy能够高效地处理大量数据。官方数据显示,Scrapy每日可稳定处理2.1亿条数据,分布式部署后性能还能再提升300%!
3. 页面分析:找到目标数据所在位置
我们的目标是爬取起点中文网小说热销榜的数据,包括小说名称、作者、类型和形式。
打开起点中文网热销榜页面(https://www.qidian.com/rank/hotsales?style=1 ),按F12打开开发者工具,检查页面结构。
通过分析,我们发现:
- 每部小说都包裹在
<div class="book-mid-info">元素中 - 小说名称位于:
div[@class="book-mid-info"]/h4/a/text() - 作者位于:
div[@class="book-mid-info"]/p[1]/a[1]/text() - 类型位于:
div[@class="book-mid-info"]/p[1]/a[2]/text() - 形式(连载/完本)位于:
div[@class="book-mid-info"]/p[1]/span/text()
4. 代码实现:编写爬虫核心功能
接下来,我们在spiders/novel.py文件中实现爬虫功能:
# -*- coding: utf-8 -*-
import scrapy
from scrapy import Request
class NovelSpider(scrapy.Spider):
# 爬虫名称
name = 'novel'
# 设置允许的域名
allowed_domains = ['www.qidian.com']
# 起始URL列表
start_urls = ['https://www.qidian.com/rank/hotsales?style=1']
def parse(self, response):
# 使用xpath定位到小说内容的div元素,保存到列表中
list_selector = response.xpath("//div[@class='book-mid-info']")
# 依次读取每部小说的元素,从中获取名称、作者、类型和形式
for one_selector in list_selector:
# 获取小说名称
name = one_selector.xpath("h4/a/text()").extract_first()
# 获取作者
author = one_selector.xpath("p[1]/a[1]/text()").extract_first()
# 获取类型
novel_type = one_selector.xpath("p[1]/a[2]/text()").extract_first()
# 获取形式(连载/完本)
form = one_selector.xpath("p[1]/span/text()").extract_first()
# 将爬取到的一部小说保存到字典中
novel_info = {
"name": name, # 小说名称
"author": author, # 作者
"type": novel_type, # 类型
"form": form # 形式
}
# 使用yield返回字典
yield novel_info
# 分页处理:查找下一页链接
next_page = response.xpath("//a[@class='lbf-pagination-next']/@href").get()
if next_page:
# 构建完整的下一页URL
next_url = response.urljoin(next_page)
# 创建新的请求
yield Request(next_url, callback=self.parse)
这段代码虽然不长,但包含了很多Scrapy的核心概念:
parse方法是爬虫的核心,负责处理响应并提取数据xpath方法用于定位和提取网页中的特定内容extract_first()方法提取Selector对象中的第一个结果yield关键字用于逐步返回数据,节省内存
5. 配置设置:调整参数以应对反爬机制
在settings.py文件中,我们需要进行一些关键配置:
# 遵守robots.txt协议?学习期间设为False
ROBOTSTXT_OBEY = False
# 设置并发请求数
CONCURRENT_REQUESTS = 32
# 下载延迟,防止请求过快被封IP
DOWNLOAD_DELAY = 0.5
# 设置User-Agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
# 日志级别,只要错误信息
LOG_LEVEL = 'ERROR'
重要提示:爬虫程序不能频繁执行。网站一般都有反爬虫措施,如频繁执行会被认定是爬虫程序,网站就会封掉你的IP,禁止访问。
6. 运行爬虫:执行并保存结果
代码完成后,使用以下命令执行爬虫:
scrapy crawl novel -o novels.csv
这个命令会:
- 启动名为"novel"的爬虫
- 将爬取的数据保存到novels.csv文件中
- 自动处理分页,爬取多页内容
执行成功后,你会得到一个包含所有小说信息的CSV文件,可以用Excel打开查看。
7. 应对反爬:3招突破网站封锁
在爬取过程中,你可能会遇到各种反爬虫措施。以下是3个实用的应对技巧:
7.1 请求头伪装
网站通过User-Agent识别爬虫,我们可以使用fake-useragent库随机生成User-Agent:
from fake_useragent import UserAgent
ua = UserAgent()
headers = {'User-Agent': ua.random}
7.2 代理IP池配置
当频繁请求时,网站可能会封禁你的IP。使用代理IP池可以有效解决这个问题:
# 从Redis取代理
proxy = redis_client.rpop('proxy_pool')
request.meta['proxy'] = f'http://{proxy}'
7.3 动态内容处理
如果遇到JavaScript动态渲染的内容,可以使用Playwright中间件:
# 安装:pip install scrapy-playwright
# 在settings.py中添加:
PLAYWRIGHT_LAUNCH_OPTIONS = {'headless': True}
8. 数据处理:清洗与存储
获取数据只是第一步,我们还需要对数据进行清洗和存储。你可以在pipelines.py文件中实现数据清洗逻辑:
class QidianSpiderPipeline:
def process_item(self, item, spider):
# 清洗数据
if item['name']:
item['name'] = item['name'].strip()
if item['author']:
item['author'] = item['author'].strip()
# 这里可以添加更多清洗逻辑,如去除空白字符、格式化数据等
return item
然后,在settings.py中启用这个管道:
ITEM_PIPELINES = {
'qidian_spider.pipelines.QidianSpiderPipeline': 300,
}
9. 拓展功能:多页爬取与数据可视化
我们的爬虫现在已经可以爬取多页数据了,这要归功于分页处理代码。如果你想要爬取特定页数,可以修改start_urls:
start_urls = [
"https://www.qidian.com/rank/hotsales?style=1",
"https://www.qidian.com/rank/hotsales?style=1&page=2",
"https://www.qidian.com/rank/hotsales?style=1&page=3"
]
获取数据后,你还可以使用Echarts等可视化工具,搭建一个直观的小说数据分析平台,帮助更好地理解小说趋势和读者偏好。
10. 伦理与法律:负责任地爬取
在使用爬虫技术时,我们必须牢记:
- 尊重网站的
robots.txt规定 - 不要过度频繁请求,以免给网站服务器造成压力
- 仅将爬取数据用于学习和研究,而非商业用途
- 尊重版权,不要大规模复制受版权保护的内容
我曾因没发现用户URL规律,白写300行代码...所以强烈建议:先手动找规律,再动手编码!
结语:下一步学习方向
通过这个实战项目,你已经掌握了Scrapy爬虫的基本用法。但这只是开始,想要进一步提升,可以:
- 深入研究Scrapy源码,特别是调度器的实现
- 学习分布式爬虫,使用
scrapy-redis提升爬取效率 - 尝试智能解析,结合AI技术处理复杂页面
最重要的是,多动手实践!你可以尝试修改代码,爬取其他网站的数据,或者对获取的小说数据进行更深入的分析。
爬虫技术就像是数字世界的探险工具,让你能够发现隐藏在网络深处的宝藏。但请记住,能力越大,责任越大,一定要合法合规地使用这些技术!
64万+

被折叠的 条评论
为什么被折叠?



