You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python解析Steam市场价格导出Excel问题排查求助

问题排查与修复:Steam市场俄文数据爬取问题

核心错误分析

你的代码存在几个关键问题,导致无法获取多页数据和俄文信息:

  • URL参数位置错误:l=russian&cc=ru被放在锚点#之后,锚点内容仅在浏览器端生效,不会发送给Steam服务器,因此服务器不会返回俄文界面和卢布计价的数据。
  • 分页参数无效:分页标识p{page}_popular_desc同样在锚点后,服务器无法识别分页请求,所有请求实际都返回第一页内容。
  • CSS选择器转义错误:代码中使用了HTML转义字符>,而BeautifulSoup的CSS选择器需要直接使用>,否则无法匹配到价格元素。
  • 请求头缺失:Steam市场会验证请求的User-Agent,缺失该头可能导致请求被限制或返回异常内容。

修正后的代码

from multiprocessing import Pool
from openpyxl import Workbook
from openpyxl.utils import get_column_letter
import requests
from bs4 import BeautifulSoup


def parse_page(page_num, url):
    page_url = url.format(page=page_num)
    # 添加请求头模拟浏览器访问
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
    }
    response = requests.get(page_url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    results = []

    # 遍历页面上的物品(每页最多10个)
    for i in range(1, 11):
        element = soup.select_one(f'#result_{i}_name')
        # 修正CSS选择器,去掉转义的>,直接用>
        price = soup.select_one(
            f'#result_{i} > div.market_listing_price_listings_block > div.market_listing_right_cell.market_listing_their_price > span.market_table_value.normal_price > span.normal_price')

        # 处理价格数据
        if price:
            text_title = price.text.strip()
            results.append(((page_num - 1) * 10 + i + 1, 3, text_title))
        else:
            results.append(((page_num - 1) * 10 + i + 1, 3, f"Элемент не найден на странице {page_num}"))

        # 处理物品名称和序号
        if element:
            item_name = element.text.strip()
            item_index = (page_num - 1) * 10 + i
            results.append(((page_num - 1) * 10 + i + 1, 1, item_index))
            results.append(((page_num - 1) * 10 + i + 1, 2, item_name))
        else:
            results.append(((page_num - 1) * 10 + i + 1, 1, f"Элемент не найден на странице {page_num}"))

    return results


def parse(url):
    workbook = Workbook()
    sheet = workbook.active
    sheet.cell(row=1, column=1, value="№")
    sheet.cell(row=1, column=2, value="Название предмета")
    sheet.cell(row=1, column=3, value="Цена на ТМ")

    with Pool() as pool:
        page_nums = range(1, 11)
        results = pool.starmap(parse_page, [(page_num, url) for page_num in page_nums])

        for result in results:
            for row, column, value in result:
                sheet.cell(row=row, column=column, value=value)

    # 设置列宽
    sheet.column_dimensions[get_column_letter(1)].width = 5
    sheet.column_dimensions[get_column_letter(2)].width = 80
    sheet.column_dimensions[get_column_letter(3)].width = 30

    workbook.save("results.xlsx")
    print("Результаты сохранены в файл results.xlsx")


def main():
    # 修正URL:将所有参数放在锚点前,分页参数使用page查询参数
    url = "https://steamcommunity.com/market/search?appid=730&l=russian&cc=ru&p={page}&sort_column=popular&sort_dir=desc"
    
    parse(url)


if __name__ == '__main__':
    main()

关键修复说明

  1. URL格式修正:将l=russian&cc=ru和分页参数p={page}移至锚点#之前,确保服务器能接收并解析这些参数,返回俄文界面和卢布价格。
  2. CSS选择器修复:把>替换为>,让选择器能正确匹配价格元素。
  3. 添加请求头:模拟浏览器的User-Agent,避免被Steam的反爬机制拦截。
  4. 数据处理优化:对获取的文本内容调用strip()去除多余空格,让Excel内容更整洁。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 22:08:09