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

Vivado完整license文件获取与配置指南

本文还有配套的精品资源,点击获取 简介:Vivado是由Xilinx开发的FPGA和SoC设计综合工具,支持Verilog、VHDL等硬件描述语言,提供高级综合、仿真、IP集成等功能。本资源包“Vivado_的license文件.zip”包含用于解锁Vivado完整功能的许可证文件。介绍了许可证服务器配置、.lic文件管理、浮动与固定许可证区别、激活流程、更新与诊断等核心内容。适用于FPGA开发者、嵌入式系统工程师及学习者,帮助其合法配置Vivado环境,提升开发效率和项目执行能力。 1. Vivado工具与FPGA开发环境概述 Xilinx Vivado设计套件是面向FPGA和SoC开发的集成化软件平台,广泛应用于通信、工业控制、人工智能、嵌入式视觉等多个高科技领域。其核心功能包括项目创建、综合、实现、仿真、调试及系统级集成,支持从设计输入到硬件验证的全流程开发。 Vivado不仅提供了图形化界面(GUI)便于初学者快速上手,还支持Tcl脚本自动化操作,满足高级用户的大规模工程管理需求。其模块化架构设计使得开发者可以灵活选择所需功能组件,如HLS(高层次综合)、IP In

By Ne0inhk
【讨论】VR + 具身智能 + 人形机器人:通往现实世界的智能接口

【讨论】VR + 具身智能 + 人形机器人:通往现实世界的智能接口

摘要:本文探讨了“VR + 具身智能 + 人形机器人”作为通往现实世界的智能接口的前沿趋势。文章从技术融合、应用场景、商业潜力三个维度分析其价值,涵盖工业协作、教育培训、医疗康复、服务陪护等领域,并展望VR赋能下的人机共生未来,揭示具身智能如何推动机器人真正理解、感知并参与现实世界。 VR + 具身智能 + 人形机器人:通往现实世界的智能接口 文章目录 * VR + 具身智能 + 人形机器人:通往现实世界的智能接口 * 一、引言:三股力量的融合,正在重塑现实世界 * 二、具身智能:让AI拥有“身体”的智慧 * 1. 什么是具身智能(Embodied Intelligence) * 2. 为什么VR是具身智能的“孵化器” * 三、VR + 具身智能 + 人形机器人:协同结构与原理 * 1. 系统组成 * 2. 人类的“

By Ne0inhk
Flutter 组件 bip340 适配鸿蒙 HarmonyOS 实战:次世代 Schnorr 签名,为鸿蒙 Web3 与隐私计算筑牢加密防线

Flutter 组件 bip340 适配鸿蒙 HarmonyOS 实战:次世代 Schnorr 签名,为鸿蒙 Web3 与隐私计算筑牢加密防线

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 bip340 适配鸿蒙 HarmonyOS 实战:次世代 Schnorr 签名,为鸿蒙 Web3 与隐私计算筑牢加密防线 前言 在鸿蒙(OpenHarmony)生态迈向去中心化金融(DeFi)、隐私通讯及安全资产管理等高阶安全场景的背景下,如何实现更高性能、更具扩展性且抗攻击能力的数字签名架构,已成为决定应用闭环安全性的“压舱石”。在鸿蒙设备这类强调分布式鉴权与芯片级安全(TEE/SE)的移动终端上,如果依然沿用传统的 ECDSA 签名算法,由于由于其固有的可延展性风险与高昂的聚合验证成本,极易由于由于在大规模节点验证时的 CPU 负载过高导致交互滞后。 我们需要一种能够实现签名线性聚合、计算逻辑极简且具备原生抗延展性的密码学方案。 bip340 为 Flutter 开发者引入了比特币 Taproot 升级的核心——Schnorr 签名算法。它不仅在安全性上超越了传统标准,更通过其线性的数学特性,

By Ne0inhk
《MySQL 表基础语法:从入门到熟练的核心技巧》

《MySQL 表基础语法:从入门到熟练的核心技巧》

前引:MySQL 表的增删查是数据库操作的基础,也是日常开发、数据分析中最高频的需求。很多初学者会卡在语法细节、场景适配或效率优化上,明明掌握了基础命令,实际应用中却频频出错。本文聚焦 “实用 + 避坑”,从核心语法到高频场景,再到优化技巧,帮你彻底吃透 MySQL 表增删查,告别 “只会用不会用对” 的尴尬 SQL查询中各个关键字的执行先后顺序: from > on> join > where > group by > with > having > select > distinct > order by > limit 目录 【一】增 (1)基本创建 (2)

By Ne0inhk