文章目录

从零精通Python爬虫:核心技术、反爬策略与项目落地

一、零基础入门:Python基础与环境搭建

核心目标:掌握Python语法和爬虫开发环境,能编写简单脚本。

必备知识点

  1. Python环境搭建(Anaconda/PyCharm)
  2. 基本语法:变量、数据类型(字符串、列表、字典、元组)、运算符
  3. 流程控制:条件判断(if-else)、循环(for/while
  4. 函数与模块:自定义函数、import导入模块、常用内置模块(os/sys/time

代码示例:Python基础语法实践

# 数据类型与循环示例
def process_data():
    # 列表存储URL
    urls = ["https://www.example.com", "https://www.test.com"]
    # 字典存储请求头信息
    headers = {"User-Agent": "Mozilla/5.0"}
    
    # 循环遍历URL
    for i, url in enumerate(urls):
        print(f"第{i+1}个URL:{url}")
        # 条件判断
        if "example" in url:
            print("包含目标站点,准备爬取\n")

if __name__ == "__main__":
    process_data()

最佳实践

  • 使用PyCharm社区版(免费)作为IDE,配置虚拟环境(venv)隔离项目依赖。
  • 养成注释习惯,使用#注释单行,""" """注释函数/类。

注意事项

  • 避免使用Python 2.x,直接学习Python 3.8+(语法更规范,支持更多新特性)。
二、网络基础:理解爬虫的“通信规则”

核心目标:掌握HTTP协议,理解爬虫与服务器的交互原理。

必备知识点

  1. HTTP/HTTPS协议:请求-响应模型、URL结构(协议、域名、路径、参数)。
  2. 请求方法:GET(获取数据)、POST(提交数据)。
  3. 响应状态码:200(成功)、403(禁止访问)、404(页面不存在)、500(服务器错误)。
  4. 请求头(Headers):User-Agent(伪装浏览器)、Cookie(维持登录状态)、Referer(防盗链)。

代码示例:用urllib发送HTTP请求

from urllib.request import urlopen, Request

# 定义请求头,伪装成浏览器
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

# 构建请求对象
url = "https://www.baidu.com"
req = Request(url, headers=headers)

# 发送请求并获取响应
try:
    with urlopen(req) as response:
        # 读取响应内容(字节转字符串)
        html = response.read().decode("utf-8")
        print(f"响应状态码:{response.status}")
        print(f"网页前100字符:{html[:100]}")
except Exception as e:
    print(f"请求失败:{e}")

最佳实践

  • 使用浏览器开发者工具(F12)查看真实请求(Network面板),复制User-AgentCookie

注意事项

  • HTTPS协议比HTTP更安全,爬虫需支持SSL验证(默认开启,无需额外配置)。
三、爬虫基础库:发送请求与解析数据

核心目标:掌握requests(发送请求)和BeautifulSoup(解析HTML),能爬取静态网页。

必备知识点

  1. requests库:get()/post()方法、处理headers/cookies、超时设置(timeout)、异常处理。
  2. 数据解析:
    • 正则表达式(re模块):提取特定格式内容(如邮箱、URL)。
    • BeautifulSoup:解析HTML标签,通过find()/find_all()提取元素(text/attrs属性)。

代码示例:爬取静态网页并解析数据

import requests
from bs4 import BeautifulSoup

# 1. 发送请求
url = "https://book.douban.com/top250?start=0"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

response = requests.get(url, headers=headers, timeout=10)
response.encoding = "utf-8"  # 确保中文显示正常

# 2. 解析数据(提取书名和评分)
soup = BeautifulSoup(response.text, "html.parser")  # 使用html.parser解析器
books = soup.find_all("div", class_="pl2")  # 定位包含书名的标签

for book in books:
    # 提取书名(清除空格和换行)
    title = book.find("a")["title"].strip()
    # 提取评分
    rating = book.find_next("span", class_="rating_nums").text
    print(f"书名:{title},评分:{rating}")

最佳实践

  • 优先使用requests(比urllib更简洁),搭配BeautifulSoup解析HTML。
  • 解析器选择:html.parser(Python内置,无需安装)或lxml(速度更快,需安装:pip install lxml)。

注意事项

  • requests请求添加超时(timeout=10),避免程序无限等待。
  • 尊重网站反爬,避免高频请求(可通过time.sleep(1)添加间隔)。
四、进阶:处理动态网页与反爬机制

核心目标:爬取JavaScript动态加载的内容,突破基础反爬限制。

必备知识点

  1. 动态网页爬取:
    • 分析API接口(通过开发者工具Network面板找XHR请求,直接请求JSON数据)。
    • 模拟浏览器:Selenium/Playwright(处理JS渲染、登录验证等)。
  2. 反爬应对:
    • 伪装浏览器:随机User-Agentfake_useragent库)。
    • IP代理:使用代理池(如proxies参数)避免IP封禁。
    • 验证码处理:手动输入、ddddocr(简单验证码识别)。

代码示例1:爬取API接口数据

import requests

# 分析豆瓣电影Top250的API接口(非真实接口,仅示例)
url = "https://api.douban.com/v2/movie/top250"
params = {"start": 0, "count": 10}  # 分页参数
headers = {"User-Agent": "Mozilla/5.0"}

response = requests.get(url, params=params, headers=headers)
data = response.json()  # 直接解析JSON

for movie in data["subjects"]:
    print(f"电影名:{movie['title']},评分:{movie['rating']['average']}")

代码示例2:用Selenium模拟浏览器

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 初始化浏览器(需下载对应浏览器驱动,如chromedriver)
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")

# 模拟搜索操作
driver.find_element(By.ID, "kw").send_keys("Python爬虫")  # 输入关键词
driver.find_element(By.ID, "su").click()  # 点击搜索按钮

time.sleep(2)  # 等待页面加载
# 提取搜索结果
results = driver.find_elements(By.CSS_SELECTOR, ".result h3 a")
for res in results:
    print(res.text)  # 打印标题

driver.quit()  # 关闭浏览器

最佳实践

  • 优先通过API接口爬取数据(效率高于解析HTML),仅在无API时使用Selenium(性能较低)。
  • 代理IP选择高匿代理,避免使用透明代理(易被识别)。

注意事项

  • Selenium需下载对应浏览器的驱动(如ChromeDriver),并确保驱动版本与浏览器一致。
五、数据存储:持久化爬取结果

核心目标:将爬取的数据保存到文件或数据库,方便后续分析。

必备知识点

  1. 文件存储:文本(txt)、CSV(csv模块/pandas)、JSON(json模块)。
  2. 数据库存储:
    • 关系型数据库:MySQL(pymysql库)。
    • 非关系型数据库:MongoDB(pymongo库)。

代码示例:保存数据到CSV和MySQL

# 1. 保存到CSV
import csv

data = [
    {"title": "三体", "rating": "8.8"},
    {"title": "活着", "rating": "9.4"}
]

with open("books.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["title", "rating"])
    writer.writeheader()  # 写入表头
    writer.writerows(data)  # 写入数据


# 2. 保存到MySQL(需先安装pymysql:pip install pymysql)
import pymysql

# 连接数据库(需提前创建数据库和表)
conn = pymysql.connect(
    host="localhost",
    user="root",
    password="123456",
    database="spider_db",
    charset="utf8mb4"
)

cursor = conn.cursor()
# 插入数据
for item in data:
    sql = "INSERT INTO books (title, rating) VALUES (%s, %s)"
    cursor.execute(sql, (item["title"], item["rating"]))

conn.commit()  # 提交事务
cursor.close()
conn.close()

最佳实践

  • 小量数据用CSV/JSON,大量数据用数据库(支持索引和查询优化)。
  • 数据库操作需添加异常处理(try-except),避免连接中断导致数据丢失。

注意事项

  • 保存中文时指定编码为utf-8,避免乱码。
六、框架与效率:Scrapy与分布式爬虫

核心目标:使用Scrapy框架提高开发效率,掌握分布式爬虫应对大规模数据。

必备知识点

  1. Scrapy框架:
    • 核心组件:Spider(爬虫逻辑)、Item(数据结构)、Pipeline(数据存储)、Downloader Middleware(请求处理)。
    • 工作流程:发起请求→解析响应→提取数据→存储/跟进链接。
  2. 分布式爬虫:Scrapy-Redis(基于Redis实现多爬虫协同,突破单机限制)。

代码示例:Scrapy爬虫基本结构

# 1. 创建Scrapy项目(终端命令):scrapy startproject douban_book
# 2. 在spiders目录下创建book_spider.py

import scrapy
from douban_book.items import DoubanBookItem  # 导入Item

class BookSpider(scrapy.Spider):
    name = "book_spider"  # 爬虫名称
    start_urls = ["https://book.douban.com/top250?start=0"]  # 起始URL

    def parse(self, response):
        # 解析页面,提取数据
        for book in response.css("div.pl2"):
            item = DoubanBookItem()
            item["title"] = book.css("a::attr(title)").get().strip()
            item["rating"] = book.css("span.rating_nums::text").get()
            yield item  # 提交Item到Pipeline

        # 跟进下一页
        next_page = response.css("span.next a::attr(href)").get()
        if next_page:
            yield response.follow(next_page, self.parse)  # 递归爬取下一页

最佳实践

  • Scrapy Shellscrapy shell "URL")调试解析逻辑,提高开发效率。
  • 分布式爬虫需控制并发数(CONCURRENT_REQUESTS),避免给服务器过大压力。

注意事项

  • Scrapy默认开启robots.txt协议(尊重网站爬虫规则),如需忽略可设置ROBOTSTXT_OBEY = False
七、项目开发:从需求到部署

核心目标:完整开发一个爬虫项目,包含需求分析、代码实现、测试与部署。

项目流程示例(以“电商商品价格监控”为例)

  1. 需求分析:爬取目标商品价格,低于阈值时发送邮件提醒。
  2. 技术选型:requests(请求)、BeautifulSoup(解析)、smtplib(邮件)、APScheduler(定时任务)。
  3. 代码实现:封装爬虫函数、价格判断逻辑、邮件通知功能。
  4. 测试:验证爬取稳定性、异常处理(如页面结构变化)。
  5. 部署:用nohup在Linux服务器后台运行,或打包为Docker容器。

代码示例:商品价格监控核心逻辑

import requests
from bs4 import BeautifulSoup
import smtplib
from email.mime.text import MIMEText
from apscheduler.schedulers.blocking import BlockingScheduler

# 配置
TARGET_PRICE = 500  # 目标价格阈值
URL = "https://example.com/product/123"  # 商品URL
EMAIL_CONFIG = {
    "sender": "your_email@qq.com",
    "password": "授权码",
    "receiver": "target@example.com"
}

def get_price():
    """获取商品当前价格"""
    headers = {"User-Agent": "Mozilla/5.0"}
    response = requests.get(URL, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    price_str = soup.find("span", class_="price").text.strip()
    return float(price_str.replace("¥", ""))

def send_alert(price):
    """发送价格提醒邮件"""
    msg = MIMEText(f"商品价格已降至{price}元,快去抢购!", "plain", "utf-8")
    msg["From"] = EMAIL_CONFIG["sender"]
    msg["To"] = EMAIL_CONFIG["receiver"]
    msg["Subject"] = "商品价格提醒"

    with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:
        server.login(EMAIL_CONFIG["sender"], EMAIL_CONFIG["password"])
        server.send_message(msg)

def check_price():
    """检查价格并发送提醒"""
    try:
        current_price = get_price()
        print(f"当前价格:{current_price}元")
        if current_price <= TARGET_PRICE:
            send_alert(current_price)
            print("已发送提醒邮件")
    except Exception as e:
        print(f"检查失败:{e}")

if __name__ == "__main__":
    # 定时任务:每小时检查一次
    scheduler = BlockingScheduler()
    scheduler.add_job(check_price, "interval", hours=1)
    print("监控已启动...")
    scheduler.start()

最佳实践

  • 项目中添加日志(logging模块),记录爬取状态和错误信息。
  • 部署前进行压力测试,确保在高频率请求下的稳定性。

注意事项

  • 商业网站(如电商平台)可能有严格反爬,需评估法律风险,避免滥用。

总结

Python爬虫开发的学习路径可分为7个阶段:

  1. Python基础:掌握语法和环境,是爬虫开发的基石。
  2. 网络基础:理解HTTP协议,明确爬虫与服务器的交互规则。
  3. 基础库应用:用requests发送请求,BeautifulSoup解析数据,实现静态网页爬取。
  4. 进阶技巧:处理动态网页(API/Selenium),突破反爬限制(代理/UA伪装)。
  5. 数据存储:将数据持久化到文件或数据库,满足后续分析需求。
  6. 框架与效率:通过Scrapy提高开发效率,分布式爬虫应对大规模数据。
  7. 项目实战:从需求到部署,完整实现一个实用爬虫项目。

学习过程中需注重实践,从简单网页爬取逐步过渡到复杂项目,同时严格遵守网站规则和法律法规。

Logo

更多推荐