Python开发从入门到精通:网络爬虫高级应用与Scrapy框架

Python开发从入门到精通:网络爬虫高级应用与Scrapy框架

《Python开发从入门到精通》设计指南第三十九篇:网络爬虫高级应用与Scrapy框架

在这里插入图片描述

一、学习目标与重点

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

39.1 网络爬虫概述

39.1.1 什么是网络爬虫

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

39.1.2 网络爬虫的流程

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

39.2 Scrapy框架

39.2.1 什么是Scrapy

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

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

39.2.2 安装Scrapy

pip install scrapy 

39.2.3 创建Scrapy项目

scrapy startproject myspider cd myspider scrapy genspider example example.com 

39.2.4 编写爬虫

# myspider/spiders/example.pyimport scrapy classExampleSpider(scrapy.Spider): name ="example" allowed_domains =["example.com"] start_urls =["https://example.com"]defparse(self, response):# 提取标题 title = response.css("title::text").get()yield{"title": title}

39.2.5 运行爬虫

scrapy crawl example -o output.json 

39.3 动态网页爬取

39.3.1 使用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()

39.3.2 使用Scrapy与Selenium结合

# myspider/spiders/dynamic_spider.pyimport scrapy from selenium import webdriver from selenium.webdriver.common.by import By import time classDynamicSpider(scrapy.Spider): name ="dynamic" allowed_domains =["example.com"] start_urls =["https://example.com"]def__init__(self): self.driver = webdriver.Chrome()defparse(self, response):# 使用Selenium访问网页 self.driver.get(response.url) time.sleep(5) title = self.driver.find_element(By.CSS_SELECTOR,"title").text yield{"title": title}defclosed(self, reason): self.driver.quit()

39.4 反爬虫策略

39.4.1 使用代理IP

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

39.4.2 使用User-Agent旋转

# myspider/middlewares.pyimport random classUserAgentMiddleware: 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",]defprocess_request(self, request, spider): request.headers["User-Agent"]= random.choice(self.user_agents)# myspider/settings.py DOWNLOADER_MIDDLEWARES ={"myspider.middlewares.UserAgentMiddleware":543,}

39.4.3 使用Cookies池

# myspider/middlewares.pyclassCookiesMiddleware: cookies =[{"name":"session","value":"123456"},{"name":"session","value":"789012"},]defprocess_request(self, request, spider): request.cookies = random.choice(self.cookies)# myspider/settings.py DOWNLOADER_MIDDLEWARES ={"myspider.middlewares.CookiesMiddleware":543,}

39.5 分布式爬虫

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

39.5.1.1 安装Scrapy-Redis
pip install scrapy-redis 
39.5.1.2 配置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"
39.5.1.3 编写爬虫
# myspider/spiders/distributed_spider.pyimport scrapy from scrapy_redis.spiders import RedisSpider classDistributedSpider(RedisSpider): name ="distributed" allowed_domains =["example.com"] redis_key ="distributed:start_urls"defparse(self, response): title = response.css("title::text").get()yield{"title": title}
39.5.1.4 运行爬虫
# 启动Redis服务器 redis-server # 启动爬虫 scrapy runspider myspider/spiders/distributed_spider.py # 向Redis添加起始URL redis-cli lpush distributed:start_urls https://example.com 

39.6 实战案例:爬取豆瓣电影

39.6.1 需求分析

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

39.6.2 代码实现

# myspider/spiders/douban_spider.pyimport scrapy classDoubanSpider(scrapy.Spider): name ="douban" allowed_domains =["movie.douban.com"] start_urls =["https://movie.douban.com/top250"]defparse(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)

39.6.3 运行爬虫

scrapy crawl douban -o douban_top250.json 

39.7 实战案例:爬取淘宝商品

39.7.1 需求分析

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

39.7.2 代码实现

# myspider/spiders/taobao_spider.pyimport scrapy from selenium import webdriver from selenium.webdriver.common.by import By import time classTaobaoSpider(scrapy.Spider): name ="taobao" allowed_domains =["taobao.com"] start_urls =["https://www.taobao.com"]def__init__(self): self.driver = webdriver.Chrome()defparse(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 }defclosed(self, reason): self.driver.quit()

39.7.3 运行爬虫

scrapy crawl taobao -o taobao_products.json 

总结

