You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python爬取solanamonkey.business搜索页:遍历1-5000搜索值并导出CSV的最佳方法咨询

最佳实现方案建议

针对你需要遍历1-5000数值搜索并抓取数据存CSV的需求,我分两种场景给出具体方案,优先推荐接口抓取(效率更高),如果网站是纯前端渲染再用浏览器模拟:

一、优先尝试:直接调用搜索接口(高效无浏览器开销)

很多现代网站的搜索功能是通过API接口实现的,你可以先抓包确认:

  • 打开浏览器开发者工具(F12),切换到「Network」标签
  • 在搜索框输入一个测试值(比如1),点击搜索,观察是否有XHR/Fetch请求
  • 找到对应的请求,查看请求方法(GET/POST)、参数、Headers(尤其是User-AgentCookie这类可能验证身份的字段)

代码示例(基于requests+csv)

import requests
import csv
import time
from random import uniform

# 替换为你抓包得到的真实接口URL和参数
SEARCH_API_URL = "https://solanamonkey.business/api/search"
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",
    # 如果需要Cookie,从浏览器复制过来
    "Cookie": "your_cookie_here"
}

# 初始化CSV文件
with open("solanamonkey_data.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    # 先写入表头,根据实际返回数据调整字段
    writer.writerow(["搜索值", "字段1", "字段2", "字段3"])

    for num in range(1, 5001):
        try:
            # 构造请求参数,根据抓包结果调整
            params = {"query": str(num)}
            # 发送请求(GET示例,POST的话用requests.post并传json参数)
            response = requests.get(SEARCH_API_URL, headers=HEADERS, params=params)
            response.raise_for_status()  # 抛出HTTP错误
            data = response.json()

            # 解析数据,根据实际返回结构提取需要的字段
            if data.get("results"):
                result = data["results"][0]
                row = [num, result.get("field1"), result.get("field2"), result.get("field3")]
                writer.writerow(row)
                print(f"成功抓取数值 {num} 的数据")
            else:
                print(f"数值 {num} 无搜索结果")

            # 随机延迟,避免被反爬
            time.sleep(uniform(0.5, 1.5))

        except Exception as e:
            print(f"抓取数值 {num} 时出错: {str(e)}")
            # 可以记录错误日志,或者重试
            time.sleep(2)

二、备选方案:模拟浏览器操作(适合纯前端渲染网站)

如果网站是纯前端渲染(搜索结果通过JS动态加载,抓不到API接口),可以用Selenium模拟浏览器操作:

代码示例(基于Selenium+csv)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import csv
import time
from random import uniform

# 初始化Chrome浏览器,需要先下载ChromeDriver并配置路径
driver = webdriver.Chrome()
driver.get("https://solanamonkey.business/search")
driver.maximize_window()

# 初始化CSV文件
with open("solanamonkey_data.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow(["搜索值", "字段1", "字段2", "字段3"])

    for num in range(1, 5001):
        try:
            # 找到搜索框并输入数值
            search_box = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.XPATH, "//input[@type='text']"))
            )
            search_box.clear()
            search_box.send_keys(str(num))

            # 找到搜索按钮并点击(或者按回车)
            search_button = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.XPATH, "//button[contains(text(), 'Search')]"))
            )
            search_button.click()

            # 等待结果加载
            WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.CLASS_NAME, "result-item"))
            )

            # 提取数据,根据页面元素结构调整
            result_items = driver.find_elements(By.CLASS_NAME, "result-item")
            if result_items:
                item = result_items[0]
                field1 = item.find_element(By.CLASS_NAME, "field1").text
                field2 = item.find_element(By.CLASS_NAME, "field2").text
                field3 = item.find_element(By.CLASS_NAME, "field3").text
                writer.writerow([num, field1, field2, field3])
                print(f"成功抓取数值 {num} 的数据")
            else:
                print(f"数值 {num} 无搜索结果")

            # 随机延迟
            time.sleep(uniform(1, 2))

        except Exception as e:
            print(f"抓取数值 {num} 时出错: {str(e)}")
            time.sleep(3)

# 关闭浏览器
driver.quit()

关键注意事项

  • 反爬规避:一定要设置随机延迟,避免短时间内大量请求被网站封禁;可以轮换User-Agent,或者使用代理IP(如果遇到403/验证码)
  • 数据解析:上述代码中的字段提取逻辑需要根据网站实际的HTML结构或API返回结构调整,建议用浏览器开发者工具定位元素或查看JSON结构
  • 合规性:在爬取前请阅读网站的robots.txt和服务条款,确保你的爬取行为符合规定,避免法律风险
  • 异常处理:代码中加入了基础的异常捕获,你可以进一步完善,比如记录错误日志、重试失败的请求等

内容的提问来源于stack exchange,提问作者Escanor

火山引擎 最新活动