笔记 · 2025-02-19

爬虫入门核心课:5分钟搞懂「HTTP协议+XPath语法」,绕过90%反爬陷阱

从网页解剖到实战避坑,一篇解决爬虫灵魂三问

“为什么我写的爬虫代码总是报错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中的图片链接,敬请期待!

目录