跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python大前端算法

Python 网络爬虫高级应用与 Scrapy 框架实战

Python 网络爬虫技术涵盖基础流程、Scrapy 框架使用、动态网页处理及反爬策略。内容详解 Scrapy 安装配置、中间件编写、Selenium 结合方案以及 Scrapy-Redis 分布式实现。通过豆瓣电影和淘宝商品案例演示数据提取与存储流程,提供完整的爬虫开发实践指南。

锁机制发布于 2026/3/23更新于 2026/8/2143 浏览
Python 网络爬虫高级应用与 Scrapy 框架实战

网络爬虫高级应用与 Scrapy 框架

学习目标与重点

学习目标:掌握 Python 网络爬虫的高级技巧,包括 Scrapy 框架、分布式爬虫、动态网页爬取、反爬虫策略等;学习 Scrapy、Selenium、BeautifulSoup 等库的使用;通过实战案例实现网络爬虫应用。

学习重点:Scrapy 框架、分布式爬虫、动态网页爬取、反爬虫策略、Selenium 库、BeautifulSoup 库、网络爬虫实战。

网络爬虫概述

什么是网络爬虫

网络爬虫(Web Crawler)是一种程序,用于自动访问网页并提取信息。网络爬虫的应用场景包括数据分析、搜索引擎、内容聚合等。

网络爬虫的流程

  • 发送请求:向网页发送 HTTP 请求。
  • 获取响应:获取网页的 HTML 内容。
  • 解析内容:提取网页中的信息。
  • 存储数据:将提取的信息存储到数据库或文件中。
  • 继续爬取:根据需要继续爬取其他网页。

Scrapy 框架

什么是 Scrapy

Scrapy 是一个用于爬取网站数据的开源 Python 框架。Scrapy 具有以下特点:

  • 高性能:异步处理请求,提高爬取速度。
  • 可扩展性:支持自定义中间件和管道。
  • 易用性:提供命令行工具和 Web 界面。

安装 Scrapy

pip install scrapy

创建 Scrapy 项目

scrapy startproject myspider
cd myspider
scrapy genspider example example.com

编写爬虫

# myspider/spiders/example.py
import scrapy

class ExampleSpider(scrapy.Spider):
    name = "example"
    allowed_domains = ["example.com"]
    start_urls = ["https://example.com"]

    def parse(self, response):
        # 提取标题
        title = response.css("title::text").get()
        yield {"title": title}

运行爬虫

scrapy crawl example -o output.json

动态网页爬取

使用 Selenium 爬取动态网页

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 初始化浏览器
driver = webdriver.Chrome()
# 访问网页
driver.get("https://example.com")
# 等待页面加载
time.sleep(5)
# 提取标题
title = driver.find_element(By.CSS_SELECTOR, "title").text
print(f"标题:{title}")
# 关闭浏览器
driver.quit()

使用 Scrapy 与 Selenium 结合

# myspider/spiders/dynamic_spider.py
import scrapy
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

class DynamicSpider(scrapy.Spider):
    name = "dynamic"
    allowed_domains = ["example.com"]
    start_urls = ["https://example.com"]

    def __init__(self):
        self.driver = webdriver.Chrome()

    def parse(self, response):
        # 使用 Selenium 访问网页
        self.driver.get(response.url)
        time.sleep(5)
        title = self.driver.find_element(By.CSS_SELECTOR, "title").text
        yield {"title": title}

    def closed(self, reason):
        self.driver.quit()

反爬虫策略

使用代理 IP

# myspider/middlewares.py
class ProxyMiddleware:
    def process_request(self, request, spider):
        request.meta["proxy"] = "http://127.0.0.1:8080"
# myspider/settings.py
DOWNLOADER_MIDDLEWARES = {
    "myspider.middlewares.ProxyMiddleware": 543,
}

使用 User-Agent 旋转

# myspider/middlewares.py
import random

class UserAgentMiddleware:
    user_agents = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
    ]

    def process_request(self, request, spider):
        request.headers["User-Agent"] = random.choice(self.user_agents)
