Как зациклить и сохранить данные из каждой итерации - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь научиться очищать данные с веб-страницы в Python и сталкиваюсь с проблемами, связанными с структурированием моих вложенных циклов в Python.Я получил некоторую помощь в том, как я справлялся с этим вопросом ( Как извлечь ссылки из тега 'a' ).Я пытаюсь, чтобы этот код по существу повторялся на разных неделях (и, в конечном итоге, годах) веб-страниц.То, что у меня есть в данный момент, ниже, но оно не повторяется в течение двух недель, которые я хотел бы, и сохраняло его.

import requests, re, json
from bs4 import BeautifulSoup
weeks=['1','2']
data = pd.DataFrame(columns=['Teams','Link'])

scripts_head = soup.find('head').find_all('script')
all_links = {}
for i in weeks:
    r = requests.get(r'https://www.espn.com/college-football/scoreboard/_/year/2018/seasontype/2/week/'+i)
    soup = BeautifulSoup(r.text, 'html.parser')
    for script in scripts_head:
        if 'window.espn.scoreboardData' in script.text:
            json_scoreboard = json.loads(re.search(r'({.*?});', script.text).group(1))
            for event in json_scoreboard['events']:
                name = event['name']
                for link in event['links']:
                    if link['text'] == 'Gamecast':
                        gamecast = link['href']
                all_links[name] = gamecast
                #Save data to dataframe
                data2=pd.DataFrame(list(all_links.items()),columns=['Teams','Link'])
        #Append new data to existing data        
        data=data.append(data2,ignore_index = True)


#Save dataframe with all links to csv for future use
data.to_csv(r'game_id_data.csv')

Редактировать: поэтому, чтобы добавить некоторые пояснения, это создает дубликаты данныхот одной недели и многократно дописывая его до конца.Я также отредактировал код, включив в него нужные библиотеки, он должен быть в состоянии копировать, вставлять и запускать на python.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Итак, обходной путь, который я нашел, приведен ниже, я все еще получаю дубликаты идентификаторов игр в своем последнем наборе данных, но, по крайней мере, я перебираю весь желаемый набор и получаю все из них.Затем в конце я дедуплирую.

import requests, re, json
from bs4 import BeautifulSoup
import csv
import pandas as pd

years=['2015','2016','2017','2018']
weeks=['1','2','3','4','5','6','7','8','9','10','11','12','13','14']
data = pd.DataFrame(columns=['Teams','Link'])

all_links = {}
for year in years:
    for i in weeks:
        r = requests.get(r'https://www.espn.com/college-football/scoreboard/_/year/'+ year + '/seasontype/2/week/'+i)
        soup = BeautifulSoup(r.text, 'html.parser')
        scripts_head = soup.find('head').find_all('script')
        for script in scripts_head:
            if 'window.espn.scoreboardData' in script.text:
                json_scoreboard = json.loads(re.search(r'({.*?});', script.text).group(1))
                for event in json_scoreboard['events']:
                    name = event['name']
                    for link in event['links']:
                        if link['text'] == 'Gamecast':
                            gamecast = link['href']
                    all_links[name] = gamecast
                #Save data to dataframe
                data2=pd.DataFrame(list(all_links.items()),columns=['Teams','Link'])
                #Append new data to existing data        
                data=data.append(data2,ignore_index = True)


#Save dataframe with all links to csv for future use
data_test=data.drop_duplicates(keep='first')
data_test.to_csv(r'all_years_deduped.csv')
0 голосов
/ 26 сентября 2019

Проблема в логике цикла:

    if 'window.espn.scoreboardData' in script.text:
        ...
            data2=pd.DataFrame(list(all_links.items()),columns=['Teams','Link'])
    #Append new data to existing data        
    data=data.append(data2,ignore_index = True)

Ваш отступ в последней строке неверен.Как указано, вы добавляете data2 независимо от того, есть ли у вас новые данные на табло.В противном случае вы пропускаете тело if и просто добавляете предыдущее значение data2.

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