网络爬虫——爬虫项目案例

本节将全面讲解如何通过实战爬虫项目解决复杂问题。结合最新技术和实际开发需求,案例将涵盖完整开发流程,包括需求分析、实现代码、优化方法和常见问题解决。力求实现高效、可扩展的爬虫项目架构,帮助开发者提升实战能力。


案例 1:电商网站商品信息爬取

1.1 项目背景与目标

电商数据对于价格监控、市场调研有重要意义。本案例通过爬取某电商平台商品信息,实现以下目标:

  • 获取多类商品的基本信息(名称、价格、评价数、库存状态)
  • 支持大规模商品数据采集
  • 数据存储在 MySQL,并支持后续分析与处理

1.2 技术选型

  • HTTP 请求Requests
  • HTML 解析BeautifulSouplxml
  • 多线程与异步处理concurrent.futures + aiohttp
  • 数据库:MySQL 结合 SQLAlchemy ORM
  • 反爬技术:代理池 + 动态 User-Agent

1.3 实现步骤

(1)网站结构分析
  • 使用浏览器的开发者工具(F12)查看商品详情页 HTML 结构
  • 确定目标数据(如商品名称在 <div class="product-title"> 中)
(2)爬取实现代码

实现分为基础爬取和优化方案。

基础爬取实现:

