python批量查询steam游戏价格

最近沉迷游戏的紧,看到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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章