使用Python Beautifulsoup刮擦多个页面 - 仅从最后一页返回数据

时间:2017-08-19 18:48:42

标签: python web-scraping beautifulsoup

我正在尝试遍历多个页面以使用Python和Beautifulsoup来抓取数据。我的脚本适用于一个页面,但是当尝试迭代多个页面时,它只返回最后一页抓取的数据。我认为循环或存储/追加GL_REPOSITORY列表的方式可能有问题。

这是我到目前为止所得到的 - 非常感谢任何帮助。

player_data

3 个答案:

答案 0 :(得分:1)

这是缩进问题或声明问题,具体取决于您期望的结果。

  • 如果您需要打印每页的结果:

您可以在打印前添加4个空格(player_data)来解决此问题。

如果让print语句在for循环块之外,它将在循环结束后只执行一次。因此,它可以显示的唯一值是从{for循环的最后一次迭代中泄漏的player_data的最后一个值。

  • 如果您想将所有结果存储在player_data中并在最后打印:

您必须在for循环之前和之前声明player_data

player_data = []
for n in pages:
    # [...]

答案 1 :(得分:1)

您应该在循环外部使用player_data列表定义,否则只会存储最后一次迭代的结果。

答案 2 :(得分:0)

import requests
from bs4 import BeautifulSoup

# Starting url (class of 2007)
base_url = 'http://www.espn.com/college-sports/basketball/recruiting/databaseresults/_/class/2007/page/'

# Number of pages to scrape (Not inclusive, so number + 1)
pages = list(map(str,range(1,3)))
# In Python 3, map returns an iterable object of type map, and not a subscriptible list, which would allow you to write map[i]. To force a list result, write
# url for starting page
url = base_url + pages[0]

for n in pages:
    # Create url
    url = base_url + n

    # Parse data using BS
    print('Downloading page %s...' % url)
    res = requests.get(url)
    res.raise_for_status()

    # Creating bs object
    soup = BeautifulSoup(res.text, "html.parser")

    table = soup.find('table')

    # Get the data
    data_rows = soup.findAll('tr')[1:]

    player_data = []
    for tr in data_rows:
        tdata = []
        for td in tr:
            tdata.append(td.getText())

            if td.div and td.div['class'][0] == 'school-logo':
                tdata.append(td.div.a['href'])

        player_data.append(tdata)

print(player_data)