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

【宠物识别系统】Python+深度学习+人工智能+算法模型+图像识别+TensorFlow+2026计算机毕设项目

【宠物识别系统】Python+深度学习+人工智能+算法模型+图像识别+TensorFlow+2026计算机毕设项目

项目介绍 本项目是一个基于深度学习的宠物识别系统,旨在实现对猫和狗的自动识别与分类。系统采用前后端分离架构,前端使用Vue3+Element Plus构建用户友好的交互界面,后端基于Flask框架提供高效的API服务,核心识别算法采用TensorFlow深度学习框架和ResNet50卷积神经网络模型。 选题背景与意义 随着人工智能技术的快速发展,图像识别在各个领域的应用越来越广泛。宠物作为人们生活中的重要伴侣,对宠物进行自动化识别具有重要的实用价值和研究意义。传统的宠物识别方法主要依赖人工判断,效率低下且准确性难以保证,而基于深度学习的图像识别技术为解决这一问题提供了新的思路。 关键技术栈:ResNet50 ResNet50是由微软研究院提出的深度卷积神经网络模型,是ResNet(Residual Network)系列中的经典模型之一。该模型通过引入残差连接(Residual Connection)机制,有效解决了深度神经网络中的梯度消失和梯度爆炸问题,使得网络可以构建得更深,从而显著提升了图像识别的准确性。 ResNet50模型包含50层卷积和全连接层,主要由输入层、

By Ne0inhk

高效后台截图】Python 实现现代游戏窗口无闪烁、高性能 DX11/DX12 截图方案(附DLL资源)

🎮【高效后台截图】Python 实现现代游戏窗口无闪烁、高性能 DX11/DX12 截图方案(附DLL资源) 关键词:Python 游戏截图、DXGI 后台截图、无边框窗口捕获、DirectX 11/12 截图、高性能屏幕录制、Windows 游戏自动化、Python + DXGI、dxgi4py.dll 💡 为什么普通截图方式对现代游戏“失效”? 在 Windows 平台上,很多现代游戏(尤其是使用 DirectX 11/12 或 Vulkan 渲染的游戏)会启用 硬件加速 和 独占全屏模式。传统的截图方法(如 PIL.ImageGrab、pyautogui.screenshot() 或 cv2.

By Ne0inhk
流处理、实时分析与RAG驱动的Python ETL框架:构建智能数据管道(上)

流处理、实时分析与RAG驱动的Python ETL框架:构建智能数据管道(上)

第一章:引言:数据处理的范式革命与Python的崛起 1.1 数据处理范式的演进:从批处理到实时智能 * 批处理时代(ETL 1.0):T+1模式,Hadoop/MapReduce主导,数据价值滞后,决策延迟显著。Python在脚本化、数据清洗环节崭露头角(Pandas, NumPy)。 * 流处理兴起(ETL 2.0):Kafka, Storm, Spark Streaming等推动“准实时”处理,满足监控、告警等场景。Python通过PySpark、Faust等库开始涉足流处理。 * 实时分析时代(ETL 3.0):Flink, Kafka Streams等实现毫秒级延迟,支持复杂事件处理(CEP)、实时仪表盘、在线机器学习。Python生态(Apache Beam Python

By Ne0inhk
使用 Miniforge3 管理 Python 环境的详细指南(基于最新实践和时效性信息,截至 2025 年)

使用 Miniforge3 管理 Python 环境的详细指南(基于最新实践和时效性信息,截至 2025 年)

以下是使用 Miniforge3 管理 Python 环境的详细指南(基于最新实践和时效性信息,截至 2025 年): 一、Miniforge3 简介 Miniforge3 是一个轻量级 Conda 环境管理工具,默认使用 conda-forge 软件源(社区维护的包更全且更新更快),尤其适配 ARM 架构(如 Apple M1/M2/M3 芯片)。相比 Anaconda,它更精简且兼容性更好。 二、安装步骤 1. 下载安装包 安装最新的 Mamba,建议通过安装 Miniforge 来实现,Miniforge 默认包含 Mamba * 推荐镜像源 * 南京大学镜像站 * 清华大学开源软件镜像站(https://mirrors.tuna.

By Ne0inhk