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()
关键修复说明
- URL格式修正:将
l=russian&cc=ru和分页参数p={page}移至锚点#之前,确保服务器能接收并解析这些参数,返回俄文界面和卢布价格。 - CSS选择器修复:把
>替换为>,让选择器能正确匹配价格元素。 - 添加请求头:模拟浏览器的
User-Agent,避免被Steam的反爬机制拦截。 - 数据处理优化:对获取的文本内容调用
strip()去除多余空格,让Excel内容更整洁。
内容的提问来源于stack exchange,提问作者Crashermage
相关产品推荐
相关产品推荐

