Python爬虫基础教程(58)Python Scrapy爬虫框架实战:获取起点小说信息之项目实施:Python爬虫实战:一键爬取起点小说,让你告别书荒!

面对海量小说不知从何看起?不如写个爬虫让数据帮你决定

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技术处理复杂页面

最重要的是,多动手实践!你可以尝试修改代码,爬取其他网站的数据,或者对获取的小说数据进行更深入的分析。

爬虫技术就像是数字世界的探险工具,让你能够发现隐藏在网络深处的宝藏。但请记住,能力越大,责任越大,一定要合法合规地使用这些技术!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值