Очистить таблицы на нескольких страницах с одним URL - PullRequest
1 голос
/ 17 апреля 2020

Я пытаюсь очистить данные от Fangraphs. Таблицы разбиты на 21 страницу, но все страницы используют один и тот же URL. Я очень плохо знаком с веб-скрепингом (или python в целом), но у Fangraphs нет API publi c, поэтому просмотр страницы кажется моим единственным вариантом. В настоящее время я использую BeautifulSoup для анализа кода HTML, и я могу очистить начальную таблицу, но она содержит только первые 30 игроков, но мне нужен весь пул игроков. Два дня веб-поиска, и я застрял. Ссылка и мой текущий код ниже. Я знаю, что у них есть ссылка для загрузки файла CSV, но это становится утомительным в течение всего сезона, и я хотел бы ускорить процесс сбора данных. Любое направление будет полезно, спасибо.

https://www.fangraphs.com/projections.aspx?pos=all&stats=bat&type=fangraphsdc

import requests
import pandas as pd

url = 'https://www.fangraphs.com/projections.aspx?pos=all&stats=bat&type=fangraphsdc&team=0&lg=all&players=0'

response = requests.get(url, verify=False)

# Use BeautifulSoup to parse the HTML code
soup = BeautifulSoup(response.content, 'html.parser')

# changes stat_table from ResultSet to a Tag
stat_table = stat_table[0]

# Convert html table to list
rows = []
for tr in stat_table.find_all('tr')[1:]:
    cells = []
    tds = tr.find_all('td')
    if len(tds) == 0:
        ths = tr.find_all('th')
        for th in ths:
            cells.append(th.text.strip())
    else:
        for td in tds:
            cells.append(td.text.strip())
    rows.append(cells)

# convert table to df
table = pd.DataFrame(rows)

1 Ответ

1 голос
/ 17 апреля 2020
import requests
from bs4 import BeautifulSoup
import pandas as pd

params = {
    "pos": "all",
    "stats": "bat",
    "type": "fangraphsdc"
}

data = {
    'RadScriptManager1_TSM': 'ProjectionBoard1$dg1',
    "__EVENTTARGET": "ProjectionBoard1$dg1",
    '__EVENTARGUMENT': 'FireCommand:ProjectionBoard1$dg1$ctl00;PageSize;1000',
    '__VIEWSTATEGENERATOR': 'C239D6F0',
    '__SCROLLPOSITIONX': '0',
    '__SCROLLPOSITIONY': '1366',
    "ProjectionBoard1_tsStats_ClientState": "{\"selectedIndexes\":[\"0\"],\"logEntries\":[],\"scrollState\":{}}",
    "ProjectionBoard1_tsPosition_ClientState": "{\"selectedIndexes\":[\"0\"],\"logEntries\":[],\"scrollState\":{}}",
    "ProjectionBoard1$rcbTeam": "All+Teams",
    "ProjectionBoard1_rcbTeam_ClientState": "",
    "ProjectionBoard1$rcbLeague": "All",
    "ProjectionBoard1_rcbLeague_ClientState": "",
    "ProjectionBoard1_tsProj_ClientState": "{\"selectedIndexes\":[\"5\"],\"logEntries\":[],\"scrollState\":{}}",
    "ProjectionBoard1_tsUpdate_ClientState": "{\"selectedIndexes\":[],\"logEntries\":[],\"scrollState\":{}}",
    "ProjectionBoard1$dg1$ctl00$ctl02$ctl00$PageSizeComboBox": "30",
    "ProjectionBoard1_dg1_ctl00_ctl02_ctl00_PageSizeComboBox_ClientState": "",
    "ProjectionBoard1$dg1$ctl00$ctl03$ctl01$PageSizeComboBox": "1000",
    "ProjectionBoard1_dg1_ctl00_ctl03_ctl01_PageSizeComboBox_ClientState": "{\"logEntries\":[],\"value\":\"1000\",\"text\":\"1000\",\"enabled\":true,\"checkedIndices\":[],\"checkedItemsTextOverflows\":false}",
    "ProjectionBoard1_dg1_ClientState": ""
}


def main(url):
    with requests.Session() as req:
        r = req.get(url, params=params)
        soup = BeautifulSoup(r.content, 'html.parser')
        data['__VIEWSTATE'] = soup.find("input", id="__VIEWSTATE").get("value")
        data['__EVENTVALIDATION'] = soup.find(
            "input", id="__EVENTVALIDATION").get("value")
        r = req.post(url, params=params, data=data)
        df = pd.read_html(r.content, attrs={
                          'id': 'ProjectionBoard1_dg1_ctl00'})[0]
        df.drop(df.columns[1], axis=1, inplace=True)
        print(df)
        df.to_csv("data.csv", index=False)


main("https://www.fangraphs.com/projections.aspx")

Вывод: просмотр в режиме онлайн

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...