Python美丽的汤显示每页的相同结果

时间:2015-12-29 05:34:19

标签: python python-3.x web-scraping beautifulsoup

我正在尝试使用python 3.5和漂亮的汤来清除蒸汽的每一页上的标题以播放搜索结果。但是,返回的结果只是第一页上的标题,而不是后续页面上的标题:

import requests 
from bs4 import BeautifulSoup

titles_list=[]

for i in range(3):      # Number of pages plus one 
    print(i)
    url = 'http://store.steampowered.com/genre/Free%20to%20Play/?tab=MostPlayed#p' + str(i)
    print(url)

    soup = BeautifulSoup(requests.get(url).content)

    titles=soup.find_all("div",{"class":"tab_item_name"})

    for item in titles:
         try:
              name=item.text
         except:
              name='sdfsd'   

         print(name)
         titles_list.append(name)

控制台结果(我知道0和1相同,但i = 2应显示不同的游戏组合):

0
http://store.steampowered.com/genre/Free%20to%20Play/?tab=MostPlayed#p0
Dota 2
Team Fortress 2
Warframe
Clicker Heroes
Unturned
Path of Exile
War Thunder
SMITE
Trove
AdVenture Capitalist
1
http://store.steampowered.com/genre/Free%20to%20Play/?tab=MostPlayed#p1
Dota 2
Team Fortress 2
Warframe
Clicker Heroes
Unturned
Path of Exile
War Thunder
SMITE
Trove
AdVenture Capitalist
2
http://store.steampowered.com/genre/Free%20to%20Play/?tab=MostPlayed#p2
Dota 2
Team Fortress 2
Warframe
Clicker Heroes
Unturned
Path of Exile
War Thunder
SMITE
Trove
AdVenture Capitalist

有谁知道这里发生了什么?

3 个答案:

答案 0 :(得分:1)

您可以使用获取数据的基础GET请求,这对于解析更可靠,因为您没有获得javascript使用实际页面的URL呈现的详细信息。

使用firebug,我发现基础GET请求是(第2页):

  

http://store.steampowered.com/search/tabpaginated/render/?query=&start=10&count=10&genre=37&tab=MostPlayed&cc=IN&l=english

从那里开始,使用以下脚本获取所有32页的所有标题。

import requests
import json
from bs4 import BeautifulSoup
import re

for i in range(0, 32):
    start_count = i * 10;
    jsonResponse = requests.get("http://store.steampowered.com/search/tabpaginated/render/"
                                "?query=&start="+str(start_count)+"&count=10&genre=37&tab=MostPlayed&cc=IN&l=english")
    data = json.loads(jsonResponse.text)
    soup = BeautifulSoup(data["results_html"], "html.parser")
    alltitles = soup.find_all(attrs={'class': re.compile('tab_item_name')})
    for title in alltitles:
        print(title.text)

答案 1 :(得分:0)

我认为这里发生的是以" Dota 2"开头的列表。始终按原始请求加载到http://store.steampowered.com/genre/Free%20to%20Play/?tab=MostPlayed

您可以在浏览器的开发者工具中检查它是否始终首先加载,而不管#p之后的数字。这也是您requests.get(url).content获得的内容。

如果您在浏览器的末尾使用#p2刷新网址,则有时可以在显示其他列表之前看到第一个列表一秒钟。

我不确定在快速查看之后加载其他列表的内容,但必须是在请求发生后发生的事情。

答案 2 :(得分:0)

传统上,#片段是页面内部客户端锚点,实际上并未传递给服务器。客户端JavaScript经常将其用于各种目的,因此这可能是这里发生的事情。您需要在客户端页面上运行或模拟JavaScript以获得后续结果。