Как веб-очистить сайт, который имеет один и тот же URL для нескольких переходов страницы? - PullRequest
0 голосов
/ 25 февраля 2019

Я использую Beautiful Soup и хочу собрать данные (сборы за перевод и имена игроков) с этого сайта - www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0? saison_id = 2000

Но вы заметите, что на странице отображаются только первые 25 имен.Вы должны нажать «Далее», чтобы просмотреть следующие 25 имен и т. Д. Для десяти страниц.Тем не менее, URL не меняется.Я использую этот код от fcpython.com -

>

 import requests
from bs4 import BeautifulSoup

import pandas as pd

headers = {'User-Agent': 
           'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}

page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0?saison_id=2000"
page1 = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0?saison_id=2018&land_id=157&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=s"
page2 = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0?saison_id=2018&land_id=157&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=s"

pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')

Players = pageSoup.find_all("a", {"class": "spielprofil_tooltip"})
Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})

#My Code for printing all 25 names and fees

#for i in range(0, 25):
    #print(Players[i].text, Values[i].text)

PlayersList = []
ValuesList = []

for i in range(0,25):
    PlayersList.append(Players[i].text)
    ValuesList.append(Values[i].text)

df = pd.DataFrame({"Players":PlayersList,"Values":ValuesList})

print(df.head(25))

Что я делаю не так?Что я могу сделать, чтобы получить все результаты за один раз?Или получить их вообще (так как я не могу пройти больше 25)?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете использовать requests.session и использовать запрос ajax, выполненный веб-сайтом, который вы можете найти с помощью своего браузера, как предложено @NineBerry в комментариях.

Это добавит всех игроков и значения в список:

headers = {'User-Agent': 
       'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}

page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0?saison_id=2000"
PlayersList = []
ValuesList = []
page_num = 2
session = requests.Session()
while True:
    pageTree = session.get(page, headers=headers)
    pageSoup = BeautifulSoup(pageTree.content, 'html.parser')
    Players = pageSoup.find_all("a", {"class": "spielprofil_tooltip"})
    Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})
    for player, value in zip(Players, Values):
        PlayersList.append(player.text)
        ValuesList.append(value.text)
    if pageSoup.find("li", {"title": "Go to next page"}):
        page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/ajax/yw2/saison_id/2000/plus/0/galerie/0/page/{}?ajax=yw2".format(page_num)
        page_num +=1
    else:
        break
0 голосов
/ 26 февраля 2019

Пожалуйста, найдите следующий код для достижения вашей цели. Вы должны использовать webdriver, чтобы нажать следующую кнопку.

from selenium import webdriver
import requests
from bs4 import BeautifulSoup
import pandas as pd

driver = webdriver.Chrome()

driver.get("https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik/top/plus/0/galerie/0?saison_id=2000")
pageSoup = BeautifulSoup(driver.page_source, 'html.parser')
PlayersList = []
ValuesList = []

for loop in range(0,10):
  Players = pageSoup.find_all("a", {"class": "spielprofil_tooltip"})
  Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})
  for pl, val in zip(Players, Values):

    PlayersList.append(pl.text)
    ValuesList.append(val.text)
  if loop==9:
      break
  else:
   driver.find_element_by_css_selector("li.naechste-seite").click()


df = pd.DataFrame({"Players":PlayersList,"Values":ValuesList})

print(df.head(250))

Выход:

                     Players   Values
0                  Luís Figo  £54.00m
1              Hernán Crespo  £51.13m
2              Marc Overmars  £36.00m
3          Gabriel Batistuta  £32.54m
4             Nicolas Anelka  £31.05m
5              Rio Ferdinand  £23.40m
6           Flávio Conceicao  £22.50m
7             Savo Milosevic  £22.50m
8            David Trézéguet  £20.92m
9              Claudio López  £20.70m
10   Jimmy Floyd Hasselbaink  £20.25m
11              Gerard López  £19.44m
12                     Lucas  £19.17m
13               Pablo Aimar  £19.13m
14             Wálter Samuel  £18.72m
15             Shabani Nonda  £18.00m
16              Robbie Keane  £17.55m
17                 José Mari  £17.10m
18           Jonathan Zebina  £16.56m
19                   Émerson  £16.20m
20            Tore André Flo  £16.20m
21             Serhii Rebrov  £16.20m
22            Angelo Peruzzi  £16.11m
23             Diego Tristán  £15.98m
24           Sylvain Wiltord  £15.75m
25                 Luís Figo  £54.00m
26             Hernán Crespo  £51.13m
27             Marc Overmars  £36.00m
28         Gabriel Batistuta  £32.54m
29            Nicolas Anelka  £31.05m
..                       ...      ...
220           Tore André Flo  £16.20m
221            Serhii Rebrov  £16.20m
222           Angelo Peruzzi  £16.11m
223            Diego Tristán  £15.98m
224          Sylvain Wiltord  £15.75m
225                Luís Figo  £54.00m
226            Hernán Crespo  £51.13m
227            Marc Overmars  £36.00m
228        Gabriel Batistuta  £32.54m
229           Nicolas Anelka  £31.05m
230            Rio Ferdinand  £23.40m
231         Flávio Conceicao  £22.50m
232           Savo Milosevic  £22.50m
233          David Trézéguet  £20.92m
234            Claudio López  £20.70m
235  Jimmy Floyd Hasselbaink  £20.25m
236             Gerard López  £19.44m
237                    Lucas  £19.17m
238              Pablo Aimar  £19.13m
239            Wálter Samuel  £18.72m
240            Shabani Nonda  £18.00m
241             Robbie Keane  £17.55m
242                José Mari  £17.10m
243          Jonathan Zebina  £16.56m
244                  Émerson  £16.20m
245           Tore André Flo  £16.20m
246            Serhii Rebrov  £16.20m
247           Angelo Peruzzi  £16.11m
248            Diego Tristán  £15.98m
249          Sylvain Wiltord  £15.75m
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...