【HTML】核心标签与【Python爬虫库】实战指南

一、HTML核心标签

1. div标签:网页布局的"万能容器"

div标签全称为Division,是HTML中的块级容器标签,核心价值在于"内容分组与区域划分"。它能将网页拆解为独立的功能模块(如头部导航、侧边栏、主体内容区、页脚)。

核心特性与使用逻辑

支持width、height、background、margin、padding等样式属性,能快速自定义区域外观;同时支持嵌套使用,可实现多层级、复杂的页面结构设计,适配从简单网页到大型门户网站的布局需求。

实战代码:div嵌套使用
复制代码
<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <title>标题</title>
</head>
<body>
<h1>标题1</h1>
<div style="background:antiquewhite;width:500px;height:400px">
  <h2>标题2</h2>
  <div style="background:brown;width:200px;height:300px;float:left">
    <p>python</p>
  </div>
  <div style="background:darkcyan;width:300px;height:300px;float:right">
    <h3>标题3</h3>
  </div>
  <p>最后一段内容</p>
</div>
</body>
</html>

演示结果:

2. 表格标签:结构化数据的"展示利器"

表格标签用于展示具有明确行列关系的结构化数据(如成绩表、商品参数、财务报表等),通过组合多个标签形成完整表格,能让数据呈现更清晰、更具可读性。其核心标签包括表格容器、行、单元格、表头、标题等,各司其职构建完整表格结构。

核心标签与属性说明

表格标签需组合使用,各核心标签的功能与关键属性如下:

|-------------|-----------------|---------------------------|
| 标签 | 作用 | 关键属性 |
| <table> | 定义表格容器 | border:设置边框宽度 |
| <tr> | 定义表格行 | 无核心属性,嵌套<td>/<<th> |
| <td> | 定义普通单元格 | 无核心属性 |
| <<th> | 定义表头单元格(默认加粗居中) | colspan:跨列;rowspan:跨行 |
| <caption> | 定义表格标题(默认居中顶部) | 无核心属性 |

实战代码:带合并单元格的完整表格

以下示例实现带表头、标题和跨列合并的学生成绩表,涵盖表格标签的核心用法:

复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>表格标签实战示例</title>
    <style>
        table {
            border-collapse: collapse; /* 合并边框,避免双重边框 */
            width: 600px;
            margin: 30px auto;
        }
        th, td {
            border: 1px solid #333;
            padding: 10px;
            text-align: center;
        }
        th {
            background-color: #e3f2fd;
        }
        caption {
            font-size: 18px;
            font-weight: bold;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <table>
        <caption>2025-2026学年第一学期期末考试成绩表</caption>
        <tr>
            <th colspan="2">学生信息</th>
            <th>数学</th>
            <th>英语</th>
        </tr>
        <tr>
            <td>姓名</td>
            <td>学号</td>
            <td>满分150分</td>
            <td>满分150分</td>
        </tr>
        <tr>
            <td>张三</td>
            <td>2025001</td>
            <td>132</td>
            <td>140</td>
        </tr>
        <tr>
            <td>李四</td>
            <td>2025002</td>
            <td>125</td>
            <td>135</td>
        </tr>
    </table>
</body>
</html>

演示结果:

二、Python爬虫库:解锁网页数据的密钥

1. requests库:轻量级HTTP请求

requests库是基于Python urllib开发的第三方HTTP库,API简洁易用,支持GET/POST请求、会话维持、代理设置、Cookie管理等核心功能,无需复杂的底层封装,能快速实现静态网页(无JavaScript动态渲染)的数据爬取,是爬虫入门的必备工具。

环境准备:安装与验证

通过pip命令安装,推荐使用国内镜像源加速下载,安装后验证版本确保环境正常:

复制代码
# 安装requests库(清华镜像源)
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

# 验证安装(查看版本信息)
pip show requests
get()函数:从服务器获取资源

get()函数用于向服务器发送GET请求,核心作用是"获取资源"(如网页源代码、图片、文件、API数据等)。GET请求的参数会拼接在URL末尾,适用于数据查询、资源获取等场景,核心参数包括url(目标地址)、params(查询参数)、headers(请求头)、proxies(代理)。

实战场景1:基础爬取网页源代码

爬取人民邮电出版社官网首页源代码,处理编码避免乱码:

复制代码
'''get函数'''
import requests
r = requests.get('https://www.ryjiaoyu.com') #获取url网址的内容,返回一个respones对象(获取的网页数据对象)
print(r.text)#显示网页的内容
实战场景2:带查询参数的GET请求、添加信息、设置编码

模拟搜索功能,通过params参数传递关键词,自动拼接URL:

复制代码
'''搜索信息'''
import requests
r = requests.get('https://www.ryjiaoyu.com//search?keyword=python')
print(r.text)

'''添加信息'''
import requests
info ={'keyword':'excel' }
r = requests.get('https://www.bilibili.com/search',params=info)
print(r.url)
print(r.text)

'''设置编码'''
import requests
r = requests.get('https://www.baidu.com')
r.encoding = r.apparent_encoding  #自动识别当前网页的编码
print(r.text)
实战场景3:UA伪装规避反爬

部分网站会通过User-Agent识别爬虫并拒绝访问,需设置headers模拟浏览器请求:

复制代码
import requests
# 获取url
url = "https://www.baidu.com/"
# 如果不设置UA 会知道你是python包来访问网页
# UA伪装
head = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36 Edg/142.0.0.0"
}
# 向url发生请求
r = requests.get(url,headers=head)
r.encoding = r.apparent_encoding  #自动识别当前网页的编码
print(r.text)
实战场景4:提取网站中的文字信息
复制代码
import requests
import re
r = requests.get('https://www.ryjiaoyu.com/tag/details/7')
print(r.text)
result = re.findall(r'title="(.+?)">(.+?)</a></h4>',r.text)
for i in range(len(result)):
   print('第',i+1,'本书: ',result[i][1])
