当前位置: 首页 > news >正文

爬虫不“刑”教程

在大数据时代,信息的获取至关重要,而网络爬虫正是帮助我们从互联网上获取海量数据的重要工具。无论是数据分析、人工智能训练数据,还是商业情报收集,爬虫技术都能发挥重要作用。本篇文章将全面解析 Python 爬虫的各个方面,从基础知识到高级应用,带领读者掌握爬虫开发的核心技能。

目录

1. 爬虫基础

1.1 爬虫的定义

1.2 爬虫的应用场景

1.3 HTTP 基础知识

1.3.1 常见 HTTP 方法

1.3.2 HTTP 状态码解析

1.3.3 HTTP 请求头与响应头

1.4 HTTP 头部(Header)的意义

1.4.1 常见 HTTP 头部字段

1.4.2 示例:使用 requests 访问百度并查看响应头

2. Python 爬虫开发

2.1 使用 requests 发送 HTTP 请求

2.2 解析 HTML 数据

2.2.1 使用 BeautifulSoup

2.2.2 使用 lxml

3. 反爬策略及应对

3.1 常见反爬机制

1. User-Agent 检测

2. IP 限制

3. 验证码验证

4. 动态内容加载


1. 爬虫基础

1.1 爬虫的定义

爬虫(Web Scraping)是一种自动化程序,模拟用户访问网页并提取网页数据的技术。通常由 HTTP 请求、HTML 解析和数据存储三个主要部分组成。爬虫可以用于多种场景,例如搜索引擎、数据挖掘和舆情分析等。它的基本原理是使用 HTTP 请求获取网页内容,然后利用解析技术提取所需信息。

爬虫分为以下几种类型:

  1. 通用爬虫:主要用于搜索引擎,抓取整个互联网的数据并建立索引。

  2. 聚焦爬虫:专注于某个特定领域的数据,如电商价格爬取、社交媒体数据采集。

  3. 增量爬虫:只抓取自上次抓取以来发生变化的数据,提高效率。

  4. 深度爬虫:针对特定网站进行递归抓取,深入层级页面。

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/htmlapplication/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 协议,避免恶意爬取影响网站运作,感叹爬虫真刑就晚了。

相关文章:

  • c++ cout详解
  • 探秘虚拟与现实的融合:VR、AR、MR 技术的变革力量
  • 清华大学AI赋能医药代表销售培训讲师专家培训师唐兴通Deepseek医药数字化营销大健康数字化转型医药新媒体营销
  • 云平台 | 玩转单细胞比率可视化
  • yoloV5的学习-pycharm版本
  • T41LQ专为人工智能物联网(AIoT)应用设计,适用于智能安防、智能家居、机器视觉等领域 软硬件资料+样品测试
  • 【前端】前端设计中的响应式设计详解
  • PAT乙级真题 / 知识点(1)
  • 【JavaEE】线程安全
  • 从 JVM 源码(HotSpot)看 synchronized 原理
  • MySQL面试题(二)
  • c++ 内存管理系统之智能指针
  • Java自动拆箱装箱/实例化顺序/缓存使用/原理/实例
  • 关于常规模式下运行VScode无法正确执行“pwsh”问题
  • 【Python 数据结构 5.栈】
  • AIC8800---编译环境搭建
  • 关于后端接口的返回值问题
  • 大营销平台
  • 【ATXServer2】Android无法正确显示手机屏幕
  • Stepdown SLOPE for Controlled Feature Selection
  • 中华人民共和国和俄罗斯联邦关于全球战略稳定的联合声明
  • 国家主席习近平同普京总统共见记者
  • 万玲、胡春平调任江西省鹰潭市副市长
  • 绍兴柯桥:用一块布托起中国制造的新经纬
  • 澎湃研究所“营商环境研究伙伴计划”启动
  • 经济日报:降准降息,提前还房贷划算吗?