Web-Scraping Python, проблема индексации для DataFrame - PullRequest
1 голос
/ 16 апреля 2019

Я работаю над веб-скребком для Spotify Charts, чтобы извлекать 200 лучших ежедневных песен каждый день. Я сделал все, чтобы извлечь интересующие меня данные, включая ранг, исполнителя, название трека и номера потоков. То, на чем я застрял - это поместить все в DataFrame для экспорта в CSV, чтобы преуспеть. Прямо сейчас, когда я печатаю свой DataFrame, он обрабатывает каждый цикл как 1 строку с 4 столбцами, а не 200 строк с 4 столбцами.

Я не уверен, в чем проблема, потому что я попробовал почти все и изучил это столько, сколько мог. Я знаю, что с индексированием что-то не так, потому что каждое «что должно быть строкой» имеет один и тот же первый индекс «0», когда они должны идти последовательно до 199. Кроме того, имена столбцов для моего DataFrame продолжают повторяться после каждого «что должно быть» ряд ", так что я знаю, что там определенно есть проблема.

import requests
from bs4 import BeautifulSoup
from datetime import date, timedelta
from time import time
from time import sleep
from random import randint
import pandas as pd
import numpy as np

base_url = 'https://spotifycharts.com/regional/global/daily/'

r = requests.get(base_url)



soup = BeautifulSoup(r.text, 'html.parser')
chart = soup.find('table', {'class': 'chart-table'})
tbody = chart.find('tbody')
for tr in tbody.find_all('tr'):

    rank_text = []
    rank_text_elem = tr.find('td', {'class': 'chart-table- 
    position'})
    for item in rank_text_elem:
        rank_text = []
        rank_text.append(item)

    artist_text = []
    artist_text_elem = tr.find('td', {'class': 'chart-table- 
    track'}).find_all('span')
    for item in artist_text_elem:
        artist_text = []
        artist_text.append(item.text.replace('by ','').strip())

    title_text = []
    title_text_elem = tr.find('td', {'class': 'chart-table- 
    track'}).find_all('strong')
    for item in title_text_elem:
        title_text = []
        title_text.append(item.text)

    streams_text = []
    streams_text_elem = tr.find('td', {'class': 'chart-table-streams'})
    for item in streams_text_elem:
        streams_text = []
        streams_text.append(item)

# creating dataframe to store 4 variables 

    list_of_data = list(zip(rank_text, artist_text, title_text, 
    streams_text))

    df = pd.DataFrame(list_of_data, columns = 
    ['Rank','Artist','Title','Streams'])
    print(df)

По сути, я пытаюсь создать фрейм данных, который будет содержать 4 переменные в каждой строке по 200 строк для каждой даты разбивки глобальных диаграмм. Пожалуйста, не обращайте внимания на некоторые из модулей и библиотек, которые я включил сверху, они используются для перебора каждой страницы исторических данных на основе динамических URL, которые я уже выяснил. Любая помощь с благодарностью! Спасибо!

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

До цикла for я создаю список all_rows.

Внутри цикла for Я добавляю список с одной строкой данных в all_rows.

После for цикла я использую all_rows для создания DataFrame

import requests
from bs4 import BeautifulSoup
import pandas as pd

base_url = 'https://spotifycharts.com/regional/global/daily/'

r = requests.get(base_url)

soup = BeautifulSoup(r.text, 'html.parser')
chart = soup.find('table', {'class': 'chart-table'})
tbody = chart.find('tbody')

all_rows = []

for tr in tbody.find_all('tr'):

    rank_text = tr.find('td', {'class': 'chart-table-position'}).text

    artist_text = tr.find('td', {'class': 'chart-table-track'}).find('span').text
    artist_text = artist_text.replace('by ','').strip()

    title_text = tr.find('td', {'class': 'chart-table-track'}).find('strong').text

    streams_text = tr.find('td', {'class': 'chart-table-streams'}).text

    all_rows.append( [rank_text, artist_text, title_text, streams_text] )

# after `for` loop

df = pd.DataFrame(all_rows, columns=['Rank','Artist','Title','Streams'])
print(df.head())
0 голосов
/ 16 апреля 2019

Вы можете использовать pandas и requests

import pandas as pd
import requests

headers = {'User-Agent': 'Mozilla/5.0'}
url ='https://spotifycharts.com/regional/global/daily/'

r = requests.get(url, headers = headers).content

table = pd.read_html(r)[0] #transfer html to pandas
table.dropna(axis = 1, how = 'all', inplace = True) #drop nan column
table[['Title','Artist']] = table['Unnamed: 3'].str.split(' by ',expand=True) #split title artist strings into two columns
del table['Unnamed: 3'] #remove combined column
table = table[['Track', 'Artist','Title', 'Unnamed: 4']] #re-order cols
table.columns= ['Rank', 'Artist','Title', 'Streams'] #rename cols
print(table)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...