爬虫学习总结
通过前几次课,我们学习了爬虫的相关基础知识。
以下是我对爬虫学习做的一些总结:
一、认识爬虫:开启数据抓取之旅
1.1 什么是网络爬虫
网络爬虫就像是一个不知疲倦的 “数据搬运工”,它能按照预先设定的规则,自动在互联网上抓取各类信息。比如搜索引擎的爬虫会抓取网页内容,为用户搜索提供数据支持;电商数据爬虫可以抓取商品价格、评论等信息。它通过向网页服务器发送请求,获取 HTML、JSON 等格式的数据,再解析提取出有用信息。
1.2 爬虫的分类
- 通用爬虫:广泛抓取网页,像百度、谷歌的搜索引擎爬虫,用于构建庞大的网页索引库。
- 聚焦爬虫:专注于特定主题或领域,比如只抓取新闻网站的体育新闻内容。
- 增量式爬虫:只抓取更新或新增的数据,常用于监控网站内容变化。
二、搭建学习环境:为爬虫运行做好准备
2.1 选择编程语言
Python 是爬虫学习的热门选择,因其简洁的语法和丰富的第三方库。学习爬虫之前我们需要安装 Python 环境,可从 Python 官方网站(Download Python | Python.org)下载对应系统的安装包,安装时记得勾选 “Add Python to PATH”。
2.2 安装必要的库
- requests 库:用于发送 HTTP 请求。在命令行输入pip install requests进行安装。代码如下:
import requests
response = requests.get('https://www.example.com')
print(response.text)
- BeautifulSoup 库:解析 HTML 和 XML 文档。安装命令为pip install beautifulsoup4。代码如下:
from bs4 import BeautifulSoup
import requests
response = requests.get('https://www.example.com')
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.title.text)
- lxml 库:解析速度快,支持 XPath 语法。通过pip install lxml安装。如使用 XPath 提取数据:
from lxml import etree
import requests
response = requests.get('https://www.example.com')
html = etree.HTML(response.text)
data = html.xpath('//div[@class="content"]/text()')
print(data)
三、爬虫核心技术学习:掌握数据抓取关键
3.1 HTTP 协议基础
HTTP 协议是爬虫与网页服务器沟通的 “语言”。要熟悉常见的请求方法,如 GET(获取资源)、POST(提交数据);了解请求头中的 User-Agent(标识客户端信息)、Cookie(维持会话状态)等字段的作用。比如,为了伪装成浏览器发送请求,可以这样设置请求头:
import requests
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('https://www.example.com', headers=headers)
3.2 数据解析技术
- 正则表达式:通过编写匹配规则提取数据。例如,提取网页中的所有链接:
import re
import requests
response = requests.get('https://www.example.com')
links = re.findall(r'href="(.*?)"', response.text)
print(links)
- XPath:基于 XML 路径语言定位数据。假设要提取网页中所有段落文本,代码如下:
from lxml import etree
import requests
response = requests.get('https://www.example.com')
html = etree.HTML(response.text)
paragraphs = html.xpath('//p/text()')
print(paragraphs)
- CSS 选择器:类似 XPath,用于选择 HTML 元素。使用BeautifulSoup库通过 CSS 选择器提取 class 为 “article” 的 div 内的文本:
from bs4 import BeautifulSoup
import requests
response = requests.get('https://www.example.com')
soup = BeautifulSoup(response.text, 'html.parser')
data = soup.select('div.article')
for item in data:print(item.text)
四、爬虫实战:从理论到实践
4.1 简单静态网页抓取
以抓取一个小说网站的小说章节标题为例:
- 分析网页结构,找到存放标题的 HTML 标签和属性。
- 使用requests发送请求,BeautifulSoup解析数据。
import requests
from bs4 import BeautifulSoupurl = 'https://www.example-novel.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
titles = soup.select('.chapter-title')
for title in titles:print(title.text.strip())
4.2 动态网页抓取
对于使用 JavaScript 动态加载数据的网页,可借助Selenium库和浏览器驱动(如 ChromeDriver)。比如抓取一个动态加载图片的网页:
- 安装Selenium:pip install selenium,并下载对应版本的 ChromeDriver,将其路径添加到系统环境变量。
- 编写代码:
from selenium import webdriver
import timedriver = webdriver.Chrome()
url = 'https://www.example-image.com'
driver.get(url)
time.sleep(3) # 等待页面加载
images = driver.find_elements_by_css_selector('img')
for img in images:print(img.get_attribute('src'))
driver.quit()
五、应对挑战:解决爬虫常见问题
5.1 反爬处理
- IP 封禁:使用代理 IP 池,定期更换 IP 地址。可以从代理 IP 服务商获取 IP,或使用开源代理 IP 获取工具。
- 验证码:通过 OCR 技术识别简单验证码,复杂的可使用第三方打码平台,如超级鹰。
- 请求频率限制:设置合理的抓取间隔,避免短时间内大量请求。
5.2 数据存储
将抓取的数据存储到文件或数据库:
- 存储为 CSV 文件:
import csv
data = [['标题1', '内容1'], ['标题2', '内容2']]
with open('data.csv', 'w', newline='', encoding='utf-8') as csvfile:writer = csv.writer(csvfile)writer.writerows(data)
存储到 MySQL 数据库:先安装mysql-connector-python库(pip install mysql-connector-python),再连接数据库并插入数据:
import mysql.connectormydb = mysql.connector.connect(host="localhost",user="yourusername",password="yourpassword",database="yourdatabase"
)mycursor = mydb.cursor()
sql = "INSERT INTO yourtable (title, content) VALUES (%s, %s)"
val = [('标题1', '内容1'), ('标题2', '内容2')]
mycursor.executemany(sql, val)
mydb.commit()
mycursor.close()
mydb.close()
相关文章:
爬虫学习总结
通过前几次课,我们学习了爬虫的相关基础知识。 以下是我对爬虫学习做的一些总结: 一、认识爬虫:开启数据抓取之旅 1.1 什么是网络爬虫 网络爬虫就像是一个不知疲倦的 “数据搬运工”,它能按照预先设定的规则,自动…...
UE5的 Modify Curve 蓝图节点
In Unreal Engine’s Animation Blueprints, the Modify Curve node lets you drive and alter any named Animation Curve on your character at runtime. The Apply Mode setting on that node controls how the “new” value you feed in (via the added curve‐input pin)…...
鸿蒙中的并发线程间通信、线程间通信对象
目录 并发线程间通信1. 线程间通信对象1.1 普通对象1.2 ArrayBuufer对象1.3 SharedArrayBuffer对象1.4 Transferable对象(NativeBinding对象)1.5 Sendable对象简介异步锁ASON解析与生成共享容器共享模块Sendable对象冻结 2 线程间通信场景2.1 使用TaskPo…...
Elasticsearch内核探秘:从Shard分配到网络通信的深度实践指南
#作者:孙德新 文章目录 一、底层模块深入解析之shard allocation1、shard allocation的介绍2、cluster level shard allocation介绍3、disk-based shard allocation介绍4、shard allocation awareness5、shard allocation filtering6、node下线时的shard延迟分配7、…...
Vue3 模板语法
目录 一、插值语法 {{ }} 二、核心指令 三、动态属性绑定 四、事件修饰符 五、条件渲染 vs 列表渲染总结 六、最佳实践 示例 1:插值语法 & 基础绑定 示例 2:条件渲染 示例 3:列表渲染 示例 4:事件处理 示例 5&…...
第1节:Backtrader到底是个啥?能干嘛?
——“框架在手,天下我有;不是吹,Backtrader真香警告!” 🐣 一句话简介 Backtrader 是一个 专门为量化交易打造的 Python 回测框架,说白了,它就是一个量化策略“模拟器控制台评审团”ÿ…...
Java基础第21天-正则表达式
正则表达式是对字符串执行模式匹配的技术 如果想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为: 限定符选择匹配符分组组合和反向引用符特殊字符字符匹配符定位符 转义号\\:在我们使用正则表达式去检索某些特…...
【Pandas】pandas DataFrame mod
Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象(如 DataFrame、Series 或标量)的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...
【哈希表】1399. 统计最大组的数目
1399. 统计最大组的数目 - 力扣(LeetCode) 给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。 请你统计每个组中的数字数目&…...
57、Spring Boot 最佳实践
Spring Boot 最佳实践 一. 开发规范与代码风格 编写高质量的代码不仅需要功能的实现,还需要遵循一定的规范和代码风格,以提高代码的可读性、可维护性和协作效率。以下是 Spring Boot 开发中的一些关键规范和代码风格建议。 1. 代码命名规范 在编写代码时,命名是非常重要的…...
Java高级:数据库访问优化
系列文章目录 Java高级部分 JDBC编程 文章目录 系列文章目录前言一、编写属性文件:二、编写DBUtil工具类:三、使用DBUtil工具类:总结 前言 通过我之前发的数据库连接,数据库连接https://blog.csdn.net/2301_81776550/article/det…...
升级xcode16之后react-native-zip-archive不兼容,unsupported option ‘-G‘
问题 升级xcode到16之后,xcode build报错:unsupported option -G for target x86_64-apple-ios13.4-simulator (in target RNZipArchive from project Pods) 出现原因 在 React Native 项目中,当你将 Xcode 升级到 16 后,可能会遇到 RNZipArchive 相关的编译错误,特别是…...
基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告
基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习(Matlab完整源码和数据),附模型研究报告 目录 基于MTF的1D-2D-CNN-LSTM-Attention时序图像多模态融合的故障识别,适合研究学习࿰…...
逻辑漏洞安全
逻辑漏洞是指由于程序逻辑不严导致一些逻辑分支处理错误造成的漏洞。 在实际开发中,因为开发者水平不一没有安全意识,而且业务发展迅速内部测试没有及时到位,所以常常会出现类似的漏洞。 由于开发者/设计者在开发过程中,由于代码…...
基于PaddleOCR对图片中的excel进行识别并转换成word优化(二)
0、原图 一、优化地方 计算行的时候,采用概率分布去统计差值概率比较大的即为所要的值。 def find_common_difference(array):"""判断数组中每个元素的差值是否相等,并返回该差值:param array: 二维数组,其中每个元素是一个…...
5.2.3 WPF 中 XAML 文件 Converter 使用介绍
Converter(转换器)在 WPF 数据绑定中扮演着重要角色,用于在源数据和目标属性之间进行值转换 举例来说:我想用一个bool量来控制一个背景,为true时,显示红色;为false时背景用默认颜色。因此 Backg…...
基于STM32_HAL库的HC-08蓝牙插座项目
基于STM32_HAL库的HC-08蓝牙插座 文章目录 基于STM32_HAL库的HC-08蓝牙插座一、项目需求二、硬件连接三、项目实现3.1 CubeMX配置3.2 以阻塞的方式实现3.3 以中断的方式实现 一、项目需求 通过手机可以控制开发板上的LED或者继电器 二、硬件连接 首先将HC-08蓝牙模块连接到我们…...
SwiftUI 3.Button介绍和使用
SwiftUI 的 Button 是用于触发用户操作的核心交互组件。以下是 Button 的详细介绍和使用示例: 一、基础用法 1. 创建简单按钮 Button("点击我") {print("按钮被点击了") }2. 自定义按钮内容 Button {// 点击动作 } label: {Text("保存&…...
Linux 管道理解
一、什么是管道 1.1 unix中最古老的进程间通信 1.2 一个进程链接到另一个进程的数据流称为“管道”: 图解: 二、管道通信的原理 2.1当我们创建一个进程然后打开一个文件的时候 会经过以下步骤: ①首先要描述这个进程,为这个…...
从并发问题衍生出的Spring的七种事务传播行为
最近在处理一个BPM流程时,遇到了并发问题,原因是事务粒度太大了,导致等待lock超时。今天刚好借此机会分享下Spring框架中提供的7种事务传播行为。 在 Spring中,Transactional 注解支持配置事务的传播行为,用于指定当一…...
第十五届蓝桥杯 2024 C/C++组 艺术与篮球
目录 题目: 题目描述: 题目链接: 思路: 思路详解: 代码: 代码详解: 题目: 题目描述: 题目链接: P10385 [蓝桥杯 2024 省 A] 艺术与篮球 - 洛谷 艺术…...
Python内置函数---bin()
用于将整数转换为二进制字符串 1. 基本语法与参数 bin(x) 参数: x 必须为整数( int 类型),或实现了 __index__() 方法的自定义对象(该方法需返回整数) 。 返回值:以 0b 开头的二进制字符串。…...
网络socks 代理
在系统/终端中设了这样的环境变量,而没有在代码中覆盖,HTTPX 就会启用该 socks 代理。 env | grep proxy https_proxyhttps://proxyhk.zte.com.cn:80 http_proxyhttp://proxyhk.zte.com.cn:80 no_proxylocalhost,127.0.0.0/8,::1,zte.com.cn,zte.intra,…...
【正则表达式】核心知识点全景解析
目录 一、基础语法架构二、核心元字符详解三、高级匹配技巧1. 字符集合2. 分组与引用3. 断言机制 四、Python re模块核心方法五、性能优化策略1. 编译重用2. 避免回溯陷阱3. 选择高效量词 六、典型应用场景1. 数据验证2. 数据提取3. 文本清洗 七、调试技巧宝典1. 可视化调试工具…...
深度学习--ResNet残差神经网络解析
文章目录 前言一、什么是ResNet网络二、传统卷积神经网络存在的问题1、梯度消失和梯度爆炸2、退化问题 三、如何解决问题四、残差结构五、18层残差网络1、解释2、隔层相加优点3、隔层相加数值增大问题 六、18层残差网络以外的表格示例七、BN层(Batch Normalization&…...
数据结构线性表的顺序存储结构
线性表是由零个或多个数据元素组成的有序序列。 特点: 数据元素间是有顺序的; 数据元素的个数是有限的; 一般来说,数据元素的类型是相同的(强类型语言)。c/c是强类型语言,必须指定数据类型。…...
深入解析C++ STL Queue:先进先出的数据结构
一、引言 在计算机科学中,队列(Queue)作为一种遵循先进先出(FIFO)原则的数据结构,是算法设计和系统开发的基础组件。C STL中的queue容器适配器以简洁的接口封装了底层容器的操作,为开发者提供…...
永磁同步电机控制算法-反馈线性化控制
一、原理介绍 基于非线性系统的精确线性化控制方法,采用精确反馈线性化原理对永磁同步电机进行输入-输出线性化,该方法通过坐标变换和状态反馈将系统的数学模型转变为两个线性子系统,在实现线性化的同时也对系统中电流和转速存在的耦合现象进…...
开源 RAG 引擎:文档理解精准、检索高效、可视化干预灵活,一站式搞定
引言: RAGFlow 是一款基于深度文档理解的开源 RAG 引擎,与 LLM 结合后可实现精准引用问答。它支持 20 多种文档格式解析,配备智能分块策略及混合检索方案,还有可视化干预界面,且支持 Docker 快速部署,堪称…...
URP-UGUI相关知识
一、UGUI的基本组成部分 Canvas (画布)所有UI都需要放在Canvas画布下面,不然无法显示EventSystem 所有的事件响应系统都需要依赖于EventSystem,若删除该组件,交互效果就 不会显示 1.Canvas(画…...
COMSOL多孔结构传热模拟
多孔结构传热模拟涉及对多孔介质内部复杂的热量传递过程进行建模和分析,这类模拟对于优化材料设计、提高能源效率以及解决环境问题等方面具有重要意义。本案例介绍在COMSOL内建立全连通多孔结构几何模型,并将孔隙及基体划分两相材料,进行多孔…...
【CSS】层叠,优先级与继承(四):层叠,优先级与继承的关系
层叠,优先级与继承的关系 前文概括 【CSS】层叠,优先级与继承(一):超详细层叠知识点 【CSS】层叠、优先级与继承(二):超详细优先级知识点 【CSS】层叠,优先级与继承&am…...
CDN加速http请求
一、CDN加速定义 CDN(Content Delivery Network,内容分发网络)是通过全球分布式节点服务器缓存网站内容,使用户就近获取数据的技术。其核心目标是缩短用户与内容之间的物理距离,解决网络拥塞、带宽不足等问题ÿ…...
python实战项目63:获取腾讯招聘信息内容并进行统计分析
python实战项目63:获取腾讯招聘信息内容并进行统计分析 一、需求分析二、流程分析1、获取指定招聘工作类型的目标地址url。2、采集详情页信息。3、保存数据4、完整爬虫代码三、统计分析一、需求分析 本项目的需求是爬取腾讯社会招聘信息网中社会招聘的不同工作类别岗位数据,…...
FlinkUDF用户自定义函数深度剖析
Flink 作为一款强大的流批一体数据处理引擎,其灵活性和扩展性在很大程度上依赖于用户自定义函数(User-Defined Functions, UDF)。UDF 允许开发者根据业务需求扩展 Flink 的核心功能,实现复杂的数据转换、聚合或分析。本文将系统性…...
Python图形界面编程(一)
目录 一、相关的库 1、tkinter库 2、PyQt库 二、图形界面编程要点 三、tkinter控件 1、tkinter控件表 2、tkinter的常用控件 3、tkinter的扩展控件 四、tkinter布局 1、简单示例 2、默认情况下的grid规则 3、调整窗口和网格 (1)调整窗口 &…...
HarmonyOS Grid 网格列表可长按 item 拖动移动位置
方案一 @Component struct WorkCircleCreatePage {// 存储车控列表的数组@State VehicleDoorArr: IVehicleDoor[] = []// 当前移动的Item索引@State CurrentIndex: number = -1// 拖动时显示的数据@State MoveItem: IVehicleDoor = { title: , icon: }// 拖动时放大倍数@State…...
出现 ORA-00904: “TENANT_ID“: 标识符无效 解决方法
目录 前言1. 问题所示2. 原理分析3. 解决方法前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 1. 问题所示 执行代码的时候,出现如下所示: org.springframework.jdbc.BadSqlGrammarException:</...
榜单持久化
榜单持久化的基本流程是这样的: 创建表 持久化Redis数据到数据库 清理Redis数据 现在,创建表的动作已经完成,接下来就轮到Redis数据的持久化了。持久化的步骤如下: 读取Redis数据 判断数据是否存在 不存在,直接结束…...
璞华ChatBI闪耀2025数博会:对话式数据分析引领数智化转型新范式
4月17日至19日,2025中国(武汉)数字经济产业博览会在武汉盛大举办,璞华集团携自主研发的“ChatBI自然语言问答式数据分析平台”惊艳亮相。以 "通过对话让数据说话" 为主题,璞华集团在 A3-T8 展位构建了沉浸式…...
力扣DAY63-67 | 热100 | 二分:搜索插入位置、搜索二维矩阵、排序数组查找元素、搜索旋转排序数组、搜索最小值
前言 简单、中等 √ 二分法思路很简单,但是判断边界太麻烦了!难道真的要去背模板吗 搜索插入位置 我的题解 循环条件左不超过右,目标大于中间值(向下取整)时,左中1,小于,右中-1&…...
leetcode-哈希表
哈希表 127. 单词接龙 题目 字典 wordList 中从单词 beginWord 到 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s(1) -> s(2) -> ... -> s(k): 每一对相邻的单词只差一个字母。 对于 1 < i < k 时,每个 s(i) 都在…...
信息技术有限公司项目管理手册
这篇文档是信息技术有限公司的项目管理指导手册,对软件公司项目管理者具有重要价值,主要体现在以下几个方面: 管理全面规范 涵盖内容广:从项目的整体管理到各个具体领域,如范围管理、进度管理、成本管理等&…...
TFTP服务调试
在tftpboot目录下进行sudo minicom 启动内核时 问题:程序启动卡在Loading阶段 原因:tftp协议的问题 、或者网卡配置的问题 解决:1.检查网线是否插好 多试几次 2.检查tftp服务是否正常 在minicom中调试ping pc机的ip地址 2.进入boot调…...
date-picker组件的shortcuts为什么不能配置在vue的data的return中
在 Vue 中,shortcuts 是一个选项,通常用于配置像 date-picker 这样的组件的日期快捷方式。这里有一些原因解释为什么 shortcuts 不应该配置在 data 的 return 中,而是应该配置在 data 的外部(例如,直接作为组件的一个属…...
迭代器模式:统一数据遍历方式的设计模式
迭代器模式:统一数据遍历方式的设计模式 一、模式核心:将数据遍历逻辑与数据结构解耦 在软件开发中,不同的数据结构(如数组、链表、集合)有不同的遍历方式。如果客户端直接依赖这些数据结构的内部实现来遍历元素&…...
RocketMQ 核心架构速览
欢迎光临小站:致橡树 文章现有讲述比较简单,后续逐渐丰富各部分内容。 Apache RocketMQ 作为阿里巴巴开源的一款分布式消息中间件,凭借其高吞吐、低延迟、高可用等特性,成为金融级稳定性场景的首选解决方案。本文将深入剖析 Roc…...
kafka安装、spark安装
kafka简介 Kafka就是一个分布式的用于消息存储的消息队列。 kafka角色 Kafka中存储的消息,被消费后不会被删除,可以被重复消费,消息会保留多长,由kafka自己去配置。默认7天删除。背后的管理工作由zookeeper来管理。 kafka安装 …...
迅为RK3562开发板ARM四核A53核心板多种系统适配全开源
迅为RK3562开发板ARM四核A53核心板多种系统适配全开源 RK3562开发板(2GB内存16GB存储)...
用交换机连接两台电脑,电脑A读取/写电脑B的数据
1、第一步,打开控制面板中的网络和共享中心,如下图配置,电脑A和电脑B均要配置; 注意:要保证电脑A和电脑B在同一子网掩码下,不同的IP地址; 2、在电脑上同时按‘CommandR’,在弹出的输…...