最近沉迷游戏的紧,看到HB有个30美元的包,心痒痒的很。于是写个小工具,查下游戏价格:
一、使用方法
首先找到HB网站,将所有游戏的名字提取下来
然后新建一个Name.txt
将游戏名粘贴进去,注意每行一个
然后运行起来,如果需要输入验证码就手动输入,运行时控制台可以看到运行日志:
如果游戏查找不到也会提示出来:
最后会自动生成详细数据的表格文件Data.csv
:
这样一下子能看到史低价格和好评率,就能决定买不买啦!
二、代码
"""
@author: Bre Athy
@contact: https://www.zhihu.com/people/you-yi-shi-de-hu-xi
@productware: PyCharm
@file: steam价格批量查询.py
@time: 2020/4/2 0:32
"""
import time
from selenium.webdriver import Chrome,ChromeOptions
import selenium.webdriver.support.ui as ui
import selenium.webdriver.support.expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
import re
url = "https://steamdb.info/"
headUrl = "https://steamdb.info/search/?a=app&q="
tailUrl = "&type=1&category=0"
appUrl = "https://steamdb.info/app/"
def searchGameAppidDB(appid):
driver.get(appUrl+appid)
try:
table = ui.WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='table-responsive']")))
except TimeoutException:
table = None
if table:
tds = table.find_elements_by_xpath("./table/tbody/tr[@class='table-prices-current']/td")
c_price = re.search(r"\d+", tds[1].text).group()
b_price = re.search(r"\d+", tds[3].text).group()
print("当前价格:",c_price)
print("史低价格:",b_price)
p_rate_old = driver.find_elements_by_xpath("//div[contains(@class, 'header-thing-number')]")[0].text.strip()
p_rate = re.search(r".* (.*)", p_rate_old).group(1)
in_game_old = driver.find_elements_by_xpath("//div[contains(@class, 'header-thing-number')]")[1].text.strip()
in_game = "".join(in_game_old.split(","))
print("好评率:",p_rate)
print("正在游玩:",in_game)
r_date = driver.find_element_by_xpath("//table[contains(@class,'table-responsive-flex')]//tr[last()]/td[last()]").text.strip()
print("发行日期:",r_date)
return c_price+","+b_price+","+p_rate+","+in_game+","+r_date
else:return False
def searchGameNameDB(game):
driver.get(headUrl+game+tailUrl)
appid = None
try:
table = ui.WebDriverWait(driver, 30).until(EC.visibility_of_element_located((By.XPATH, "//table[@id='table-sortable']")))
except TimeoutException:
table = None
if table:
trs = table.find_elements_by_xpath("./tbody/tr")
if len(trs) == 1:
appid = trs[0].find_elements_by_xpath("./td")[0].text
versions = ""
else:
print("该游戏存在多个版本:")
appids = []
versions = ""
for tr in trs:
name = tr.find_elements_by_xpath("./td")[2].text
versions += name+","
print(name)
if "".join(game.split()).lower() == "".join(name.split()).lower():
appids.append(tr.find_elements_by_xpath("./td")[0].text)
if appids[0]:appid = appids[0]
if appid:
return searchGameAppidDB(appid)+","+versions
else:
print("该游戏未找到相关信息")
return False
else:
print("该游戏未找到相关信息")
return False
if __name__ == "__main__":
# 读取游戏名
games = []
file = open("Name.txt", encoding="utf-8")
for line in file:
games.append(line.replace("\n",""))
file.close()
print("本次共查询"+str(len(games))+"条项目")
# 增加浏览器扩展防止爬虫检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)
# 开始查询
driver.get(url)
print(8*"*"+" 开始查询 "+8*"*")
i = 1
result = "序号,游戏名,当前价格,史低价格,好评率,正在游玩,发行日期,其他版本\n"
for game in games:
print("-"*5,"第%d条"%i,"-"*5)
print(game)
str_search = searchGameNameDB(game)
if str_search:
result += str(i)+","+game+","+str_search+"\n"
else:
result += str(i)+","+game+","+"未查找到相关游戏信息"+","+headUrl+game+tailUrl+"\n"
i += 1
driver.close()
with open("data.csv","w",encoding="utf-8-sig")as f:
f.write(result)