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

Qwen-Image与Stable Diffusion对比优劣分析

Qwen-Image与Stable Diffusion对比优劣分析 在AI生成图像的世界里,我们早已过了“能画出来就行”的时代。👏 从前只要模型能凭空变出一只猫、一座山,大家就惊叹连连;而现在,用户想要的是——“请生成一位穿汉服的女子,在苏州园林的月洞门前回眸,背景有细雨和灯笼,光影柔和,风格类似宋代工笔画”。🌧️🎨 这时候,光靠“运气”可不行了。你得有个真正懂语言、会构图、能编辑、还支持中文的硬核选手上场。 于是,Qwen-Image来了。它不像传统文生图模型那样只是“看图说话”,更像是一个全栈视觉创作大脑。而另一边,Stable Diffusion依然是那个开源界的劳模——灵活、轻便、社区强大,但面对越来越精细的需求,也开始显得有点“力不从心”。 那这两位到底谁更强?我们不玩虚的,直接拆开架构、代码、应用场景,一条条掰扯清楚。 架构之争:Transformer vs UNet,谁才是未来? 先说个大趋势:

By Ne0inhk
【教程】如何在WSL2:Ubuntu上部署llama.cpp

【教程】如何在WSL2:Ubuntu上部署llama.cpp

WSL2:Ubuntu部署llama.cpp llama.cpp 是一个完全由 C 与 C++ 编写的轻量级推理框架,支持在 CPU 或 GPU 上高效运行 Meta 的 LLaMA 等大语言模型(LLM),设计上尽可能减少外部依赖,能够轻松在多种后端与平台上运行。 安装llama.cpp 下面我们采用本地编译的方法在设备上安装llama.cpp 克隆llama.cpp仓库 在wsl中打开终端: git clone https://github.com/ggml-org/llama.cpp cd llama.cpp 编译项目 编译项目前,先安装所需依赖项: sudoapt update sudoaptinstall -y build-essential cmake git#

By Ne0inhk
OpenCode 踩坑记:GitHub Copilot 按次计费?我的账单为何暴涨 3 倍!

OpenCode 踩坑记:GitHub Copilot 按次计费?我的账单为何暴涨 3 倍!

从发现问题到深度分析,一篇文章搞懂 OpenCode + GitHub Copilot 的正确打开方式 🌟 前言:一个意外的"惊喜" 进入2026年,朋友圈和技术群里都在讨论一个新的AI开发工具 —— OpenCode,号称是 AI 编程助手的"终极形态",支持 GitHub Copilot、Claude、GPT-4 等多种模型,还能自动执行多步任务。 作为一个爱折腾的程序员,我立马下载试用。我有 GitHub Copilot 企业订阅,而且OpenCode还支持,用起来应该不花钱吧? 结果一周后,我收到了公司 IT 部门的"温馨提醒" 📧: “您的 Copilot 使用量是团队平均水平的 3 倍,请注意合理使用…” 什么情况??我明明只是让

By Ne0inhk