原价游戏太贵?爬取steam游戏优惠信息

本文介绍了如何通过requests库发起请求,配合lxml解析器抓取Steam游戏的折扣信息,包括异常处理和代码示例,帮助读者实现自动查找优惠活动。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求分析

上周,我发布了通过scrapy爬取游戏发售信息,但是呢,很快一个小伙伴就联系我说,“仙草哥哥,虽然新游戏很好,但是如果原价购买这些游戏的话,太贵了。能不能做一个游戏折扣信息的爬取呢?”

游戏折扣信息的爬取,这也不是难事情啦,每次通过一样的方式,就可以实现了!即使你不会python和爬虫也不要紧,只要看看我以前的实现,照着进行简单的修改,就可以完成任务了

首先,很确定的是,还是通过requests发起请求,通过lxml处理,最后打印或者保存即可

为什么要通过requests发起请求呢,因为这是一种非常简单的发起请求的方式

那么为什么要通过lxml处理呢,为什么不用正则表达式,或者是字符串处理的函数呢?因为如果解析的是一个标准的,规范的html文本的话,通过lxml进行xpath的解析,是非常容易的一件事情。如果通过正则表达式解析的话,会比较麻烦和繁琐。因此,在爬虫的程序中,最简单的方式,我认为就是通过lxml进行解析

因此,每次只要通过同样的方法,实现一个requests和lxml的程序,就可以完成任务了,非常简单又很轻松

实现分析

首先,要通过requests发起请求

url = "游戏地址"

r = requests.get(url)

不过与平常不同的是,由于steam游戏网站的性能问题,想要访问到该网站不是很稳定,因此不能像平常一样,只进行一次的请求,必须要多进行几次请求,以及进行异常的处理。如果一次请求不能成功得到响应的话,那么就要多请求几次

try:
    r = requests.get(url)
except:
    r = requests.get(url)

当然,如果这样的话,只能进行一次重复的请求,不是很好,应该通过循环多进行几次请求

# 注意:这样的写法是错误的
# 不能把continue写在这里
try:
    while True:
        r = requests.get(url)
except:
    continue

循环可以放在异常处理的外边,这样就可以在同一个循环中完成continue了

while True:
    try:
        r = requests.get(url)
        break
    else:
        continue

为什么这样写是可以的呢,因为requests.get()这一步是可能抛出异常的,而break这一步一定不可能抛出异常,所以如果requests.get()这一步没有抛出异常,那么一定可以正常的执行到break,所以这一段内容是正确的

然后,就应该通过lxml对内容进行解析了

div = html.xpath("//div[@class='responsive_search_name_combined']")

for i in div:
	title = i.xpath(".//span[@class='title']/text()")[0]
	text += "游戏名:"
	text += title
	discount = i.xpath(".//div[@class='col search_discount responsive_secondrow']/span/text()")[0]
	text += "折扣:"
	text += discount
	price = i.xpath(".//div[@class='col search_price discounted responsive_secondrow']/span/strike/text()")[0]
	text += "原价:"
	text += price
	new_price = i.xpath(".//div[@class='col search_price discounted responsive_secondrow']/text()")[1]
	text += "现价:"
	text += new_price

这样解析完成之后,就可以得到我们需要的全部内容了。其实总结起来不外乎两步,requests请求,lxml解析。只要学会了这两个点,就能很好的完成爬虫程序了

完整代码展示

import requests
import base64
from lxml import etree

base_url = "aHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL3NlYXJjaC8/c3BlY2lhbHM9MQ=="
url = base64.b64decode(base_url).decode()

headers = {"user-agent": "Mozilla/5.0"}

for i in range(10):
	try:
		r = requests.get(url, headers=headers, timeout=8)
		break
	except:
		print("网络连接不太好,请等待...")
		if i == 9:
			print("网络连接失败,程序已终止...")
			raise
		continue

html = etree.HTML(r.text)

div = html.xpath("//div[@class='responsive_search_name_combined']")

text = ""

for i in div:
	title = i.xpath(".//span[@class='title']/text()")[0]
	if not len(i.xpath(".//div[@class='col search_discount responsive_secondrow']/span/text()")):
		continue
	text += "游戏名:"
	text += title
	text += "\n"
	discount = i.xpath(".//div[@class='col search_discount responsive_secondrow']/span/text()")[0]
	text += "折扣:"
	text += discount
	text += "\n"
	price = i.xpath(".//div[@class='col search_price discounted responsive_secondrow']/span/strike/text()")[0]
	text += "原价:"
	text += price
	text += "\n"
	new_price = i.xpath(".//div[@class='col search_price discounted responsive_secondrow']/text()")[1]
	text += "现价:"
	text += new_price
	text += "\n"
	text += "\n"

print(text)

运行效果展示

 从这里,我们就可以看出目前gta5,巫师3狂猎,以及赛博朋克2077都在打折优惠了。而且幅度力度都很大,在半价以上。有了这样的程序,妈妈再也不用担心我错过优惠活动啦


多数爬虫程序很快就会由于对方地址和服务变化导致失效,因此无法保证当你看到这篇文章时,文中的程序仍然可以使用。如果文中的程序已失效,需要自行或者求助他人进行重写

另外,切勿将爬虫程序用于非法用途,或者错误的滥用造成对方网站的负担,谢谢!

### Steam 游戏评论数据采集方法 为了实现从 Steam 平台抓取游戏评论的功能,可以采用 Python 编写的网络爬虫程序。此过程涉及向特定 URL 发送 HTTP 请求并解析返回的数据。 #### 使用 `requests` 库发送请求 通过构建带有适当参数的 GET 请求来访问 API 接口,这些参数包括应用 ID (`appid`) 和分页标记 (`cursor`) 等[^1]: ```python import requests url = f"https://store.steampowered.com/appreviews/{{appid}}?cursor={{nextCursor}}&language=schinese&day_range=365&review_type=all&purchase_type=all&filter=recent" response = requests.get(url.format(appid="your_game_id", nextCursor="initial_cursor_value")) data = response.json() ``` #### 解析 JSON 响应体中的评论信息 API 返回的是 JSON 格式的字符串,在这里将其转换成字典对象以便处理其中的内容,比如提取每条评论的时间戳、用户名以及正文部分: ```python for review in data['reviews']: timestamp = review["timestamp_created"] username = review["author"]["steamid"] content = review["review"] print(f"[{username}] at {timestamp}: \n\t{content}\n") ``` #### 处理翻页逻辑 由于每次调用仅能获取有限数量的结果集,因此需要根据响应里的游标(`cursor`)字段决定是否继续加载更多记录直至遍历完毕整个列表。 ```python while True: url_with_cursor = url.format(appid="your_game_id", nextCursor=data['cursor']) new_response = requests.get(url_with_cursor) more_data = new_response.json() if not more_data['success'] or not more_data['reviews']: break # Process reviews here... data = more_data # Update cursor and other metadata for the next iteration. ``` #### 遵守网站规则与道德准则 值得注意的是,在开发此类应用程序时应当遵循目标站点的服务条款,并尊重用户的隐私权和其他合法权益;同时也要注意控制频率以免给服务器造成过重负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值