我正在尝试从数字游戏发行网站Steam(store.steampowered.com)上列出的游戏中搜索“游戏代码”数据(与HTML代码不同)。据我所知,这些信息无法通过Steam API获得。
一旦我有一个页面的原始源数据,我想将它传递给beautifulsoup进行进一步解析,但我有一个问题 - urllib2似乎没有读取我想要的信息( request 也不起作用,即使它在浏览器中查看时显然位于源页面中。 例如,我可能会下载游戏“7 Days to Die”(http://store.steampowered.com/app/251570/)的页面。在Chrome中查看浏览器源页面时,我可以看到有关游戏“标签”的以下相关信息 接近结束,从第1615行开始:
<script type="text/javascript"> $J( function() { InitAppTagModal( 251570, {"tagid":1662,"name":"Survival","count":283,"browseable":true}, {"tagid":1659,"name":"Zombies","count":274,"browseable":true}, {"tagid":1702,"name":"Crafting","count":248,"browseable":true},...
在initAppTagModal中,有标签“Survival”,“Zombies”,“Crafting”等,其中包含我想收集的信息。
但是当我使用urllib2获取页面源时:
import urllib2 url = "http://store.steampowered.com/app/224600/" #7 Days to Die page page = urllib2.urlopen(url).read()
我感兴趣的源页面部分没有保存在我的“page”变量中,而是1555行以下的所有内容都是空白的,直到结束的body和html标记。导致此(包括回车):
</div><!-- End Footer --> </body> </html>
在空白处我需要的源代码(以及其他代码)应该是。
我在不同的安装了python 2.7(Windows机器和Mac)的不同计算机上试过这个,我得到了相同的结果。
如何获取我正在寻找的数据?
感谢您的考虑。
答案 0 :(得分:3)
好吧,我不知道我是否遗漏了某些东西,但是它正在为我使用请求:
import requests
# Getting html code
url = "http://store.steampowered.com/app/251570/"
html = requests.get(url).text
更重要的是,请求的数据采用json格式,因此以这种方式提取数据很容易:
# Extracting javscript object (a json like object)
start_tag = 'InitAppTagModal( 251570,'
end_tag = '],'
startIndex = html.find(start_tag) + len(start_tag)
endIndex = html.find(end_tag, startIndex) + len(end_tag) - 1
raw_data = html[startIndex:endIndex]
# Load raw data as python json object
data = json.loads(raw_data)
你会看到这样一个美丽的json对象(这是你需要的信息,对吗?):
[
{
"count": 283,
"browseable": true,
"tagid": 1662,
"name": "Survival"
},
{
"count": 274,
"browseable": true,
"tagid": 1659,
"name": "Zombies"
},
{
"count": 248,
"browseable": true,
"tagid": 1702,
"name": "Crafting"
}......
我希望它有所帮助....
<强>更新:强>
好的,我现在看到你的问题,似乎问题出现在页面224600.在这种情况下,网页要求你确认你的年龄才能向你显示游戏信息。无论如何,只需发布确认年龄的表格即可轻松解决。这是更新的代码(我创建了一个函数):
def extract_info_games(page_id):
# Create session
session = requests.session()
# Get initial html
html = session.get("http://store.steampowered.com/app/%s/" % page_id).text
# Checking if I'm in the check age page (just checking if the check age form is in the html code)
if ('<form action="http://store.steampowered.com/agecheck/app/%s/"' % page_id) in html:
# I'm being redirected to check age page
# let's confirm my age with a POST:
post_data = {
'snr':'1_agecheck_agecheck__age-gate',
'ageDay':1,
'ageMonth':'January',
'ageYear':'1960'
}
html = session.post('http://store.steampowered.com/agecheck/app/%s/' % page_id, post_data).text
# Extracting javscript object (a json like object)
start_tag = 'InitAppTagModal( %s,' % page_id
end_tag = '],'
startIndex = html.find(start_tag) + len(start_tag)
endIndex = html.find(end_tag, startIndex) + len(end_tag) - 1
raw_data = html[startIndex:endIndex]
# Load raw data as python json object
data = json.loads(raw_data)
return data
使用它:
extract_info_games(224600)
extract_info_games(251570)
享受!
答案 1 :(得分:-1)
使用urllib2
和read()
时,您必须反复阅读,直到您点击EOF,才能阅读整个HTML源代码。
import urllib2
url = "http://store.steampowered.com/app/224600/" #7 Days to Die page
url_handle = urllib2.urlopen(url)
data = ""
while True:
chunk = url_handle.read()
if not chunk:
break
data += chunk
另一种方法是使用requests
module作为:
import requests
r = requests.get('http://store.steampowered.com/app/251570/')
soup = BeautifulSoup(r.text)