我处理的脚本会自动比较不同网站上的游戏价格(即时游戏,G2A等)。以下脚本适用于某些网站,但对于其他网站则不然。代码如下所示:
import bs4
import requests
res1 = requests.get('https://www.g2a.com/?search=dead%20by%20daylight')
res1.raise_for_status()
soup = bs4.BeautifulSoup(res1.text,'html.parser')
elems = soup.find('div', {'id': 'content-landing'})
children = elems.find('div', {'class': 'mp-product-info'})
price = children.find('strong', {'class': 'mp-pi-price-min'})
price.text.strip()
问题是价格变量包含正确的标签
<strong class="mp-pi-price-min"></strong>
但它没有存储价格(根据浏览器,它应该如下所示:)
<strong class="mp-pi-price-min">10,16€</strong>
使用CSS-Selector执行相同的代码,返回相同的结果。
答案 0 :(得分:0)
如果您打开Chrome开发者工具或Firebug,您会看到当您请求该页面时,它会通过XHR
拨打一个返回游戏和价格的服务。
你需要对你不想要的内容进行条带化,将其解析为json并获得结果。
以下是该电话的一个示例:
from bs4 import BeautifulSoup
import requests
import re
import json
response = requests.get('https://www.g2a.com/lucene/search/filter?jsoncallback=jQuery111002521088376353553_1491736907010&skip=28837%2C28838%2C28847%2C28849%2C28852%2C28856%2C28857%2C28858%2C28859%2C28860%2C28861%2C28862%2C28863%2C28867%2C28868%2C28869%2C29472%2C29473%2C29474%2C29475%2C29476%2C29482%2C29486%2C33104&minPrice=0.00&maxPrice=640.00&cn=&kr=&stock=all&event=&platform=0&search=dead+by+daylight&genre=0&cat=0&sortOrder=popularity+desc&start=0&rows=12&steam_app_id=&steam_category=&steam_prod_type=&includeOutOfStock=false&includeFreeGames=false&_=1491736907012')
json_object = json.loads('{"data":%s}}' % (response.content.decode("utf-8").replace("jQuery111002521088376353553_1491736907010(", "")[:-2].replace("\'", "")))
for game in json_object["data"]["docs"]:
print ("Name: %s (Price: %s)" % (game["name"], game["minPrice"]))
它会打印:
姓名:死于白天STEAM CD-KEY GLOBAL(价格:10.16)
名称:死于白天STEAM CD-KEY LATAM(价格:5)
名称:白天死亡 - 肉体和泥浆DLC STEAM CD-KEY GLOBAL(价格:4.99)
名称:死于日光豪华版STEAM CD-KEY GLOBAL(价格:13.99)
名称:死于白天STEAM CD-KEY RU / CIS(价格:4.95)
名称:白天死亡 - 80年代手提箱DLC STEAM CD-KEY GLOBAL(价格:2.99)
姓名:死于白天STEAM CD-KEY SEA(价格:6)
另请注意,您需要更改要搜索的游戏的&search=...
部分(urlencoded)和_=
部分以获取当前的unix时间戳。