我发现了这段邪恶的代码,我将尝试将其用于从 Spotify 中抓取歌曲数据的项目 - 唯一的问题是这段代码已损坏,可以使用一点点爱。关于为什么我收到错误“AttributeError: 'NoneType' object has no attribute 'find'' for line 36 的任何想法?这是我的代码;
from bs4 import BeautifulSoup
import pandas as pd
import requests
from time import sleep
from datetime import date, timedelta
#create empty arrays for data we're collecting
dates=[]
url_list=[]
final = []
#map site
url = "https://spotifycharts.com/regional/au/weekly"
start_date= date(2016, 12, 29)
end_date= date(2020, 12, 24)
delta= end_date-start_date
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
url_list.append(c_string)
add_url()
#function for going through each row in each url and finding relevant song info
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])
#loop through urls to create array of all of our song info
for u in url_list:
read_pg= requests.get(u)
sleep(2)
soup= BeautifulSoup(read_pg.text, "html.parser")
songs= soup.find("table", {"class":"chart-table"})
song_scrape(u)
#convert to data frame with pandas for easier data manipulation
final_df = pd.DataFrame(final, columns= ["Title", "Artist", "Song ID", "Chart Date"])
#write to csv
with open('spmooddata.csv', 'w') as f:
final_df.to_csv(f, header= True, index=False)
答案 0 :(得分:0)
函数 song_scrape
使用外部 songs
参数,在某些情况下为 None
,例如无效的 url,或任何不包含正在搜索的特定表格的页面(类图表表格的表格)。
例如,您有一个带有 page-not-found 结果的 url (https://spotifycharts.com/regional/au/weekly2016-12-29),因此搜索表的行返回 None
。确实没有 find
属性...
事实上,所有你的网址都是无效的!所以你真正需要做的是修复你的网址列表。
让我们更深入:
spotify 似乎改变了 url 格式,现在使用“从-日期--日期”结构。如果您修复了代码的 url 构建部分,那么这就是让事情重回正轨的第一步。所以对于初学者 -
start_date = date(2021, 1, 8)
end_date = date(2021, 6, 30)
num_of_dates = (end_date - start_date).days // 7
for i in range(num_of_dates):
start_day = start_date + timedelta(days=i * 7)
start_day_string = start_day.strftime("%Y-%m-%d")
end_day = start_date + timedelta(days=(i + 1) * 7)
end_day_string = end_day.strftime("%Y-%m-%d")
dates.append('--'.join([start_day_string, end_day_string]))
...给出有效的网址!
但在这一点上,似乎安装了一些安全措施,因为不是加载实际页面,而是指向验证码页面。但这是一个完全不同的问题:-)
注意:在抓取网页之前,值得查看robots.txt文件。
在这种情况下,文件 https://spotifycharts.com/robots.txt 显示 -
用户代理:*
禁止:
因此,抓取 Spotify 应该没有问题。要克服验证码,请尝试查看 python-anticaptch package