✅ 本文详细介绍了Python网络爬虫的高级技巧,包括Scrapy框架、分布式爬虫、动态网页爬取、反爬虫策略等;学习了Scrapy、Selenium、BeautifulSoup等库的使用;通过实战案例实现了爬取豆瓣电影和淘宝商品。
✅ 建议读者在学习过程中多练习,通过编写代码加深对知识点的理解。

Read more

必收藏!小白也能懂:Agent、Skills、MCP和A2A大模型架构完全指南

必收藏!小白也能懂:Agent、Skills、MCP和A2A大模型架构完全指南

文章详解AI Agent四大核心概念:Agent作为智能决策主体,Skills提供原子化能力封装,MCP实现标准化工具调用,A2A支持Agent间协作。这些技术共同构建了从单Agent自主执行到多Agent协同工作的完整技术栈,解决了智能体的自主性、模块化能力、工具调用和互操作等核心问题,助力开发者快速构建专业级AI应用。 一、Agent、Skills、MCP和A2A的核心概念总览 1、Agent (代理/智能体):自主决策与执行的“大脑”。 AI Agent是2026年AI生态的核心概念,是基于人工智能技术构建的、具备感知环境、理解信息、自主推理决策、自主规划与执行动作并持续与环境/其他主体交互,以自主达成预设或动态生成目标的数字智能实体。2026年的智能体不是在回答问题,而是在完成任务。其突破了传统问答式、生成式AI的能力边界,可像人类员工一样独立处理复杂综合性任务。它以大模型为核心引擎,整合规划、记忆、工具调用与行动执行四大能力,形成「感知 - 认知 - 决策 - 执行 - 反馈」的完整智能闭环,

By Ne0inhk
为什么我的OpenClaw安装后无法启动?Gateway服务故障排查全攻略

为什么我的OpenClaw安装后无法启动?Gateway服务故障排查全攻略

为什么我的OpenClaw安装后无法启动?Gateway服务故障排查全攻略 1. 引言 OpenClaw是一款功能强大的自动化工具,但其安装和运行依赖于多个服务组件,其中Gateway服务是核心组件之一。如果Gateway服务无法启动,整个OpenClaw系统将无法正常运行。本文将详细介绍OpenClaw安装后无法启动的常见原因及故障排查方法,帮助你快速定位并解决问题。 2. Gateway服务简介 Gateway服务是OpenClaw的核心组件,负责: * 处理所有API请求 * 管理服务间的通信 * 提供认证和授权 * 处理负载均衡 * 监控系统状态 因此,Gateway服务的正常运行对于OpenClaw至关重要。 3. 常见故障原因 3.1 端口冲突 症状:Gateway服务启动失败,提示端口被占用 原因: * 其他应用正在使用Gateway服务的默认端口(通常为3000) * 之前的OpenClaw进程未完全关闭 解决方案: 1. 查看端口占用情况:

By Ne0inhk
MySQL 内置函数指南:日期、字符串、数学函数实战

MySQL 内置函数指南:日期、字符串、数学函数实战

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 日期函数:处理时间相关需求 * 1.1 核心日期函数表 * 1.2 实战案例 * 1.2.1 基础时间获取 * 1.2.2 日期加减运算 * 1.2.3 日期差计算与时间提取 * 1.2.4 业务场景:查询近期数据 * 二. 字符串函数:处理文本数据 * 2.1 核心字符串函数表 * 2.2 实战案例 * 2.2.

By Ne0inhk

Spring Boot 自定义错误页面:404/500 页面定制与 ErrorController

Spring Boot 自定义错误页面:404/500 页面定制与 ErrorController 一、引言 当用户访问一个不存在的链接或服务器内部发生错误时,他们会看到一个冰冷、晦涩的默认错误页面(如 Whitelabel Error Page)。这不仅是一个糟糕的用户体验,还可能暴露不必要的服务器内部信息。在生产环境中,提供一个定制的、友好的错误页面是至关重要的。 Spring Boot 为此提供了一套强大且灵活的错误处理机制。这套机制的核心是 BasicErrorController,它是一个默认的 MVC 控制器,专门用于处理 /error 路径的请求。开发者可以通过多种方式来定制这套机制: 1. 自定义错误页面:对于使用 Thymeleaf、FreeMarker 等传统视图技术的 Web 应用,可以简单地在静态资源或模板目录下放置错误页面文件(如 404.html)。 2. 自定义 ErrorController:当需要更精细的控制,例如为

By Ne0inhk