段落1
段落2
现代网页本质上是结构化的HTML文档,DOM(Document Object Model)就像网站的骨架系统。通过Chrome开发者工具查看网页源码时,那些层层嵌套的<div>
标签构成的树状结构,正是爬虫需要破解的密码本。
以新闻网站为例,正文通常包裹在<article>
标签或特定class的div中。通过分析DOM层级,我们可以发现内容分布的典型特征:html
段落1
段落2
python
"//div[@class='RichContent-inner']//text()"
"//span[@class='price J-p-100000123']/text()"
经验之谈:当元素没有明显特征时,可以向上查找具有确定class的父节点,再向下定位。比如//div[contains(@class,'container')]//p
比直接定位<p>
更稳定。
BeautifulSoup的select方法支持CSS语法:
python
soup.select("div.article > h1:nth-of-type(1)") # 选取文章主标题
soup.select("meta[name='description']") # 抓取meta描述
噪声过滤:
使用text.strip()
清除空白字符时,建议配合正则表达式处理特殊unicode字符:
python
re.sub(r'[\u200b-\u200f\u202a-\u202e]', '', text)
结构修复:
对于残缺的HTML文档,先用lxml.html.clean
清理再解析:
python
from lxml.html.clean import Cleaner
cleaner = Cleaner(style=True, links=True)
动态内容处理:
当遇到React/Vue渲染的页面时,可采用:
某电商网站的真实对抗案例:
1. 第一代:UserAgent轮询 + 随机延迟(1-3秒)
2. 第二代:模拟鼠标移动轨迹 + 页面停留时间控制
3. 当前方案:浏览器指纹混淆 + TLS指纹伪装
特别提醒:合法合规是前提,务必遵守:
- robots.txt协议
- 设置合理的爬取间隔(建议≥5秒)
- 避免抓取个人隐私数据
要让抓取内容呈现"真人创作"风格,需注意:
1. 段落衔接:使用过渡词("值得注意的是","无独有偶")
2. 数据呈现:将原始数字转化为"约75%的用户"等自然表达
3. 内容重组:按"论点-论据-案例"结构重新组织素材
python
def humanize_content(paragraphs):
transitions = ["实际上", "深入来看", "更具启发的是"]
return "。".join(
f"{random.choice(transitions)},{p.strip('。')}"
for p in paragraphs[:3]
)
优秀的爬虫工程师应该像侦探一样思考:从DOM结构中发现数据线索,用代码还原人类的浏览行为。记住,最有效的爬虫往往是那些能完美模拟正常用户访问的解决方案。当你在开发者工具中反复调试选择器时,不妨想想——网站开发者可能正在用同样的工具分析你的爬虫行为。