使用urllib2丢失源页面信息

时间:2014-04-03 06:15:28

标签: python web-scraping beautifulsoup urllib2 steam

我正在尝试从数字游戏发行网站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)的不同计算机上试过这个,我得到了相同的结果。

如何获取我正在寻找的数据?

感谢您的考虑。

2 个答案:

答案 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)

使用urllib2read()时,您必须反复阅读,直到您点击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)