Python爬取solanamonkey.business搜索页:遍历1-5000搜索值并导出CSV的最佳方法咨询
最佳实现方案建议
针对你需要遍历1-5000数值搜索并抓取数据存CSV的需求,我分两种场景给出具体方案,优先推荐接口抓取(效率更高),如果网站是纯前端渲染再用浏览器模拟:
一、优先尝试:直接调用搜索接口(高效无浏览器开销)
很多现代网站的搜索功能是通过API接口实现的,你可以先抓包确认:
- 打开浏览器开发者工具(F12),切换到「Network」标签
- 在搜索框输入一个测试值(比如1),点击搜索,观察是否有XHR/Fetch请求
- 找到对应的请求,查看请求方法(GET/POST)、参数、Headers(尤其是
User-Agent、Cookie这类可能验证身份的字段)
代码示例(基于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




