当前位置: 首页 > news >正文

04-机器学习-网页数据抓取


网络爬取(Web Scraping)深度指南

1. 网络爬取全流程设计

一个完整的网络爬取项目通常包含以下步骤:

  1. 目标分析

    • 明确需求:需要哪些数据(如商品价格、评论、图片)?
    • 网站结构分析:使用浏览器开发者工具(F12)查看页面HTML结构,定位目标数据的CSS选择器或XPath。
    • 反爬策略预判:检查目标网站的robots.txt(如 https://example.com/robots.txt),确认允许爬取的路径和频率限制。
  2. 技术选型

    • 静态页面:使用Requests + Beautiful Soup
    • 动态页面(JavaScript渲染):使用SeleniumPlaywrightScrapy-Splash
    • 大规模爬取:分布式框架如Scrapy-Redis
  3. 爬取与解析

    • 发送HTTP请求:模拟浏览器请求头(User-Agent、Cookies)。
    • 解析HTML:提取数据字段(如价格、标题)。
    • 分页处理:自动翻页或通过API获取下一页链接。
  4. 数据存储

    • 本地存储:CSV、JSON文件(适合小规模)。
    • 数据库:MySQL(结构化数据)、MongoDB(非结构化数据)。
    • 云存储:AWS S3、Google Cloud Storage(适合大规模数据)。
  5. 反反爬策略

    • 请求间隔:随机延迟(如time.sleep(random.uniform(1, 5)))。
    • IP代理池:使用付费服务(如BrightData)或自建代理。
    • 浏览器指纹模拟:通过fake_useragent库生成随机User-Agent。

2. 动态页面处理实战

以爬取动态加载的电商网站为例,使用 SeleniumPlaywright

# 使用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"))。

总结

网络爬取是一项强大但需谨慎使用的技术,关键在于:

  1. 技术实现:选择合适的工具应对静态/动态页面。
  2. 反反爬策略:灵活使用代理、请求头伪装和人类行为模拟。
  3. 合规性:尊重目标网站的规则和数据隐私。

通过系统化的流程设计和持续优化,可高效获取高质量数据,为机器学习、市场分析等场景提供坚实基础!

相关文章:

04-机器学习-网页数据抓取

网络爬取(Web Scraping)深度指南 1. 网络爬取全流程设计 一个完整的网络爬取项目通常包含以下步骤: 目标分析: 明确需求:需要哪些数据(如商品价格、评论、图片)?网站结构分析&…...

计网week1+2

计网 一.概念 1.什么是Internet 节点:主机及其运行的应用程序、路由器、交换机 边:通信链路,接入网链路主机连接到互联网的链路,光纤、网输电缆 协议:对等层的实体之间通信要遵守的标准,规定了语法、语义…...

重定向与缓冲区

4种重定向 我们有如下的代码&#xff1a; #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 是一款由微软开发且跨平台的免费源代码编辑器&#xff1b;该软件支持语法高亮、代码自动补全、代码重构、查看定义功能&#xff0c;并且内置了命令行工具和Git版本控制系统。 下载链接&#xff1a;https://pan.quark.cn/s/3a90aef4b645 提取码&#xff1a;NFy5 通过上面…...

JVM常见知识点

在《深入理解Java虚拟机》一书中&#xff0c;介绍了JVM的相关特性。 1、JVM的内存区域划分 在真实的操作系统中&#xff0c;对于地址空间进行了分区域的设计&#xff0c;由于JVM是仿照真实的机器进行设计的&#xff0c;那么也进行了分区域的设计。核心区域有四个&#xff0c;…...

深入探索 Vue 3 Markdown 编辑器:高级功能与实现

目录 1. 为什么选择 Markdown 编辑器&#xff1f;2. 选择合适的 Markdown 编辑器3. 安装与基本配置安装 配置 Markdown 编辑器代码说明 4. 高级功能实现4.1 实时预览与双向绑定4.2 插入图片和图像上传安装图像上传插件配置图像上传插件 4.3 数学公式支持安装 KaTeX配置 KaTeX 插…...

vscode无法格式化go代码的问题

CTRLshiftp 点击Go:Install/Update Tools 点击全选&#xff0c;OK&#xff01;...

《Java程序设计》课程考核试卷

一、单项选择题&#xff08;本大题共10个小题&#xff0c;每小题2分&#xff0c;共20分&#xff09; 1.下列用来编译Java源文件为字节码文件的工具是&#xff08; &#xff09;。 A.java B.javadoc C.jar D.javac 2…...

one-hot (独热编码)

一、目的 假设我们现在需要对猫、 狗、 人这三个类别进行分类。 若以 0 代表猫&#xff0c; 以 1 代表狗&#xff0c; 以 2 代表人&#xff0c;会发现那么猫和狗之间距离为 1&#xff0c; 狗和人之间距离为 1&#xff0c; 而猫和人之间距离为 2。 假设真实标签是猫&#xff0…...

寒假1.23

题解 web&#xff1a;[极客大挑战 2019]Secret File&#xff08;文件包含漏洞&#xff09; 打开链接是一个普通的文字界面 查看一下源代码 发现一个链接&#xff0c;点进去看看 再点一次看看&#xff0c;没什么用 仔细看&#xff0c;有一个问题&#xff0c;当点击./action.ph…...

unity 粒子系统设置触发

1、勾选Triggers选项 2、将作为触发器的物体拉入队列当中&#xff0c;物体上必须挂载collider 3、将想要触发的方式&#xff08;Inide、Outside、Enter和Exit&#xff09;选择为”Callback“&#xff0c;其他默认为”Ignore“ 4、Collider Query Mode 设置为All&#xff1a…...

【C++】类和对象(五)

1、初始化列表 作用&#xff1a;C提供了初始化列表语法&#xff0c;用来初始化属性。 语法&#xff1a; 构造函数&#xff08;&#xff09;&#xff1a;属性1&#xff08;值1&#xff09;&#xff0c;属性2&#xff08;值2&#xff09;...{}示例&#xff1a; #include<i…...

超分辨率体积重建实现术前前列腺MRI和大病理切片组织病理学图像的3D配准

摘要: 磁共振成像(MRI)在前列腺癌诊断和治疗中的应用正在迅速增加。然而,在MRI上识别癌症的存在和范围仍然具有挑战性,导致即使是专家放射科医生在检测结果上也存在高度变异性。提高MRI上的癌症检测能力对于减少这种变异性并最大化MRI的临床效用至关重要。迄今为止,这种改…...

第13章 深入volatile关键字(Java高并发编程详解:多线程与系统设计)

1.并发编程的三个重要特性 并发编程有三个至关重要的特性&#xff0c;分别是原子性、有序性和可见性 1.1 原子性 所谓原子性是指在一次的操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并 且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行…...

[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言&#xff1a; 本文内容基本来自江协&#xff0c;整理起来方便日后开发使用。MCU&#xff1a;STM32F103C8T6。 一、配置流程 1、开启GPIO&#xff0c;TIM的时钟 /*开启时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //开启TIM2的时钟RCC_APB2PeriphClockC…...

web3py+flask+ganache的智能合约教育平台

最近在学习web3的接口文档&#xff0c;使用web3pyflaskganache写了一个简易的智能合约教育平台&#xff0c;语言用的是python&#xff0c;ganche直接使用的本地区块链网络&#xff0c;用web3py进行交互。 代码逻辑不难&#xff0c;可以私信或者到我的闲鱼号夏沫mds获取我的代码…...

< OS 有关 > 阿里云:轻量应用服务器 的使用 :轻量化 阿里云 vpm 主机

原因&#xff1a; &#xff1c; OS 有关 &#xff1e; 阿里云&#xff1a;轻量应用服务器 的使用 &#xff1a;从新开始 配置 SSH 主机名 DNS Tailscale 更新OS安装包 最主要是 清除阿里云客户端这个性能杀手-CSDN博客 防止 I/O 祸害系统 操作&#xff1a; 查看进程&#x…...

【技术】TensorRT 10.7 安装指南(Ubuntu22.04)

原文链接&#xff1a;https://mengwoods.github.io/post/tech/008-tensorrt-installation/ 本文安装的版本如下&#xff1a; Ubuntu 22.04 Nvidia Driver 538.78 CUDA 12.2 cuDNN 8.9.7 TensorRT 10.7 安装前的准备&#xff08;可选&#xff09; 在安装新版本之前&#xf…...

Linux 权限管理

hello&#xff01;这里是敲代码的小董&#xff0c;很荣幸您阅读此文&#xff0c;本文只是自己在学习Linux过程中的笔记&#xff0c;如有不足&#xff0c;期待您的评论指点和关注&#xff0c;欢迎欢迎~~ ✨✨个人主页&#xff1a;敲代码的小董 &#x1f497;&#x1f497;系列专…...

ParaView时间戳设置全攻略:从基础标注到自定义格式(5.8.0实测)

ParaView时间戳设置全攻略&#xff1a;从基础标注到自定义格式&#xff08;5.8.0实测&#xff09; 在科学可视化领域&#xff0c;时间戳不仅是数据演变的见证者&#xff0c;更是研究成果呈现的专业语言。ParaView作为开源可视化工具链的标杆&#xff0c;其时间标注功能在学术论…...

网易云音乐NCM转MP3终极指南:ncmdump工具完整使用教程

网易云音乐NCM转MP3终极指南&#xff1a;ncmdump工具完整使用教程 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经从网易云音乐下载了心爱的歌曲&#xff0c;却发现只能在特定播放器上收听&#xff1f;NCM格式的限制让音乐…...

基于ESP8266与MQTT的家庭水压自动控制系统设计与实现

1. 项目概述与核心需求解析家里水压不稳、供水时断时续&#xff0c;这大概是很多朋友都遇到过的烦心事。我所在的城市供水情况就很不理想&#xff0c;为了解决这个问题&#xff0c;我不得不自己动手&#xff0c;搭建了一套基于ESP8266微控制器的家庭水压增压与储水自动控制系统…...

MeloTTS实战:多语言语音合成的高效解决方案

MeloTTS实战&#xff1a;多语言语音合成的高效解决方案 【免费下载链接】MeloTTS High-quality multi-lingual text-to-speech library by MyShell.ai. Support English, Spanish, French, Chinese, Japanese and Korean. 项目地址: https://gitcode.com/GitHub_Trending/me/…...

输电线路在线监测系统|架空线路安全运行的“第一道防线“!

输电线路微气象监测站是专为高压输电线路、电网廊道、杆塔运维量身打造的专利级一体化微气象智能监测设备。依托双专利超声波探测技术、六要素集成传感架构、无启动风速高精测量、智能抗干扰稳控系统&#xff0c;实现输电线路沿线气象24小时全自动捕捉、动态实时监测、大风风险…...

2026数据治理平台选型:五款产品如何赋能数据中台建设?

一、引言&#xff1a;数据中台的成败&#xff0c;关键在治理在数字化浪潮的席卷下&#xff0c;“数据中台”已成为当代企业信息化架构中的核心战略组件。然而&#xff0c;一个悖论正困扰着大量企业&#xff1a;数据中台的基础设施搭建日趋完善&#xff0c;但真正将数据转化为业…...

别再乱建索引了!用Explain的key_len字段,一眼看穿你的MySQL联合索引到底生效了几个字段

解密MySQL联合索引&#xff1a;用key_len精准判断索引生效范围 在数据库性能优化领域&#xff0c;联合索引的使用一直是个既基础又容易踩坑的话题。很多开发者虽然知道"最左匹配原则"这个名词&#xff0c;但在实际业务场景中&#xff0c;面对复杂的查询条件组合时&a…...

如何让旧款Mac运行最新系统:OpenCore Legacy Patcher完整指南

如何让旧款Mac运行最新系统&#xff1a;OpenCore Legacy Patcher完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 想让你的老旧Mac设备重新焕发活力&a…...

企业级Veo 2提示词治理框架(含合规校验/版本回溯/效果归因三模块)——仅限首批500名开发者开放》

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Veo 2提示词治理框架的核心定位与演进逻辑 Veo 2提示词治理框架并非单纯的技术工具升级&#xff0c;而是面向AIGC生产环境规模化、合规化与可审计化需求的战略性基础设施重构。其核心定位在于将离散、经…...

代码质量保卫战,从人工Review到DeepSeek自动审查的7天转型全记录

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;代码质量保卫战的范式转移 过去十年&#xff0c;代码质量保障已从“事后拦截”转向“全程共生”。单元测试覆盖率不再是KPI终点&#xff0c;而是开发流程的呼吸节律&#xff1b;静态分析不再停留于CI流水线末尾…...