import requests
from bs4 import BeautifulSoup
import pymysql# 数据库初始化
conn = pymysql.connect(host='localhost', user='root', password='password', database='ecommerce')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS products (id INT AUTO_INCREMENT PRIMARY KEY,name TEXT,price FLOAT,reviews INT,stock_status TEXT)
''')# 基本爬虫逻辑
def fetch_page(url):headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)soup = BeautifulSoup(response.content, "lxml")for product in soup.select('.product-item'):name = product.select_one('.product-title').text.strip()price = float(product.select_one('.product-price').text.strip('$'))reviews = int(product.select_one('.review-count').text.strip('reviews'))stock_status = product.select_one('.stock-status').text.strip()cursor.execute('''INSERT INTO products (name, price, reviews, stock_status)VALUES (%s, %s, %s, %s)''', (name, price, reviews, stock_status))conn.commit()fetch_page("https://example.com/products")
conn.close()

并发爬取优化: 通过 concurrent.futures 提高效率。

import concurrent.futures# 多线程爬取实现
def fetch_page_concurrent(urls):with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:results = executor.map(fetch_page, urls)url_list = [f"https://example.com/products?page={i}" for i in range(1, 101)]
fetch_page_concurrent(url_list)

(3)优化与扩展

反爬优化:

  • 代理池: 使用 requests 和代理池绕过 IP 封禁。
  • 动态 User-Agent: 通过 fake_useragent 模块模拟不同的浏览器。
from fake_useragent import UserAgentua = UserAgent()
headers = {"User-Agent": ua.random}

存储优化:

  • 将数据存储到 MongoDB,提升大数据量的读写性能。
  • 定期清洗重复数据,保持数据的高质量。

案例 2:社交媒体数据采集与情感分析

2.1 项目背景与目标

分析社交媒体数据(如 Twitter)有助于了解用户情绪和趋势。目标:

  • 爬取包含特定关键词的推文
  • 使用机器学习模型分析情感(正面、中性、负面)
  • 可视化结果并生成报告

2.2 技术选型

  • API 调用: 使用 Tweepy 访问 Twitter 数据
  • 情感分析: 使用 TextBlobVADER
  • 大数据存储与处理: MongoDB
  • 可视化: Matplotlib + Plotly

2.3 实现步骤

(1)Twitter API 设置

注册开发者账号,获取 API KeyAccess Token

(2)爬取实现代码
import tweepy
from pymongo import MongoClient
from textblob import TextBlob# API 认证
auth = tweepy.OAuthHandler("API_KEY", "API_SECRET")
auth.set_access_token("ACCESS_TOKEN", "ACCESS_SECRET")
api = tweepy.API(auth)# MongoDB 初始化
client = MongoClient("localhost", 27017)
db = client.twitter_data
collection = db.tweets# 爬取推文
def fetch_tweets(query, count=100):tweets = api.search_tweets(q=query, lang="en", count=count)for tweet in tweets:data = {"text": tweet.text,"user": tweet.user.screen_name,"date": tweet.created_at,"sentiment": TextBlob(tweet.text).sentiment.polarity}collection.insert_one(data)fetch_tweets("climate change")

(3)数据分析

情感分析模型对比:

  • 使用 TextBlob 进行简单情感分析
  • 对比使用 VADER 的精度提升
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzeranalyzer = SentimentIntensityAnalyzer()
text = "I love programming, but debugging is frustrating!"
score = analyzer.polarity_scores(text)
print(score)

数据可视化:

  • 使用 Matplotlib 绘制情感分布图。
  • 使用 Plotly 绘制交互式分析仪表盘。

(4)优化方向
  • 使用多进程提升爬取速度。
  • 增加更多自然语言处理(NLP)步骤,如关键词提取和话题分类。

案例 3:新闻爬取与智能分析

3.1 项目背景与目标

新闻爬虫可以为舆情分析、实时监控提供数据支持。本案例实现以下目标:

  • 爬取国内外新闻网站的标题、正文和发布时间
  • 提取热点关键词
  • 构建新闻分类模型,自动分类文章

3.2 实现步骤

(1)动态加载处理
  • 使用 Selenium 模拟浏览器行为,加载新闻列表页。
  • 结合 Requests 提高爬取速度。
(2)代码实现
from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("https://news.example.com")articles = []
for i in range(5):  # 模拟滚动加载driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")time.sleep(2)items = driver.find_elements(By.CLASS_NAME, "news-item")for item in items:title = item.find_element(By.TAG_NAME, "h2").textlink = item.find_element(By.TAG_NAME, "a").get_attribute("href")articles.append({"title": title, "link": link})
driver.quit()
(3)智能分析
  • 使用 SpaCy 提取文章关键词。
  • 通过 BERT 模型对新闻进行分类。

3.3 热点关键词提取

(1)基于 TF-IDF 的关键词提取

TF-IDF 是一种统计方法,用于衡量一个词语在文本中与整个语料库中的重要性。以下代码实现从爬取的新闻正文中提取关键词。

from sklearn.feature_extraction.text import TfidfVectorizer# 示例新闻数据
documents = ["Climate change is affecting weather patterns globally.","Technology advancements drive growth in the electric vehicle market.","Sports events have been delayed due to weather conditions."
]# 提取关键词
vectorizer = TfidfVectorizer(max_features=10, stop_words='english')
X = vectorizer.fit_transform(documents)
keywords = vectorizer.get_feature_names_out()print("关键词:", keywords)
(2)基于 TextRank 的关键词提取

TextRank 是一种图模型算法,用于提取文本中的重要词语。

import spacy
from spacy.lang.en.stop_words import STOP_WORDS
from collections import Counternlp = spacy.load("en_core_web_sm")def extract_keywords(doc):doc = nlp(doc)words = [token.text for token in doc if token.is_alpha and token.text.lower() not in STOP_WORDS]word_freq = Counter(words)return word_freq.most_common(5)news_article = "Artificial intelligence is revolutionizing industries, transforming business processes, and changing daily lives."
keywords = extract_keywords(news_article)print("关键词:", keywords)

3.4 新闻分类

(1)文本分类模型

使用机器学习算法(如逻辑回归、支持向量机)或深度学习(如 BERT)对新闻进行分类。

示例代码:基于 Naive Bayes 的新闻分类

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB# 数据集示例
news = [("Electric vehicles are the future of transportation.", "Technology"),("The recent hurricane caused severe damage.", "Weather"),("Football championships have been postponed.", "Sports"),("AI is transforming healthcare and automation.", "Technology"),("Rains are expected to increase flood risks.", "Weather")
]texts, labels = zip(*news)
vectorizer = CountVectorizer(stop_words='english')
X = vectorizer.fit_transform(texts)
y = labels# 训练分类模型
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = MultinomialNB()
model.fit(X_train, y_train)# 测试分类
sample_news = ["AI advancements in robotics", "Storms predicted for next week"]
sample_vectors = vectorizer.transform(sample_news)
predictions = model.predict(sample_vectors)print("分类结果:", predictions)

3.5 数据可视化与分析报告

爬取的数据通过分析后,可视化展示结果以提高洞察力。

(1)关键词云

关键词云可直观展示高频词汇。

from wordcloud import WordCloud
import matplotlib.pyplot as plttext = " ".join(documents)  # 文本合并
wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text)plt.figure(figsize=(10, 5))
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()
(2)情感分析分布

结合 Matplotlib 绘制情感分析结果的分布图。

import matplotlib.pyplot as plt# 示例情感分析结果
sentiments = [0.1, -0.4, 0.3, 0.5, -0.1]  # 正负情感分数plt.hist(sentiments, bins=5, color='blue', edgecolor='black')
plt.title("情感分布")
plt.xlabel("情感分数")
plt.ylabel("频率")
plt.show()

3.6 项目优化与扩展

(1)高效爬取优化
  • 异步爬取: 使用 aiohttp 实现大规模爬取,提升效率。
  • 增量爬取: 定期监控目标网站更新,只抓取新增内容。
(2)数据处理优化
  • 使用自然语言处理(NLP)技术提取实体(如人名、地名)。
  • 通过分类模型不断更新,支持更多领域的新闻。
(3)实时分析
  • 利用 Kafka 流式处理框架,结合 Spark 或 Flink,实现实时数据采集与分析。
  • 在仪表盘中动态展示新闻热点和情感趋势。

小结

本章的三个案例涵盖了从电商、社交媒体到新闻网站的爬取与分析,详细介绍了从基础爬取到高级数据处理与分析的全流程。在实际开发中,可以根据需求选择适合的技术栈和策略,实现高效爬虫项目。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/477117.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实时质检-静音检测分析流程(运维人员使用)

前言 用户在实时质检时&#xff0c;开启了主叫或被叫静音检测功能&#xff0c;但是听录音时&#xff0c;主叫或被叫明明没有任何声音&#xff0c;但是通话没有被挂断。 说明主叫或被叫的静音阈值太低&#xff0c;导致系统没有把很小的声音认定为静音&#xff1b;或者检测非静音…

MetaGPT实现多动作Agent

异步编程学习链接 智能体 LLM观察思考行动记忆 多智能体 智能体环境SOP评审路由订阅经济 教程地址 多动作的agent的本质是react&#xff0c;这包括了think&#xff08;考虑接下来该采取啥动作&#xff09;act&#xff08;采取行动&#xff09; 在MetaGPT的examples/write_…

【MySQL】MySQL数据库基础

【MySQL】MySQL数据库基础 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;MySQL&#x1f34b; &#x1f33c;文章目录&#x1f33c; 1. 数据库基础 1.1 什么是数据库 1.2 主流数据库 1.3 MySQL基本使用 1.3.1 服务器&#xff0c;数据…

进程控制(详解)

一.进程创建 1.fork函数 在linux中fork函数是⾮常重要的函数&#xff0c;它从已存在进程中创建⼀个新进程。新进程为⼦进程&#xff0c;⽽原进 程为⽗进程。 #include <unistd.h>pid_t fork(void);返回值&#xff1a;⾃进程中返回0&#xff0c;⽗进程返回⼦进程id&…

RFSOC 49dr 开发板,支持12收5发

硬件支持: 1,12收5发 2.4X25G光模块 3.J30J扩展接口 4.支持多板同步&#xff0c;多TILE同步

生产制造领域的多元化模式探索

在当今全球化和信息化的时代背景下&#xff0c;生产制造领域正经历着前所未有的变革。随着消费者需求的多样化、市场竞争的加剧以及技术的不断进步&#xff0c;传统的生产制造模式已经难以满足现代企业的需求。因此&#xff0c;多种生产制造模式应运而生&#xff0c;以适应不同…

基于YOLOv8深度学习的智慧农业果园果树苹果类果实目标检测系统(PyQt5界面+数据集+训练代码)

随着智慧农业技术的快速发展&#xff0c;果园管理逐渐向自动化和智能化方向迈进&#xff0c;传统的果园管理方式面临着高成本、效率低以及人工依赖程度大的挑战。在这种背景下&#xff0c;基于人工智能的目标检测技术为果园管理提供了一种全新的解决方案。本研究设计并实现了一…

【泥石流;风险;脆弱性;风险评估;川藏公路北线|论文解读4】川藏高速公路北线泥石流风险评估

【泥石流&#xff1b;风险&#xff1b;脆弱性&#xff1b;风险评估&#xff1b;川藏公路北线|论文解读4】川藏高速公路北线泥石流风险评估 【泥石流&#xff1b;风险&#xff1b;脆弱性&#xff1b;风险评估&#xff1b;川藏公路北线|论文解读4】川藏高速公路北线泥石流风险评…

mysql的优化

1、概念 在应用开发的初期&#xff0c;由于数据量较小&#xff0c;开发人员更重视功能上的实现&#xff0c;随着应用系统上线后&#xff0c;数据量急剧增长&#xff0c;很多性能问题逐渐显现&#xff0c;对使用的影响也越来越大&#xff0c;此时这些问题语句就称为整个系统的性…

栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历

目录 力扣394.字符串解码 力扣946.验证栈序列 力扣429.N叉树的层序遍历 力扣103.二叉树的锯齿形层序遍历 力扣394.字符串解码 看见括号&#xff0c;由内而外&#xff0c;转向用栈解决。使用两个栈处理&#xff0c;一个用String,一个用Integer 遇到数字:提取数字放入到数字栈…

【Python系列】 Base64 编码:使用`base64`模块

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Mac 修改默认jdk版本

当前会话生效 这里演示将 Java 17 版本降低到 Java 8 查看已安装的 Java 版本&#xff1a; 在终端&#xff08;Terminal&#xff09;中运行以下命令&#xff0c;查看已安装的 Java 版本列表 /usr/libexec/java_home -V设置默认 Java 版本&#xff1a; 找到 Java 8 的安装路…

C++ STL - vector/list讲解及迭代器失效

vector 使用 vector 是一个动态数组. 构造/拷贝构造/赋值重载函数 int main() {// 是一个模板, 在实例化的时候, 需要指明类型std::vector<int> first; // 一个空的数组std::vector<int> second (4,100); // 设置初始空间大小为 4 个int, 全部初始化为 100std::v…

libphone desktop编译

linphone-desktop 在ubuntu20.04 下编译 linphone 介绍 Linphone是一款遵循GPL的开源网络视频电话系统&#xff0c;支持多种平台如Windows、Linux、Android等。它基于SIP协议&#xff0c;提供语音、视频通话及即时文本消息功能。核心功能包括SIP用户代理、音频视频Codec支持、…

根据已知站点寻找路网的最短路径

背景 接上期&#xff0c;基于MATSim的交通仿真&#xff0c;其中有一块非常重要的就是公交的仿真&#xff0c;这也是当初选择MATSim技术路线的一个重要原因&#xff0c;现在业务给出的场景是上传一些有序站点及其经纬度&#xff0c;需要通过算法来适配对应的路网&#xff0c;由…

Jenkins + gitee 自动触发项目拉取部署(Webhook配置)

目录 前言 Generic Webhook Trigger 插件 下载插件 ​编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建&#xff0c;本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目&#xff1b; Generic Webhook Trigger 插件 实现代码推送后&#xff0c;触…

leetcode 919.完全二叉树插入器

1.题目要求: 完全二叉树 是每一层&#xff08;除最后一层外&#xff09;都是完全填充&#xff08;即&#xff0c;节点数达到最大&#xff09;的&#xff0c;并且所有的节点都尽可能地集中在左侧。设计一种算法&#xff0c;将一个新节点插入到一棵完全二叉树中&#xff0c;并在…

SSL协议

文章目录 1. 前言2. 基础概念3. SSL协议结构3.1 概述3.2 SSL握手协议3.3 修改密码说明协议3.4 报警协议3.5 SSL记录协议 4. SSL安全性4.1 安全机制分析4.2 脆弱性分析 5. SSL证书 1. 前言 参考《应用系统安全基础》 2. 基础概念 安全套接字层协议&#xff08;Security Socke…

Flink-Source的使用

Data Sources 是什么呢&#xff1f;就字面意思其实就可以知道&#xff1a;数据来源。 Flink 做为一款流式计算框架&#xff0c;它可用来做批处理&#xff0c;也可以用来做流处理&#xff0c;这个 Data Sources 就是数据的来源地。 flink在批/流处理中常见的source主要有两大类…

Linux线程_线程控制_线程库

一.线程控制 在Linux操作系统的视角&#xff0c;Linux下没有真正意义上的线程&#xff0c;而是用进程模拟的线程&#xff08;LWP&#xff09;。所以&#xff0c;Linux不会提供直接创建线程的系统调用&#xff0c;而是提供创建轻量级进程的接口。但是由于用户只认线程&#xff0…