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

devtools/2024/11/25 16:00:56/

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


案例 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)爬取实现代码

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

基础爬取实现:

python">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 提高效率。

python">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 模块模拟不同的浏览器。
python">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)爬取实现代码
python">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 的精度提升
python">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)代码实现
python">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 是一种统计方法,用于衡量一个词语在文本中与整个语料库中的重要性。以下代码实现从爬取的新闻正文中提取关键词。

python">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 是一种图模型算法,用于提取文本中的重要词语。

python">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 的新闻分类

python">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)关键词云

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

python">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 绘制情感分析结果的分布图。

python">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.ppmy.cn/devtools/136875.html

相关文章

Centos 8, add repo

Centos repo前言 Centos 8更换在线阿里云创建一键更换repo 自动化脚本 华为Centos 源 , 阿里云Centos 源 华为epel 源 , 阿里云epel 源vim /centos8_repo.sh #!/bin/bash # -*- coding: utf-8 -*- # Author: make.han

融合数据-决策管道:以决策为中心的学习组合优化

1 文章信息 文章名为Melding the Data-Decisions Pipeline: Decision-Focused Learning for Combinatorial Optimization 。发表在第33届AAAI Conference on Artificial Intelligence. 作者来自南加州大学。 2 摘要 在现实世界环境中产生影响力需要人工智能技术贯穿从数据到…

【Blender】用权重传递快速更换新模型

介绍&#xff1a;此功能类似于3Dmax中的蒙皮包裹功能 一、添加空顶点组 1、在物体模式下选择衣服&#xff0c;然后按Shift加选骨骼&#xff0c;按Ctrl P&#xff0c;并选择附带空顶点组 2、这样我们就把衣服也给骨骼蒙上了&#xff0c;但是由于只有空的顶点组&#xff0c;所以…

【贪心算法-第三弹——Leetcode-179.最大数】

1.题目解析 题目来源 测试用例 2.算法原理 3.实战代码 代码解析 *4.贪心策略的合理性证明(离散数学——全序关系) 完全性 反对称性 传递性 1.题目解析 题目来源 179.最大数——力扣 测试用例 2.算法原理 I.由题目我们知道需要返回将数组的所以数字组合形成的一个…

C#里怎么样快速地操作文本文件?

C#里怎么样快速地操作文本文件? 对于文本文件,在C#里有一种快速的方法。 它就是FileInfo类。 文本文件是一种平常使用的文件,比如XML文件,JSON文件,.ini配置文件等等。 操作文本文件的常用方法: AppendText() CreateText() OpenText() 这几个函数都是采用UTF-8编码来…

【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)

宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现&#xff0c;一个城市住宿服务设施种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的公共服务水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、各区…

BMP280 STM32 SPI 数据不变的问题

这里写自定义目录标题 BMP280 通过SPI与STM32通讯调试发现一个问题&#xff0c;设置为正常模式&#xff0c;但是循环读取时&#xff0c;数据不变。经搜索发现很多人遇到&#xff0c;有的甚至调试了半年搜索结果&#xff1a;读取完数据以后&#xff0c;两个方法 1. 往 0x74地址写…

Which Tasks Should Be Learned Together in Multi-task Learning? 译文

摘要 许多计算机视觉应用需要实时解决多个任务。可以使用多任务学习来训练神经网络同时解决多个任务。这可以节省推理时的计算量&#xff0c;因为只需要评估单个网络。不幸的是&#xff0c;这通常会导致整体性能较差&#xff0c;因为任务目标可能会相互竞争&#xff0c;从而提出…