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

Trae CN IDE 中 PHP 开发的具体流程和配置指南

以下是 Trae CN IDE 中 PHP 开发的具体流程和配置指南,结合知识库内容和实际开发需求整理,并附实例说明: 一、安装与初始配置 1. 下载与安装 Trae IDE * 访问 Trae 官网 下载 macOS 或 Windows 版本。 * 安装完成后,启动 Trae,首次运行会进入初始化向导。 2. 初始设置 * 主题与语言:选择暗色/亮色主题,语言设为简体中文。 * 导入配置:从 VS Code 或 Cursor 导入插件、快捷键(保留原有习惯)。 * 登录账号:注册 GitHub/邮箱账号,解锁 AI 功能(如

OpenClaw gateway start 报 401 Invalid API key?一个环境变量的坑

今天折腾了半小时,终于搞明白为什么 openclaw gateway start 一直报 HTTP 401: Invalid API key,而 openclaw gateway run 却能正常工作。 记录一下,免得以后又踩。 问题现象 用 openclaw gateway run 前台运行,一切正常,能正常对话。 但换成 openclaw gateway start(systemd 后台服务),就报错: HTTP 401: Invalid API key 明明配置文件里 API key 写得好好的,为什么会这样? 原因分析 run 和 start 的区别: * run — 前台运行,

Spring Cloud+AI :实现分布式智能推荐系统

Spring Cloud+AI :实现分布式智能推荐系统

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” 引言 * 在当今数字化时代,推荐系统已成为电商平台、内容分发平台、社交网络等互联网产品的核心竞争力之一。从淘宝的"猜你喜欢"、抖音的精准内容推送,到 Netflix 的影视推荐,优秀的推荐系统不仅能显著提升用户留存率和转化率,更能为企业带来可观的商业价值。据统计,亚马逊约 35% 的销售额来自推荐系统,Netflix 则通过推荐算法为用户节省了每年约 10 亿美元的搜索成本。 * 然而,随着业务规模的增长和推荐算法的复杂化,传统的单体架构逐渐暴露出诸多瓶颈。首先,推荐系统涉及用户画像构建、实时行为收集、特征工程、模型推理等多个环节,单体应用难以应对日益复杂的业务逻辑;其次,推荐服务需要处理海量并发请求,单机部署无法满足弹性伸缩的需求;再者,AI 模型的迭代更新日益频繁,单体架构下模型部署往往需要重启整个应用,严重影响线上服务稳定性;最后,企业需要支持 A/B

企业级部署建议:Qwen3Guard-Gen-WEB权限控制设置

企业级部署建议:Qwen3Guard-Gen-WEB权限控制设置 在将Qwen3Guard-Gen-WEB这类高敏感度安全审核模型投入生产环境前,一个常被低估却至关重要的环节是——权限控制体系的构建。它不是锦上添花的附加配置,而是决定模型能否合规、可控、可持续运行的生命线。Qwen3Guard-Gen-WEB作为阿里开源的生成式安全审核模型,其核心能力在于对文本内容进行三级风险判定(安全/有争议/不安全)并输出可解释依据。但若缺乏严谨的访问控制,这一能力反而可能成为风险源:未授权人员误用导致误判扩散、恶意调用耗尽资源、敏感审核日志外泄引发合规危机……本文不讲模型原理,也不演示基础推理,而是聚焦于企业真实落地中最易踩坑、最需前置规划的环节——如何为Qwen3Guard-Gen-WEB构建一套稳健、可审计、符合等保与GDPR精神的权限控制机制。 1. 为什么Web界面更需要权限控制?——从便利性到风险敞口 Qwen3Guard-Gen-WEB的“一键启动+网页操作”设计极大降低了使用门槛,但恰恰是这种便利性,放大了权限失控的后果。我们来对比两种典型场景: * 无权限控制状态:1