实战场景5:xpath解析
复制代码
from lxml import etree

# parse 提供解析本地html文件的方法
tree = etree.parse("test.html")
# xpath获取返回的数据类型都是列表形式
# 获取到title对象
print(tree.xpath("/html/head/title/text()"))
print(tree.xpath("/html/body/div/p/text()"))
# 索引定位   这里的索引从1 开始
print(tree.xpath("/html/body/div[1]/p/text()"))
print(tree.xpath("/html/body/div[2]/p/text()"))
print(tree.xpath("/html/body/div[2]/p[2]/text()"))
# 属性定位   class,id
print(tree.xpath("/html/body/div[@class='song']/p[2]/text()"))
# / 表示的是一个层级  // 表示的是多个层级
print(tree.xpath("//div[@class='song']/p[3]/text()"))
# /text() 取直系标签下的文本内容
# //text() 取该标签下的所有文本内容
print(tree.xpath("//div[@class='song']/p[2]/text()")[0])
print(tree.xpath("//div[@class='song']//text()"))
# 取标签内的属性内容  @src、@href、
print(tree.xpath("//div[@class='song']/img/@src"))
print(tree.xpath("//div[@class='tang']/ul/li[3]/a/@href")[0])
实战场景6:爬取图片
复制代码
import fake_useragent
import requests
from lxml import etree
import os
n=0
def count():
    global n
    n+=1
    return n
# 新建一个文件夹用于存储图片
if not os.path.exists("./Picture"):
    os.mkdir("./Picture")
head = {
    "User-Agent": fake_useragent.UserAgent().random
}
for i in range(1, 3):
    url = f'https://10wallpaper.com/List_wallpapers/page/{i}'
    # 发送请求
    resp = requests.get(url, headers=head)
    # 响应回去的返回数据
    result = resp.text
    tree = etree.HTML(result)
    p_list = tree.xpath("//div[@id='pics-list']/p")
    for p in p_list:
        img_url = p.xpath("./a/img/@src")[0]
        img_url2='https://10wallpaper.com'+img_url
        print(img_url2)
        img_name = count()
        print(img_name)
        img_resp = requests.get(img_url2, headers=head)
        img_content = img_resp.content
        with open(f"./Picture/{img_name}.jpg", "wb") as fp:
            fp.write(img_resp.content)
post()函数:向服务器提交数据

post()函数用于向服务器发送POST请求,核心作用是"提交数据"(如表单提交、用户登录、数据修改、文件上传等)。POST请求的参数不会暴露在URL中,而是放在请求体里,安全性更高,核心参数包括url、data(表单数据)、json(JSON格式数据)、headers。

实战场景:模拟表单提交(修改密码)

以下示例模拟向网站提交修改密码的表单数据,实际场景需结合目标网站的接口规则调整参数:

复制代码
import requests
d = {'OldPassword':'123python','NewPassword':'123456python','ConfirmPassword':'123456python'}
r = requests.post('https://account.ryjiaoyu.com/change-password', data = d)
print(r.text)
import requests
d = {'Password':'Python123','Email':'15556520641'}
r = requests.post('https://account.ryjiaoyu.com/log-in', data = d)
print(r.text)
会话(Session):维持登录状态

HTTP协议是"无状态协议",即每次请求都是独立的,服务器不会保存上一次请求的状态。在爬虫场景中,若需访问登录后的页面(如用户中心、个人数据),需通过requests.Session()创建会话对象,自动保存Cookie信息,维持持续登录状态,实现跨请求的状态保持。

