从网页解剖到实战避坑,一篇解决爬虫灵魂三问
“为什么我写的爬虫代码总是报错404?”
“网页明明能打开,代码却抓不到数据?”
“刚运行5分钟就被网站封IP了?”
—— 这些让新手抓狂的问题,都源于对爬虫核心概念的理解缺失。本文用快递员送包裹的比喻,带你轻松掌握HTTP协议、HTML解析与反爬机制,文末附赠python学习课程大礼包!
HTTP协议:爬虫世界的「快递规则」
基础认知
快递员与包裹:把你正在使用的浏览器想象成收件人,服务器是发货方,HTTP协议就是快递公司的运输规则(RFC标准),而你从浏览器看到的内容,就是货物。
经典交互流程:
你的代码(客户端) → 发送「请求(Request)」 → 服务器
服务器处理 → 返回「响应(Response)」 → 客户端
取件方式
对比项 | GET(查快递) | POST(寄包裹) |
---|---|---|
数据位置 | URL参数(明文可见) | 请求体(加密传输) |
使用场景 | 搜索商品、打开网页 | 登录账号、提交表单 |
代码示例 | requests.get(url, params={}) | requests.post(url, data={}) |
实战技巧:用浏览器开发者工具(F12→Network)观察真实请求,80%的登录验证需POST提交表单。
HTML/CSS与XPath:获取网页数据
HTML网页又叫做超文本标记语言,本质上就是在网页上放置主要内容。以下是HTML网页的标签树结构,包括了常见的标签,如段落p,链接a,图片img。标签中的内容叫标签属性,如<a href=”https://baidu.com”>中,href就是a标签的一个属性。
<html> <!-- 声明html格式 -->
<head> <!-- 声明头部 -->
<title>页面标题</title>
</head>
<body> <!-- 声明躯干 -->
<div class="content"> <!-- 声明内容 -->
<p>段落文本</p>
<a href="https://baidu.com">链接文本</a> <!-- 链接内容 -->
<img src="https://example.jpg">图片名字</img> <!-- 图片内容 -->
</div>
</body>
<foot>底部<foot> <!-- 声明底部 -->
</html>
CSS是网页的样式语言,决定HTML网页所放置的内容如何布局,颜色如何,视觉效果如何,其形式如:
.core{
width: 100%;
padding-right: 22px;
padding-left: 22px;
color:red;
}
在爬虫中,我们可以通过html或css的结构来找到自己需要的数据内容。
CSS选择器:通过类名、ID定位元素(类比“找穿红衣服的人”)
soup.select('.content > p') # 选择class【.表示class】为content下的<p>标签
XPath: 通过html标签节点定位元素,同样利用类名、ID等标签或标签属性。
//div[@class="price"]/text() # 匹配所有(html节点中类名叫做price)class=price的div的文本
以下是xpath的常用语法:
// | 全局搜索 | //img 找所有图片 |
@ | 属性定位 | //a[@href] 找带链接的标签 |
* | 通配符 | //div/* 匹配div下所有子元素 |
在寻找网页中特定节点的xpath或selector法则时,可以利用f12+右键单击相应节点,复制法则,如下图我们需要一张图片标签img的selector法则:

结果为:
body > div:nth-child(6) > div > ul > li:nth-child(8) > div > a > img
当然,xpath也一样,不过最好还是自己寻找特定的标签来写法则,不然复制的法则可能包含冗余层级,不会很精确。
反爬机制
User-Agent伪装:我是人类,不是机器人
原理:服务器通过UA判断访问来源,我们伪装正常的UA设备信息。如:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...'
}
requests.get(url, headers=headers)
频率限制:别把服务器当「ATM狂点」
初级阶段,可以采用延时策略,如:
import time, random
time.sleep(random.uniform(1,3)) # 随机等待1~3秒
进阶方案,可以使用ip池,你可以利用一些免费网站寻找能用的代理ip,然后保存下来使用。这里推荐快代理:快代理 – 企业级HTTP代理IP云服务_专注IP代理11年
使用时,如:
proxies = {"http": "http://10.10.1.10:3128"}
requests.get(url, proxies=proxies)
反爬图谱
防御等级 | 常见手段 | 破解方案 |
---|---|---|
初级 | UA检测 | 伪装浏览器headers |
中级 | 封禁高频IP | 代理IP轮换 + 请求速率控制 |
高级 | 验证码/加密参数 | Selenium模拟操作 |
下面是用python的XPath提取百度网站标题的代码:
#引入访问网页的模块
import requests
#引入xpath解析的模块
from lxml import etree
#构建请求头模仿真实浏览器
headers={
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36 Edg/133.0.0.0'
}
url='https://baidu.com'
#访问百度网页
response=requests.get(url,headers).text
#解析网页
tree=etree.HTML(response)
#使用xpath提取标题
title=tree.xpath('//title/text()')
print(title)
结果>>['百度一下,你就知道']
下一期我们将直接进入爬虫实操,获取网站https://yituyu.com中的图片链接,敬请期待!