爬虫不“刑”教程
在大数据时代,信息的获取至关重要,而网络爬虫正是帮助我们从互联网上获取海量数据的重要工具。无论是数据分析、人工智能训练数据,还是商业情报收集,爬虫技术都能发挥重要作用。本篇文章将全面解析 Python 爬虫的各个方面,从基础知识到高级应用,带领读者掌握爬虫开发的核心技能。
在大数据时代,信息的获取至关重要,而网络爬虫正是帮助我们从互联网上获取海量数据的重要工具。无论是数据分析、人工智能训练数据,还是商业情报收集,爬虫技术都能发挥重要作用。本篇文章将全面解析 Python 爬虫的各个方面,从基础知识到高级应用,带领读者掌握爬虫开发的核心技能。
目录
1.4.2 示例:使用 requests 访问百度并查看响应头
1. 爬虫基础
1.1 爬虫的定义
爬虫(Web Scraping)是一种自动化程序,模拟用户访问网页并提取网页数据的技术。通常由 HTTP 请求、HTML 解析和数据存储三个主要部分组成。爬虫可以用于多种场景,例如搜索引擎、数据挖掘和舆情分析等。它的基本原理是使用 HTTP 请求获取网页内容,然后利用解析技术提取所需信息。
爬虫分为以下几种类型:
-
通用爬虫:主要用于搜索引擎,抓取整个互联网的数据并建立索引。
-
聚焦爬虫:专注于某个特定领域的数据,如电商价格爬取、社交媒体数据采集。
-
增量爬虫:只抓取自上次抓取以来发生变化的数据,提高效率。
-
深度爬虫:针对特定网站进行递归抓取,深入层级页面。
1.2 爬虫的应用场景
-
数据分析:通过爬取社交媒体、新闻网站等数据,进行情感分析、热点话题分析。
-
人工智能训练:用于获取语料库、图像数据集,以便机器学习模型训练。
-
商业智能:电商领域用于价格监控、竞争对手分析、市场调研。
-
学术研究:爬取论文、专利数据,辅助研究。
-
电子商务:自动监测产品价格变动,优化定价策略。
-
新闻聚合:自动爬取新闻网站,生成新闻摘要,提高信息获取效率。
-
金融分析:爬取股票、基金、加密货币数据,进行投资决策分析。
1.3 HTTP 基础知识
爬虫的核心是向目标网站发送 HTTP 请求并获取响应数据,理解 HTTP 协议是爬虫开发的基础。
1.3.1 常见 HTTP 方法
-
GET:从服务器请求数据(最常见)。
-
POST:向服务器提交数据(如表单提交)。
-
PUT:更新服务器上的资源。
-
DELETE:删除服务器上的资源。
1.3.2 HTTP 状态码解析
-
200:请求成功。
-
301/302:重定向。
-
403:禁止访问。
-
404:未找到资源。
-
500:服务器内部错误。
1.3.3 HTTP 请求头与响应头
-
User-Agent:指示客户端类型(浏览器或爬虫)。
-
Referer:指示请求来源页面,部分网站依赖此字段进行权限控制。
-
Cookie:维持用户会话。
-
Authorization:用于 API 访问权限验证。
-
Content-Type:指示请求或响应的数据格式,如 JSON、HTML。
1.4 HTTP 头部(Header)的意义
HTTP 头部(Header)包含客户端和服务器之间传输的元数据,影响数据传输方式和安全性。
1.4.1 常见 HTTP 头部字段
-
User-Agent:标识请求来源的客户端。
-
Referer:指示请求来源,防止跨站请求伪造(CSRF)。
-
Accept:指定客户端支持的数据类型,如
text/html、application/json。 -
Accept-Encoding:指定支持的压缩格式,如
gzip,加速数据传输。 -
Cookie:存储用户会话信息,如登录状态。
-
Authorization:用于身份验证,如 API 访问令牌。
-
Content-Type:表明请求或响应的 MIME 类型,如
application/json。
1.4.2 示例:使用 requests 访问百度并查看响应头
import requests
url = "https://www.baidu.com"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept-Encoding": "gzip, deflate, br"
}
response = requests.get(url, headers=headers)
print("请求头:", response.request.headers)
print("响应头:", response.headers)
2. Python 爬虫开发
2.1 使用 requests 发送 HTTP 请求
import requests
headers = {"User-Agent": "Mozilla/5.0"}
response = requests.get("https://example.com", headers=headers)
print(response.text)
2.2 解析 HTML 数据
2.2.1 使用 BeautifulSoup
from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")
print(soup.title.text)
2.2.2 使用 lxml
from lxml import etree
tree = etree.HTML(response.text)
titles = tree.xpath("//title/text()")
print(titles)
3. 反爬策略及应对
3.1 常见反爬机制
1. User-Agent 检测
网站会检查 User-Agent 请求头来判断访问来源。如果 User-Agent 缺失或与已知爬虫特征匹配,网站可能会拒绝请求。
应对方案:使用常见浏览器的 User-Agent,并随机切换。
import random
import requests
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Firefox/89.0",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Edge/91.0.864.64"
]
headers = {
"User-Agent": random.choice(user_agents)
}
response = requests.get("https://example.com", headers=headers)
print(response.text)
2. IP 限制
网站可能通过检测访问频率来封锁同一 IP 地址过于频繁的请求。
应对方案:
-
使用代理池:轮换 IP,避免单一 IP 被封。
-
控制访问频率:添加随机时间间隔,模拟正常用户访问。
import time
proxies = [
{"http": "http://1.2.3.4:8080"},
{"http": "http://2.3.4.5:8080"},
{"http": "http://3.4.5.6:8080"}
]
proxy = random.choice(proxies)
time.sleep(random.uniform(1, 5)) # 随机延迟
response = requests.get("https://example.com", proxies=proxy)
print(response.text)
3. 验证码验证
许多网站使用验证码来阻止自动化访问,如 Google reCAPTCHA。
应对方案:
-
使用 OCR 技术解析验证码,如
pytesseract。 -
使用打码平台(如 5captcha)获取验证码结果。
from PIL import Image
import pytesseract
image = Image.open('captcha.png')
captcha_text = pytesseract.image_to_string(image)
print("识别的验证码是:", captcha_text)
4. 动态内容加载
很多网站使用 JavaScript 生成内容,而爬虫默认不会执行 JavaScript。
应对方案:
-
使用 Selenium 模拟浏览器。
-
直接抓取网站 API。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com")
print(driver.page_source)
driver.quit()
注意哦,爬虫虽好,也需遵循 robots.txt 协议,避免恶意爬取影响网站运作,感叹爬虫真刑就晚了。
更多推荐



所有评论(0)