# myspider/settings.py
DOWNLOADER_MIDDLEWARES = {
    "myspider.middlewares.UserAgentMiddleware": 543,
}

使用 Cookies 池

# myspider/middlewares.py
class CookiesMiddleware:
    cookies = [
        {"name": "session", "value": "123456"},
        {"name": "session", "value": "789012"},
    ]

    def process_request(self, request, spider):
        request.cookies = random.choice(self.cookies)
# myspider/settings.py
DOWNLOADER_MIDDLEWARES = {
    "myspider.middlewares.CookiesMiddleware": 543,
}

分布式爬虫

使用 Scrapy-Redis 实现分布式爬虫

安装 Scrapy-Redis
pip install scrapy-redis
配置 Scrapy-Redis
# myspider/settings.py
# 启用 Scrapy-Redis 调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 启用 Scrapy-Redis 去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 启用 Scrapy-Redis 存储
ITEM_PIPELINES = {
    "scrapy_redis.pipelines.RedisPipeline": 300,
}
# 配置 Redis 连接
REDIS_URL = "redis://127.0.0.1:6379/0"
编写爬虫
# myspider/spiders/distributed_spider.py
import scrapy
from scrapy_redis.spiders import RedisSpider

class DistributedSpider(RedisSpider):
    name = "distributed"
    allowed_domains = ["example.com"]
    redis_key = "distributed:start_urls"

    def parse(self, response):
        title = response.css("title::text").get()
        yield {"title": title}
运行爬虫
# 启动 Redis 服务器
redis-server
# 启动爬虫
scrapy runspider myspider/spiders/distributed_spider.py
# 向 Redis 添加起始 URL
redis-cli lpush distributed:start_urls https://example.com

实战案例:爬取豆瓣电影

需求分析

开发一个爬虫,爬取豆瓣电影 Top250 的信息,包括电影名称、评分、导演、演员、年份等。

代码实现

# myspider/spiders/douban_spider.py
import scrapy

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["movie.douban.com"]
    start_urls = ["https://movie.douban.com/top250"]

    def parse(self, response):
        # 提取电影信息
        movies = response.css(".item")
        for movie in movies:
            title = movie.css(".title::text").get()
            rating = movie.css(".rating_num::text").get()
            director = movie.css(".info .bd p:first-child::text").get()
            year = movie.css(".info .bd p:nth-child(2)::text").get()
            yield {
                "title": title,
                "rating": rating,
                "director": director,
                "year": year
            }
        # 提取下一页 URL
        next_page = response.css(".next a::attr(href)").get()
        if next_page:
            yield response.follow(next_page, self.parse)

运行爬虫

scrapy crawl douban -o douban_top250.json

实战案例:爬取淘宝商品

需求分析

开发一个爬虫,爬取淘宝商品的信息,包括商品名称、价格、销量、评价等。

代码实现

# myspider/spiders/taobao_spider.py
import scrapy
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

class TaobaoSpider(scrapy.Spider):
    name = "taobao"
    allowed_domains = ["taobao.com"]
    start_urls = ["https://www.taobao.com"]

    def __init__(self):
        self.driver = webdriver.Chrome()

    def parse(self, response):
        # 使用 Selenium 访问淘宝
        self.driver.get(response.url)
        time.sleep(5)
        # 搜索商品
        search_box = self.driver.find_element(By.CSS_SELECTOR, "#q")
        search_box.send_keys("Python")
        search_box.submit()
        time.sleep(5)
        # 提取商品信息
        products = self.driver.find_elements(By.CSS_SELECTOR, ".item.J_MouserOnverReq")
        for product in products:
            name = product.find_element(By.CSS_SELECTOR, ".title").text
            price = product.find_element(By.CSS_SELECTOR, ".price").text
            sales = product.find_element(By.CSS_SELECTOR, ".deal-cnt").text
            yield {
                "name": name,
                "price": price,
                "sales": sales
            }

    def closed(self, reason):
        self.driver.quit()