实战场景:登录后访问用户中心

以下示例模拟用户登录,通过会话对象保存Cookie,再访问登录后的用户中心页面:

复制代码
import requests
s = requests.Session()
data = {'Email': '15156883862','Password': '123python','RememberMe': 'true'}
r1 = s.post('https://account.ryjiaoyu.com/log-in?returnUrl=https%3a%2f%2fwww.ryjiaoyu.com%2f',data=data)
r2 = s.get('https://www.ryjiaoyu.com/user')
print( r2.text)
代理服务器:
复制代码
import requests
proxie = {'http':'http://115.29.199.16:8118'}
r = requests.get('https://www.ryjiaoyu.com/',proxies= proxie)
print(r.text)

2. selenium库:动态网页爬取与自动化工具

requests库仅能获取网页原始HTML代码,selenium库通过驱动真实浏览器(Chrome、Edge、Firefox等)模拟用户操作,能获取浏览器渲染后的完整页面内容,适用于动态网页爬取、自动化测试等场景。

环境准备:库安装与驱动配置

selenium的使用需同时安装库文件和对应浏览器的驱动,步骤如下:

复制代码
# 1. 安装selenium库(指定稳定版本)
pip install selenium==4.11.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

# 2. 下载浏览器驱动
# edge驱动下载地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?ch=1&form=MA13LH
# chrome驱动下载地址:https://chromedriver.storage.googleapis.com/index.html
# firefox驱动下载地址:https://github.com/mozilla/geckodriver/releases
# 驱动版本需与浏览器版本完全匹配
# 3. 配置驱动路径
# 将驱动文件(chromedriver.exe)放入Python安装目录的Scripts文件夹

在浏览器设置中找到浏览器版本

在驱动地址中找到对应的版本下载

将解压后的exe文件复制到python下载路径的Scripts文件夹中,python路径可以在电脑命令提示符通过where python查找

核心功能与实战示例

selenium支持打开网页、元素定位、输入文字、点击按钮、滚动页面、切换窗口等模拟用户操作,核心方法包括get()(打开网页)、find_element()(定位元素)、send_keys()(输入内容)、click()(点击操作)、execute_script()(执行JavaScript)。

实战场景1:打开网页并获取渲染后源代码
复制代码
mport re
import time
# pip install selenium==4.11.0 -i https://pypi.mirrors.ustc.edu.cn/simple/
'''打开一个网页'''
from selenium import webdriver  #从selenium导入 webdriver  (驱动浏览器驱动)
# 导入Edge浏览器的Options类,这个类允许我们配置WebDriver的行为。
from selenium.webdriver.edge.options import Options
# 创建一个Options类的实例,这将用于设置Edge浏览器的启动选项。
edge_options = Options()
# 设置Edge浏览器的文件位置,这样WebDriver知道哪个版本的Edge要启动。
# 这个路径必须指向你的Edge安装目录下的msedge.exe文件。
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
'''①webdriver具备多种不同浏览器的驱动,
browser = webdriver.Firefox()
browser = webdriver.chrome()
browser = webdriver.PhantomJS()
browser= webdriver.Safari()
# '''
# 使用上面创建的Options实例来初始化WebDriver。
# WebDriver是与浏览器交互的主要接口,通过它我们可以模拟用户操作。
driver = webdriver.Edge(options=edge_options)
# 使用get方法让WebDriver打开指定的URL,这里是Bilibili的主页。
driver.get('https://www.ptpress.com.cn/')
# driver.get('https://www.baidu.com/')
# input函数在这里用来暂停脚本的执行,直到用户按下回车键。
# 这样做是为了让用户能够观察到浏览器窗口中的结果
input('dengdai')
time.sleep(1)
实战场景2:模拟搜索操作
复制代码
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)

# 打开B站
driver.get("https://www.bilibili.com/")
# 定位搜索框(通过标签名定位)
search_input = driver.find_element(by=By.TAG_NAME, value="input")
# 输入关键词并按回车搜索
search_input.send_keys("Python爬虫" + Keys.ENTER)

input("按回车关闭...")
driver.quit()
实战场景3:在百度识图中上传图片,实现对图片的识别
复制代码
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
import time

edge_options = Options()
# 将 --headless 参数添加到 WebDriver 的配置中时,它告诉浏览器在"无头"模式下运行。
# 无头模式意味着浏览器在没有图形界面的情况下运行。这对于执行自动化测试或者在服务器上运行爬虫时非常有用,因为它节省了资源,并且运行速度可能更快。
edge_options.add_argument('--headless')
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)
driver.get('https://graph.baidu.com/pcpage/index?tpl_from=pc')
# driver.find_elements(by=By.TAG_NAME,value="input")[1].send_keys(r"E:\爬虫\Picture2\3.jpg")
#  或
input_element = driver.find_element(by=By.NAME,value="file")#定位标签
input_element.send_keys(r"C:\Users\ponyyll\Desktop\Snipaste_2026-01-30_18-38-15.png")
time.sleep(5)
elment = driver.find_element(by=By.CLASS_NAME,value="graph-guess-word")  # elements是获取所有标签
print(elment.text)
实战场景4:爬取动态加载的图片
复制代码
import requests
import os
import time
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By

