04-机器学习-网页数据抓取
网络爬取(Web Scraping)深度指南
1. 网络爬取全流程设计
一个完整的网络爬取项目通常包含以下步骤:
-
目标分析:
- 明确需求:需要哪些数据(如商品价格、评论、图片)?
- 网站结构分析:使用浏览器开发者工具(F12)查看页面HTML结构,定位目标数据的CSS选择器或XPath。
- 反爬策略预判:检查目标网站的
robots.txt(如https://example.com/robots.txt),确认允许爬取的路径和频率限制。
-
技术选型:
- 静态页面:使用
Requests+Beautiful Soup。 - 动态页面(JavaScript渲染):使用
Selenium、Playwright或Scrapy-Splash。 - 大规模爬取:分布式框架如
Scrapy-Redis。
- 静态页面:使用
-
爬取与解析:
- 发送HTTP请求:模拟浏览器请求头(User-Agent、Cookies)。
- 解析HTML:提取数据字段(如价格、标题)。
- 分页处理:自动翻页或通过API获取下一页链接。
-
数据存储:
- 本地存储:CSV、JSON文件(适合小规模)。
- 数据库:MySQL(结构化数据)、MongoDB(非结构化数据)。
- 云存储:AWS S3、Google Cloud Storage(适合大规模数据)。
-
反反爬策略:
- 请求间隔:随机延迟(如
time.sleep(random.uniform(1, 5)))。 - IP代理池:使用付费服务(如BrightData)或自建代理。
- 浏览器指纹模拟:通过
fake_useragent库生成随机User-Agent。
- 请求间隔:随机延迟(如
2. 动态页面处理实战
以爬取动态加载的电商网站为例,使用 Selenium 和 Playwright:
# 使用Selenium(需安装ChromeDriver)
from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome()
driver.get("https://example.com/dynamic-page")
time.sleep(3) # 等待页面加载# 点击“加载更多”按钮
load_more_button = driver.find_element(By.CSS_SELECTOR, ".load-more")
load_more_button.click()
time.sleep(2)# 提取数据
products = driver.find_elements(By.CLASS_NAME, "product")
for product in products:name = product.find_element(By.CLASS_NAME, "name").textprice = product.find_element(By.CLASS_NAME, "price").textprint(f"商品: {name}, 价格: {price}")driver.quit()
# 使用Playwright(支持异步,效率更高)
from playwright.sync_api import sync_playwrightwith sync_playwright() as p:browser = p.chromium.launch()page = browser.new_page()page.goto("https://example.com/dynamic-page")# 模拟滚动加载for _ in range(3):page.evaluate("window.scrollTo(0, document.body.scrollHeight)")page.wait_for_timeout(2000)# 提取数据products = page.query_selector_all(".product")for product in products:name = product.query_selector(".name").inner_text()price = product.query_selector(".price").inner_text()print(f"商品: {name}, 价格: {price}")browser.close()
3. 应对反爬虫机制
| 反爬手段 | 应对策略 |
|---|---|
| IP封禁 | 使用代理IP池(免费代理需谨慎,推荐付费服务如Luminati)。 |
| 验证码 | 集成第三方验证码识别服务(如2Captcha),或使用OCR库(Tesseract)。 |
| 请求头检测 | 随机化User-Agent、Referer、Accept-Language等字段。 |
| 行为分析 | 模拟人类操作(随机点击、滚动页面、间歇性请求)。 |
| Honeypot陷阱 | 避免爬取隐藏链接(如CSS隐藏的display:none元素)。 |
代理IP示例:
import requestsproxies = {"http": "http://10.10.1.10:3128","https": "http://10.10.1.10:1080",
}
response = requests.get("https://example.com", proxies=proxies)
4. 数据清洗与存储优化
- 去噪与格式化:
import re def clean_price(price_str):# 从 "¥199.99" 中提取数字return float(re.sub(r"[^\d.]", "", price_str)) - 存储到数据库(以MongoDB为例):
from pymongo import MongoClient client = MongoClient("mongodb://localhost:27017/") db = client["scraped_data"] collection = db["products"] collection.insert_one({"name": "手机", "price": 1999})
5. 法律合规与伦理
- 遵守规则:
- 严格遵循
robots.txt中的Disallow规则。 - 避免爬取个人敏感信息(如身份证号、联系方式)。
- 严格遵循
- 伦理建议:
- 控制请求频率,防止对目标服务器造成负担。
- 在学术或商业用途中注明数据来源。
6. 实战案例:爬取豆瓣电影Top250
import requests
from bs4 import BeautifulSoupurl = "https://movie.douban.com/top250"
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.text, "html.parser")movies = soup.find_all("div", class_="item")
for movie in movies:title = movie.find("span", class_="title").textrating = movie.find("span", class_="rating_num").textprint(f"电影: {title}, 评分: {rating}")
输出示例:
电影: 肖申克的救赎, 评分: 9.7
电影: 霸王别姬, 评分: 9.6
...
7. 高级技巧与工具
- Scrapy中间件:自定义下载中间件处理请求和响应。
- 分布式爬虫:使用
Scrapy-Redis实现多节点协同爬取。 - Headless浏览器:通过无头模式提升性能(如
ChromeOptions().add_argument("--headless"))。
总结
网络爬取是一项强大但需谨慎使用的技术,关键在于:
- 技术实现:选择合适的工具应对静态/动态页面。
- 反反爬策略:灵活使用代理、请求头伪装和人类行为模拟。
- 合规性:尊重目标网站的规则和数据隐私。
通过系统化的流程设计和持续优化,可高效获取高质量数据,为机器学习、市场分析等场景提供坚实基础!
相关文章:
04-机器学习-网页数据抓取
网络爬取(Web Scraping)深度指南 1. 网络爬取全流程设计 一个完整的网络爬取项目通常包含以下步骤: 目标分析: 明确需求:需要哪些数据(如商品价格、评论、图片)?网站结构分析&…...
计网week1+2
计网 一.概念 1.什么是Internet 节点:主机及其运行的应用程序、路由器、交换机 边:通信链路,接入网链路主机连接到互联网的链路,光纤、网输电缆 协议:对等层的实体之间通信要遵守的标准,规定了语法、语义…...
重定向与缓冲区
4种重定向 我们有如下的代码: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h>#define FILE_NAME "log.txt"int main() {close(1)…...
练习题 - Django 4.x File 文件上传使用示例和配置方法
在现代的 web 应用开发中,文件上传是一个常见的功能,无论是用户上传头像、上传文档,还是其他类型的文件,处理文件上传都是开发者必须掌握的技能之一。Django 作为一个流行的 Python web 框架,提供了便捷的文件上传功能和配置方法。学习如何在 Django 中实现文件上传,不仅…...
[VSCode] vscode下载安装及安装中文插件详解(附下载链接)
VSCode 是一款由微软开发且跨平台的免费源代码编辑器;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能,并且内置了命令行工具和Git版本控制系统。 下载链接:https://pan.quark.cn/s/3a90aef4b645 提取码:NFy5 通过上面…...
JVM常见知识点
在《深入理解Java虚拟机》一书中,介绍了JVM的相关特性。 1、JVM的内存区域划分 在真实的操作系统中,对于地址空间进行了分区域的设计,由于JVM是仿照真实的机器进行设计的,那么也进行了分区域的设计。核心区域有四个,…...
深入探索 Vue 3 Markdown 编辑器:高级功能与实现
目录 1. 为什么选择 Markdown 编辑器?2. 选择合适的 Markdown 编辑器3. 安装与基本配置安装 配置 Markdown 编辑器代码说明 4. 高级功能实现4.1 实时预览与双向绑定4.2 插入图片和图像上传安装图像上传插件配置图像上传插件 4.3 数学公式支持安装 KaTeX配置 KaTeX 插…...
vscode无法格式化go代码的问题
CTRLshiftp 点击Go:Install/Update Tools 点击全选,OK!...
《Java程序设计》课程考核试卷
一、单项选择题(本大题共10个小题,每小题2分,共20分) 1.下列用来编译Java源文件为字节码文件的工具是( )。 A.java B.javadoc C.jar D.javac 2…...
one-hot (独热编码)
一、目的 假设我们现在需要对猫、 狗、 人这三个类别进行分类。 若以 0 代表猫, 以 1 代表狗, 以 2 代表人,会发现那么猫和狗之间距离为 1, 狗和人之间距离为 1, 而猫和人之间距离为 2。 假设真实标签是猫࿰…...
寒假1.23
题解 web:[极客大挑战 2019]Secret File(文件包含漏洞) 打开链接是一个普通的文字界面 查看一下源代码 发现一个链接,点进去看看 再点一次看看,没什么用 仔细看,有一个问题,当点击./action.ph…...
unity 粒子系统设置触发
1、勾选Triggers选项 2、将作为触发器的物体拉入队列当中,物体上必须挂载collider 3、将想要触发的方式(Inide、Outside、Enter和Exit)选择为”Callback“,其他默认为”Ignore“ 4、Collider Query Mode 设置为All:…...
【C++】类和对象(五)
1、初始化列表 作用:C提供了初始化列表语法,用来初始化属性。 语法: 构造函数():属性1(值1),属性2(值2)...{}示例: #include<i…...
超分辨率体积重建实现术前前列腺MRI和大病理切片组织病理学图像的3D配准
摘要: 磁共振成像(MRI)在前列腺癌诊断和治疗中的应用正在迅速增加。然而,在MRI上识别癌症的存在和范围仍然具有挑战性,导致即使是专家放射科医生在检测结果上也存在高度变异性。提高MRI上的癌症检测能力对于减少这种变异性并最大化MRI的临床效用至关重要。迄今为止,这种改…...
第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)
1.并发编程的三个重要特性 并发编程有三个至关重要的特性,分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中,要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断,要么所有的操作都不执行…...
[STM32 标准库]定时器输出PWM配置流程 PWM模式解析
前言: 本文内容基本来自江协,整理起来方便日后开发使用。MCU:STM32F103C8T6。 一、配置流程 1、开启GPIO,TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…...
web3py+flask+ganache的智能合约教育平台
最近在学习web3的接口文档,使用web3pyflaskganache写了一个简易的智能合约教育平台,语言用的是python,ganche直接使用的本地区块链网络,用web3py进行交互。 代码逻辑不难,可以私信或者到我的闲鱼号夏沫mds获取我的代码…...
< OS 有关 > 阿里云:轻量应用服务器 的使用 :轻量化 阿里云 vpm 主机
原因: < OS 有关 > 阿里云:轻量应用服务器 的使用 :从新开始 配置 SSH 主机名 DNS Tailscale 更新OS安装包 最主要是 清除阿里云客户端这个性能杀手-CSDN博客 防止 I/O 祸害系统 操作: 查看进程&#x…...
【技术】TensorRT 10.7 安装指南(Ubuntu22.04)
原文链接:https://mengwoods.github.io/post/tech/008-tensorrt-installation/ 本文安装的版本如下: Ubuntu 22.04 Nvidia Driver 538.78 CUDA 12.2 cuDNN 8.9.7 TensorRT 10.7 安装前的准备(可选) 在安装新版本之前…...
Linux 权限管理
hello!这里是敲代码的小董,很荣幸您阅读此文,本文只是自己在学习Linux过程中的笔记,如有不足,期待您的评论指点和关注,欢迎欢迎~~ ✨✨个人主页:敲代码的小董 💗💗系列专…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