运行爬虫

scrapy crawl taobao -o taobao_products.json

总结

本文详细介绍了 Python 网络爬虫的高级技巧,包括 Scrapy 框架、分布式爬虫、动态网页爬取、反爬虫策略等;学习了 Scrapy、Selenium、BeautifulSoup 等库的使用;通过实战案例实现了爬取豆瓣电影和淘宝商品。

目录

  1. 网络爬虫高级应用与 Scrapy 框架
  2. 学习目标与重点
  3. 网络爬虫概述
  4. 什么是网络爬虫
  5. 网络爬虫的流程
  6. Scrapy 框架
  7. 什么是 Scrapy
  8. 安装 Scrapy
  9. 创建 Scrapy 项目
  10. 编写爬虫
  11. myspider/spiders/example.py
  12. 运行爬虫
  13. 动态网页爬取
  14. 使用 Selenium 爬取动态网页
  15. 初始化浏览器
  16. 访问网页
  17. 等待页面加载
  18. 提取标题
  19. 关闭浏览器
  20. 使用 Scrapy 与 Selenium 结合
  21. myspider/spiders/dynamic_spider.py
  22. 反爬虫策略
  23. 使用代理 IP
  24. myspider/middlewares.py
  25. myspider/settings.py
  26. 使用 User-Agent 旋转
  27. myspider/middlewares.py
  28. myspider/settings.py
  29. 使用 Cookies 池
  30. myspider/middlewares.py
  31. myspider/settings.py
  32. 分布式爬虫
  33. 使用 Scrapy-Redis 实现分布式爬虫
  34. 安装 Scrapy-Redis
  35. 配置 Scrapy-Redis
  36. myspider/settings.py
  37. 启用 Scrapy-Redis 调度器
  38. 启用 Scrapy-Redis 去重
  39. 启用 Scrapy-Redis 存储
  40. 配置 Redis 连接
  41. 编写爬虫
  42. myspider/spiders/distributed_spider.py
  43. 运行爬虫
  44. 启动 Redis 服务器
  45. 启动爬虫
  46. 向 Redis 添加起始 URL
  47. 实战案例:爬取豆瓣电影
  48. 需求分析
  49. 代码实现
  50. myspider/spiders/douban_spider.py
  51. 运行爬虫
  52. 实战案例:爬取淘宝商品
  53. 需求分析
  54. 代码实现
  55. myspider/spiders/taobao_spider.py
  56. 运行爬虫
  57. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 如何在 Ubuntu 20.04 或 22.04 上安装 Python 3
  • Python FastAPI 入门教程:从环境搭建到核心功能
  • Python 技术生态全景:Web 开发、数据科学与自动化实战
  • 6 款免费 AI 写作工具测评:网文创作与去重方案
  • MATLAB 实现基于 RRT-DNN 的无人机三维路径规划
  • 大模型分布式训练与高效调参实战
  • OpenCode + GitHub Copilot 打造 Claude Code 平替方案
  • 基于 7 系列 FPGA 实现万兆以太网通信
  • Coze 低代码搭建 AI 小程序入门指南
  • Video.js 与 WebRTC 实战:1 小时构建视频会议原型
  • 利用 B 站评论区数据构建大语言模型微调数据集
  • AI 绘画建筑设计提示词:从基础到高级的完整创作指南
  • AI 编程助手深度对比:OpenCode、Claude Code 与 Kimi Code CLI
  • DeepSeek 深度使用指南:提示词工程与本地知识库搭建
  • Rust、Go、Java、Python、Node.js 内存管理深度对比
  • Buzz:基于 Whisper 的离线语音转写工具,隐私安全有保障
  • 无项目经验如何转行 AIGC 产品经理:职责、技能与成长路径
  • Chrome 浏览器存在严重安全漏洞需立即更新
  • 深度解析 Qt 与 Python 混合架构:嵌入、交互与工程化实践
  • Qdrant 向量数据库与 Spring AI/LangChain4J 集成实践

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online