参考学习地址: www.datawhale.cn/learn/summa…
什么是爬虫
爬虫是自动化抓取网页数据的工具,让我们快速获取网上的公开信息。
爬虫的合法性
爬虫本身是中立的工具,合法与否取决于是否遵守网站的使用条款、robots协议及相关法律规定。
爬虫机制(反爬与反反爬)
反爬机制
指网站为了防止爬虫恶意抓取数据,采取的一系列限制策略或技术手段。常见目的包括:
- 保护数据版权;
- 降低服务器压力;
- 限制非法数据采集。
反反爬策略
反反爬就是爬虫开发者用来绕过网站限制、成功抓取数据的技术手段。
比如网站识别你是爬虫,你就伪装成正常浏览器访问它。
robots 协议(Robots.txt 文件)
- 定义: 是一种“君子协定”,并没有强制性,网站用它告诉爬虫哪些页面可以爬,哪些不能爬。
- 位置: 网站根目录,如:
https://www.bilibili.com/robots.txt
- 基本语法:
User-agent: 指定爬虫名称(如 Googlebot、Baiduspider)
Allow: 允许访问的路径
Disallow: 禁止访问的路径
Crawl-delay: 10 (部分爬虫支持):设置爬虫两次抓取之间的最小间隔时间(单位:秒),用于控制服务器负载。
Sitemap: https://example.com/sitemap.xml:主动告知爬虫网站地图的位置,帮助其更高效地发现页面。
- 举例解析:
- 示例 1:Bilibili 的 robots.txt
User-agent: Googlebot
Allow: /
User-agent: *
Disallow: /
# 解释:
# - 谷歌等常见搜索引擎爬虫可以访问全部页面。
# - 其他未指定的爬虫(`*`)**禁止访问全部页面**。
- 示例 2:CSDN 的 robots.txt
User-agent: *
Disallow: /scripts
Disallow: /images/
...
Disallow: /*?*
# 解释:
# - 所有爬虫(包括搜索引擎)都**禁止访问某些静态资源目录**(如图片、CSS、脚本等);
# - 还限制了带 `?` 参数的动态页面,防止抓取搜索或评论接口。
- 常见反爬手段与对策
| 网站反爬策略 | 反反爬策略(爬虫绕过方式) |
|---|---|
| UA 校验(判断是不是浏览器) | 添加浏览器 User-Agent |
| IP 限制(封 IP、限频率) | 使用代理池 |
| 登录限制 / 验证码 | 模拟登录 / 使用 OCR |
| JavaScript 渲染 | 用 Selenium / Puppeteer |
| robots.txt 禁止爬 | 仅在测试学习下绕过,需遵守法律与道德 |
urllib demo
抓取百度网页源码:
from urllib.request import urlopen
resp = urlopen("http://www.baidu.com") # 打开百度
# print(resp.read().decode("utf-8")) # 打印抓取到的内容
with open("baidu.html", mode="w", encoding="utf-8") as f: # 创建⽂件
f.write(resp.read().decode("utf-8")) # 保存在⽂件中
print("over")
requests 模块入门
- 安装模块
pip install requests
- case 1:抓取搜狗搜索内容
import requests
kw = input("请输⼊你要搜索的内容:")
url = f'https://www.sogou.com/web?query={kw}'
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
response = requests.get(url, headers=headers) # 处理一个小小的反爬
print(response.text) # 拿到页面源代码
# with open("sogou.html", mode="w", encoding="utf-8") as f:
# f.write(response.text)
response.close()
- case 2:抓取⾖瓣电影
import requests
import json
url = "https://movie.douban.com/j/chart/top_list"
# 重新封装参数
param = {
"type": "24",
"interval_id": "100:90",
"action": "",
"start": 0, # 从库中的第⼏部电影去取
"limit": 20, # ⼀次取出的个数
}
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
response = requests.get(url=url
, params=param
, headers=headers) # get请求一般是params=...
# print(response.request.url)
# https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=0&limit=20
# 输出数据
list_data = response.json()
print(list_data)
# 输出到文件
fp = open('./douban.json', 'w', encoding='utf-8')
json.dump(list_data, fp=fp, ensure_ascii=False)
response.close() # 关掉response
print('over!!!')
数据解析
在爬虫开发中, “抓取整个网页”只是第一步,提取你真正需要的“有效数据”才是核心目标。
三种常见的网页数据解析方式:
- re解析
- bs4解析
- xpath解析
re 正则表达式解析
- 原理:利用 Python 的
re模块,用字符串规则进行模式匹配,提取 HTML 中你关心的内容。 - 优点:
- 不依赖第三方库
- 解析速度快(适合结构稳定的页面)
- 灵活,能应对某些 BS4 / XPath 无法处理的内容
- 缺点:
- 写起来容易出错(尤其 HTML 标签嵌套多)
- 可读性差,难维护
- 不适合处理结构复杂的页面
- 示例:
import re
html = '<div><span class="word">apple</span></div>'
result = re.findall(r'<span class="word">(.*?)</span>', html)
print(result) # ['apple']
bs4(BeautifulSoup)解析
- 原理:通过 DOM 结构解析 HTML,可以用标签、类名、id 等方式查找元素。
- 优点:
- 上手快,语法简单易懂
- 容错能力强(HTML 不规范也能解析)
- 适合初学者,调试方便
- 缺点:
- 性能稍逊(相比 XPath)
- 某些复杂嵌套结构提取不如 XPath 精准
- 示例:
from bs4 import BeautifulSoup
html = '<div><span class="word">apple</span></div>'
soup = BeautifulSoup(html, "html.parser")
word = soup.find("span", class_="word").text
print(word) # apple
lxml + xpath 解析
- 原理:用 XPath 语法来提取 HTML/XML 数据,类 XML 树结构定位方式,最强大、最精确的解析方式。
- 优点:
- 定位精度高,提取高效
- 支持复杂结构
- 语法强大,适合结构复杂的网页
- 缺点:
- 学习成本略高
- 对 HTML 格式容错能力不如 bs4(需配合
lxml)
- 示例:
from lxml import etree
html = '<div><span class="word">apple</span></div>'
tree = etree.HTML(html)
word = tree.xpath('//span[@class="word"]/text()')[0]
print(word) # apple
总结对比表:
| 方式 | 学习难度 | 容错性 | 精确度 | 速度 | 推荐使用场景 |
|---|---|---|---|---|---|
| re | ⭐⭐⭐ | ⭐ | ⭐⭐ | ⭐⭐⭐⭐ | 网页结构非常简单、熟悉正则 |
| bs4 | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | HTML 不规范、小型网页 |
| xpath | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | 结构清晰、数据嵌套深、多数据项提取 |
真实项目中,往往推荐你:
优先尝试 XPath 或 bs4,个别字段用正则 re 提取补充。