【Python 开发网络爬虫抓取客户订单网站数据】

以下是使用 Python 开发网络爬虫抓取客户订单网站数据的完整指南,包含技术实现、注意事项和法律合规性说明:


一、准备工作:法律与合规性

  1. 确认合法性

    • 检查目标网站的 robots.txt 文件(如 https://example.com/robots.txt)。
    • 确保遵守网站的《服务条款》(Terms of Service)。
    • 如果涉及用户隐私数据(如订单详情),需获得明确授权。
  2. 推荐替代方案

    • 优先使用网站提供的 API 接口(如 Shopify API、Amazon MWS 等)。
    • 如果无 API,需与网站方沟通授权。

二、技术实现步骤

1. 分析目标网站
  • 手动操作流程

    1. 打开浏览器开发者工具(F12),记录登录、查询订单的请求。
    2. 查看网络请求中的 HeadersCookiesForm Data 结构。
    3. 定位订单数据的返回格式(JSON/HTML)和 URL 规律。
  • 示例

    • 订单列表 URL:https://example.com/orders?page=1
    • 订单详情 URL:https://example.com/order?id=123
2. 模拟登录(如需认证)

使用 requestssession 保持登录状态:

import requests

session = requests.Session()
login_url = "https://example.com/login"
data = {
    "username": "your_username",
    "password": "your_password"
}

response = session.post(login_url, data=data)
if response.status_code == 200:
    print("登录成功")
else:
    print("登录失败")
3. 抓取订单数据
场景1:静态页面(HTML 直接返回)
from bs4 import BeautifulSoup

order_list_url = "https://example.com/orders"
response = session.get(order_list_url)
soup = BeautifulSoup(response.text, "html.parser")

# 解析订单列表
orders = []
for row in soup.select("table.orders tr"):
    order_id = row.select_one(".order-id").text
    order_date = row.select_one(".order-date").text
    orders.append({"id": order_id, "date": order_date})

print(orders)
场景2:动态页面(JavaScript 渲染)

使用 SeleniumPlaywright

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.headless = True  # 无头模式
driver = webdriver.Chrome(options=options)

driver.get("https://example.com/orders")
driver.find_element_by_id("username").send_keys("your_username")
driver.find_element_by_id("password").send_keys("your_password")
driver.find_element_by_id("login-btn").click()

# 等待页面加载完成
order_elements = driver.find_elements_by_css_selector(".order-item")
for element in order_elements:
    print(element.text)

driver.quit()
4. 处理分页和翻页
base_url = "https://example.com/orders?page={}"
for page in range(1, 10):  # 假设最多10页
    url = base_url.format(page)
    response = session.get(url)
    # 解析数据...
5. 数据存储

保存到 CSV 文件:

import csv

with open("orders.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["id", "date", "amount"])
    writer.writeheader()
    for order in orders:
        writer.writerow(order)

保存到数据库(SQLite 示例):

import sqlite3

conn = sqlite3.connect("orders.db")
cursor = conn.cursor()
cursor.execute("""
    CREATE TABLE IF NOT EXISTS orders (
        id TEXT PRIMARY KEY,
        date TEXT,
        amount REAL
    )
""")

for order in orders:
    cursor.execute("INSERT OR IGNORE INTO orders VALUES (?, ?, ?)", 
                  (order["id"], order["date"], order["amount"]))

conn.commit()
conn.close()

三、反爬虫绕过策略

  1. 设置请求头

    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",
        "Referer": "https://example.com/"
    }
    response = session.get(url, headers=headers)
    
  2. IP 代理池(需购买或自建):

    proxies = {
        "http": "http://10.10.1.10:3128",
        "https": "http://10.10.1.10:1080"
    }
    response = session.get(url, proxies=proxies)
    
  3. 随机延迟

    import time
    import random
    
    time.sleep(random.uniform(1, 3))  # 随机等待1~3秒
    

四、注意事项

  1. 频率控制

    • 请求间隔至少 3~5 秒,避免触发风控。
    • 监控网站返回的 HTTP 429 Too Many Requests 状态码。
  2. 错误处理

    try:
        response = session.get(url, timeout=10)
        response.raise_for_status()  # 检查HTTP错误
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
    
  3. 数据加密

    • 如果网站使用加密参数(如 token),需逆向 JavaScript 逻辑生成。

五、完整代码示例

import requests
from bs4 import BeautifulSoup
import time
import random

# 初始化会话
session = requests.Session()
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"
}

# 模拟登录
login_url = "https://example.com/login"
data = {"username": "user", "password": "pass"}
session.post(login_url, data=data, headers=headers)

# 抓取订单
orders = []
for page in range(1, 5):
    url = f"https://example.com/orders?page={page}"
    response = session.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")
    
    for item in soup.select(".order-item"):
        order_id = item.select_one(".id").text.strip()
        order_date = item.select_one(".date").text.strip()
        orders.append({"id": order_id, "date": order_date})
    
    time.sleep(random.uniform(1, 3))  # 随机延迟

# 保存数据
import csv
with open("orders.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.DictWriter(f, fieldnames=["id", "date"])
    writer.writeheader()
    writer.writerows(orders)

print("数据抓取完成!")

六、法律风险提示

  • 未经授权的数据抓取可能违反《计算机欺诈与滥用法》(CFAA)等法律
  • 敏感数据(如用户个人信息)必须加密存储并严格保密
  • 建议优先使用官方 API(如 Shopify、Amazon 等平台均提供合规接口)。

如果需要进一步优化或应对复杂反爬机制(如验证码、动态 Token),可考虑使用 Scrapy 框架或商业爬虫工具(如 Octoparse)。

你可能感兴趣的:(python,爬虫,数据库,开发语言,字符串,正则表达式)