【Python】爬虫入门

84 阅读4分钟

参考学习地址: www.datawhale.cn/learn/summa…

什么是爬虫

爬虫是自动化抓取网页数据的工具,让我们快速获取网上的公开信息。

爬虫的合法性

爬虫本身是中立的工具,合法与否取决于是否遵守网站的使用条款、robots协议及相关法律规定。

爬虫机制(反爬与反反爬)

反爬机制

指网站为了防止爬虫恶意抓取数据,采取的一系列限制策略或技术手段。常见目的包括:

  • 保护数据版权;
  • 降低服务器压力;
  • 限制非法数据采集。

反反爬策略

反反爬就是爬虫开发者用来绕过网站限制、成功抓取数据的技术手段。

比如网站识别你是爬虫,你就伪装成正常浏览器访问它。

robots 协议(Robots.txt 文件)

  1. 定义: 是一种“君子协定”,并没有强制性,网站用它告诉爬虫哪些页面可以爬,哪些不能爬。
  2. 位置: 网站根目录,如:
https://www.bilibili.com/robots.txt
  1. 基本语法:
User-agent: 指定爬虫名称(如 Googlebot、Baiduspider)
Allow:     允许访问的路径
Disallow:  禁止访问的路径
Crawl-delay: 10 (部分爬虫支持):设置爬虫两次抓取之间的最小间隔时间(单位:秒),用于控制服务器负载。
Sitemap: https://example.com/sitemap.xml:主动告知爬虫网站地图的位置,帮助其更高效地发现页面。
  1. 举例解析:
  • 示例 1:Bilibili 的 robots.txt
User-agent: Googlebot
Allow: /
User-agent: *
Disallow: /

# 解释:
# - 谷歌等常见搜索引擎爬虫可以访问全部页面。
# - 其他未指定的爬虫(`*`)**禁止访问全部页面**。
  • 示例 2:CSDN 的 robots.txt
User-agent: *
Disallow: /scripts
Disallow: /images/
...
Disallow: /*?*

# 解释:
# - 所有爬虫(包括搜索引擎)都**禁止访问某些静态资源目录**(如图片、CSS、脚本等);
# - 还限制了带 `?` 参数的动态页面,防止抓取搜索或评论接口。
  1. 常见反爬手段与对策
网站反爬策略反反爬策略(爬虫绕过方式)
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 提取补充。