# 创建图片保存目录
if not os.path.exists("./图片"):
    os.mkdir("./图片")

# 配置浏览器
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options=edge_options)

# 打开百度图片搜索(关键词:迪丽热巴)
driver.get("https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=迪丽热巴")
# 滚动页面3次,加载更多图片
for _ in range(3):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(3)  # 等待加载

# 定位所有图片元素
img_elements = driver.find_elements(by=By.XPATH, value="//img[@class='img_7rRSL']")

# 下载图片
for i, img in enumerate(img_elements, 1):
    img_url = img.get_attribute("src")
    if img_url:
        img_data = requests.get(img_url).content
        with open(f"./图片/{i}.png", "wb") as f:
            f.write(img_data)
        print(f"已下载第{i}张图片")

driver.quit()
实战场景5:爬取苏宁易购某手机的好评
复制代码
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
import time
#
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"  ##edge浏览器的地址
driver = webdriver.Edge(options=edge_options)
'''抓取好评'''
driver.get('https://review.suning.com/cluster_cmmdty_review/cluster-38249278-000000012389328846-0000000000-1-good.htm?originalCmmdtyType=general&safp=d488778a.10004.loverRight.166')
hp_file = open('好评.txt','w',encoding='utf8')       #文件对象
def get_py_content(file):   #只能获取当前这一页的所有评论#get_py_content是定义了一个函数,函数在什么时候会执行?调用的时候
   pj_elments_content = driver.find_elements(by= By.CLASS_NAME,value='body-content')#会寻找到所有class名为body-content的标签
   for elment in pj_elments_content:#i =0
       file.write(elment.text+'\n')
get_py_content(hp_file)     #获取当第一页的评论内容

next_elements = driver.find_elements(by= By.XPATH,value='//a[@class="next rv-maidian "]')#xpath,
print(next_elements)#标签元素数据,可以对这个类的数据,有一系列的操作,
while next_elements !=[]:#  是否获取到 下一页的标签,
   next_element = next_elements[0]
   time.sleep(1)#  以确保页面加载完成后再继续执行后续的操作。
   next_element.click()
   get_py_content(hp_file)#功能:是获取当前网页的评论数据,并写入到
   next_elements = driver.find_elements(by= By.XPATH,value='//*[@class="next rv-maidian "]')
hp_file.close()

三、技术选型总结

|-------------|---------------|-----------------------|
| 技术 | 核心用途 | 适用场景 |
| div标签 | 网页布局、内容分组 | 所有网页开发 |
| 表格标签 | 结构化数据展示 | 成绩表、商品参数、报表 |
| requests库 | 静态网页爬取、接口请求 | 无动态渲染的网页、API数据获取 |
| get()函数 | 获取网页/文件资源 | 搜索、数据查询 |
| post()函数 | 提交表单/JSON数据 | 登录、修改信息、数据上传 |
| 会话(Session) | 维持登录状态 | 需登录后访问的页面/接口 |
| selenium库 | 动态网页爬取、模拟用户操作 | JavaScript渲染的网页、自动化测试 |

相关推荐
serve the people2 小时前
python环境搭建 (七) pytest、pytest-asyncio、pytest-cov 试生态的核心组合
开发语言·python·pytest
java1234_小锋2 小时前
分享一套不错的基于Python的Django宠物信息管理系统
开发语言·python·宠物
2401_841495642 小时前
【Web开发】基于Flask搭建简单的应用网站
后端·python·flask·视图函数·应用实例·路由装饰器·调试模式
木卫二号Coding2 小时前
第七十七篇-V100+llama-cpp-python-server+Qwen3-30B+GGUF
开发语言·python·llama
木卫二号Coding2 小时前
第七十六篇-V100+llama-cpp-python+Qwen3-30B+GGUF
开发语言·python·llama
-To be number.wan2 小时前
为什么 pyecharts 在 Jupyter Notebook 里显示空白?
ide·python·jupyter·数据分析
zhang6183992 小时前
Linux中不同服务器之间迁移python 虚拟环境-conda-pack
linux·运维·python
忘忧记2 小时前
用 Python 30 分钟做出自己的记事本
开发语言·python
Libraeking2 小时前
深潜数据海洋 —— Libvio.link 爬虫技术全链路解析与实战
爬虫