簡體   English   中英

Web-Scraping Python,DataFrame 的索引問題

[英]Web-Scraping Python, Indexing Issue for DataFrame

我正在為 Spotify 圖表開發一個網絡爬蟲,每天提取前 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)

基本上,我正在嘗試創建一個數據框,以在每個 Spotify 全局圖表日期的每行 200 行中保存 4 個變量。 請忽略我在頂部包含的一些模塊和庫,它們用於根據我已經找到的動態 url 迭代歷史數據的每個頁面。 任何幫助是極大的贊賞! 謝謝!

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())

你可以使用pandasrequests

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM