Очистите Spotify с помощью Python

Я получаю ошибку AttributeError: 'NoneType' object has no attribute 'find'. Прежде чем опубликовать здесь некоторые исследования, возможная проблема может заключаться в том, что Cloudflare блокирует мой доступ к Spotify. Каким будет обходной путь к этой проблеме?

часть кода выглядит так:

dates=[]
urls=[]
final=[]

url = 'https://spotifycharts.com/regional/us/daily'
start_date = date(2022,3,1)
end_date = date(2022,4,30)
delta = end_date - start_date

# print(delta.days+1)

for i in range(delta.days+1):
    day= start_date +timedelta(days=i)
    day_string =day.strftime('%Y-%m-%d')
    dates.append(day_string)



def add_url():
    for date in dates:
        c_string=url+date
        urls.append(c_string)

add_url()

def song_scrape(x):
    pg = x
    for tr in songs.find("tbody").findAll("tr"):
        artist = tr.find("td", {"class": "chart-table-track"}).find("span").text
        artist = artist.replace("by ", "").strip()

        title = tr.find("td", {"class": "chart-table-track"}).find("strong").text
        songid = tr.find("td", {"class": "chart-table-image"}).find("a").get("href")
        songid = songid.split("track/")[1]
        url_date = x.split("daily/")[1]
        final.append([title, artist, songid, url_date])


for u in urls:
    read_pg= requests.get(u)
    sleep(2)
    # return read_pg.status_code
    soup= BeautifulSoup(read_pg.content, "html.parser")
    songs = soup.find("table", {"class": "chart-table"})
    song_scrape(u)


final_df = pd.DataFrame(final, columns= ["Title", "Artist", "Song ID", "Chart Date"])
with open('spmooddata.csv', 'w') as f:
        final_df.to_csv(f, header= True, index=False)

у вас может быть самая распространенная проблема: страница может использовать JavaScript для добавления/обновления элементов, но BeautifulSoup/lxml, requests/urllib не может работать JS. Вам может понадобиться Селен для управления реальным веб-браузером, который может работать JS. ИЛИ используйте (вручную) DevTools в Firefox/Chrome (вкладка Network), чтобы узнать, считывает ли JavaScript данные с какого-либо URL-адреса. И попробуйте использовать этот URL с requests. JS обычно получает JSON, который можно легко преобразовать в словарь Python (без BS). Вы также можете проверить, есть ли на странице (бесплатно) API для программистов.

furas 09.05.2022 16:26

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

furas 09.05.2022 16:28

Я получаю ответ 403, когда пытаюсь read_pg.status_code

Greencolor 09.05.2022 17:40

@Greencolor попробуйте изменить свой код, чтобы избежать ошибки 403 - как показано в этом ответе. Я попробовал в Google Colab, и это работает.

Marco Aurelio Fernandez Reyes 11.05.2022 00:41

@MarcoAurelioFernandezReyes я добавил эту строку headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'} в цикл for u in urls, но не сработало

Greencolor 12.05.2022 14:31

@MarcoAurelioFernandezReyes, не могли бы вы написать ответ?

Greencolor 12.05.2022 14:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
6
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я уже упоминал в своем комментарии, вам нужно добавить определенный код как показано в этом ответе для устранения запрещенной ошибки 403.

После внесения дополнительных изменений в ваш код я смог получить данные.

Это ваш модифицированный и рабочий код:

# Library/module imports
import requests
from bs4 import BeautifulSoup
from datetime import datetime, timedelta
from time import sleep
import pandas as pd

# Variables: 
dates=[]
urls=[]
final=[]
url = 'https://spotifycharts.com/regional/us/daily/'
start_date = datetime(2022,3,1)
end_date = datetime(2022,3,5)
delta = end_date - start_date

# print(delta.days+1)

for i in range(delta.days+1):
  day= start_date + timedelta(days=i)
  day_string =day.strftime('%Y-%m-%d')
  dates.append(day_string)

def add_url(): 
  for date in dates:
    c_string=url+date
    urls.append(c_string)

add_url()

def song_scrape(x, songs):
  pg = x
  for tr in songs.find("tbody").findAll("tr"): 
    artist = tr.find("td", {"class": "chart-table-track"}).find("span").text
    artist = artist.replace("by ", "").strip()
    
    title = tr.find("td", {"class": "chart-table-track"}).find("strong").text
    songid = tr.find("td", {"class": "chart-table-image"}).find("a").get("href")
    songid = songid.split("track/")[1]
    url_date = x.split("daily/")[1]
    final.append([title, artist, songid, url_date])


# Avoid http 403 forbidden error with this code: 
# Source: https://stackoverflow.com/a/43590290/12511801 
header = {
  "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.75 Safari/537.36",
  "X-Requested-With": "XMLHttpRequest"
}

for u in urls:
  read_pg= requests.get(u, headers=header)
  sleep(2)
  # return read_pg.status_code
  soup= BeautifulSoup(read_pg.text, "html.parser")

  #Using BeautifulSoup, we're getting the specific data from the HTML: 
  # There is only 1 table = which is the table with the data to extract:
  songs = soup.findAll("table")[0]

  # Call "song_scrape" function to retrieve the data from the table: 
  song_scrape(u, songs)

final_df = pd.DataFrame(final, columns= ["Title", "Artist", "Song ID", "Chart Date"])
# print(final_df) # Print the dataframe, if you want

with open('spmooddata.csv', 'w') as f: 
  final_df.to_csv(f, header= True, index=False)

Другие вопросы по теме