为什么我的程序只输出多页抓取操作的最后一页?

时间:2017-10-31 12:11:14

标签: python web-scraping beautifulsoup

我正在尝试使用beautifulsoup概念抓取多个页面,但我只得到最后一页结果作为输出,请建议正确的方法。以下是我的代码。

# For every page 

for page in range(0,8):
    # Make a get request
    response = get('http://nationalacademyhr.org/fellowsdirectory?page=0%2C{}' + format(page))
    # Pause the loop
    sleep(randint(8,15))
     # Monitor the requests
    requests += 1
    elapsed_time = time() - start_time
    print('Request:{}; Frequency: {} requests/s'.format(requests, requests/elapsed_time))
    clear_output(wait = True)

    html_soup = BeautifulSoup(response.text, 'html.parser')
    all_table_info = html_soup.find('table', class_ = "views-table cols-4")


    for name in all_table_info.find_all('div', 
           class_="views-field views-field-view"):
    names.append(name.text.replace("\n", " ")if name.text else None)


    for organization in all_table_info.find_all('td', 
           class_="views-field views-field-field-employer"):
    orgs.append(organization.text.strip() if organization.text else None)


    for year in all_table_info.find_all('td', 
           class_ = "views-field views-field-view-2"):
    Years.append(year.text.strip() if year.text else None)


    df = pd.DataFrame({'Name' : names, 'Org' : orgs, 'year' : Years })

    print (df)

2 个答案:

答案 0 :(得分:2)

输入错误:加号而不是点。你需要'http://nati...ge=0%2C{}'.format(page), 但你写道 'http://nati...ge=0%2C{}' + format(page)

在页码之前具有大括号的网址最终位于同一页面。

编辑:

如果我不清楚,你需要改变这条线 response = get('http://nationalacademyhr.org/fellowsdirectory?page=0%2C{}' + format(page)) response = get('http://nationalacademyhr.org/fellowsdirectory?page=0%2C{}'.format(page))

在第一种情况下,结果网址还包含子字符串' {}',这会导致问题。

答案 1 :(得分:0)

注意:网站上有9个页面由page=0,0标识到page=0,8。你的循环应该使用range(9)。或者,更好的是,加载第一页,然后使用next链接获取下一页的网址。按照next链接迭代所有页面,直到页面上没有next链接。

除了标识问题的xhancar's answer之外,更好的方法是在构建URL时避免字符串操作,而是让requests为您构建URL查询字符串:

for page in range(9):
    params = {'page': '0,{}'.format(page)}
    response = get('http://nationalacademyhr.org/fellowsdirectory', params=params)

params参数传递给requests.get(),后者将值添加到URL查询字符串中。查询参数将被正确编码,例如, ,已替换为%2C