我正在尝试收获一些国际象棋游戏,并通过一些帮助完成了基本操作。主要功能如下所示:

import requests
import urllib2
from bs4 import BeautifulSoup

r = requests.get(userurl)
soup = BeautifulSoup(r.content)
gameids= []
for link in soup.select('a[href^=/livechess/game?id=]'):
    gameid = link['href'].split("?id=")[1]
    gameids.append(int(gameid))
    return gameids


基本上发生的是,我进入特定用户的url,例如http://www.chess.com/home/game_archive?sortby=&show=live&member=Hikaru,grab html并刮下游戏标识。
但是,有些用户玩过很多游戏,由于每页只显示50个游戏,因此他们的游戏会列在多个页面上。
http://www.chess.com/home/game_archive?sortby=&show=live&member=Hikaru&page=2(或3/4/5等)
那就是我被困住的地方,如何浏览页面并获取ID?

最佳答案

通过循环进行分页,并单击“下一步”链接,直到找不到为止。

换句话说,来自:



点击“下一步”链接,直到:



工作代码:

from urlparse import urljoin

import requests
from bs4 import BeautifulSoup

base_url = 'http://www.chess.com/'
game_ids = []

next_page = 'http://www.chess.com/home/game_archive?sortby=&show=live&member=Hikaru'
while True:
    soup = BeautifulSoup(requests.get(next_page).content)

    # collect the game ids
    for link in soup.select('a[href^=/livechess/game?id=]'):
        gameid = link['href'].split("?id=")[1]
        game_ids.append(int(gameid))

    try:
        next_page = urljoin(base_url, soup.select('ul.pagination li.next-on a')[0].get('href'))
    except IndexError:
        break  # exiting the loop if "Next" link not found

print game_ids


对于您提供的URL(Hikaru GM),它将在所有页面上显示224个游戏ID的列表。

08-06 10:08