我正在使用 fastAPI 創建自己的刮刀 API。我的問題是我似乎做錯了什么,因為我的資料(抓取的資料)沒有顯示在瀏覽器上。我已經將我的刮刀變成了一個類,以便在我的 FastAPI 應用程式中使用它,并且資料顯示在我的控制臺上,而不是通過瀏覽器顯示在 uvicorn 服務器上。我配置正確。我也包含了瀏覽器螢屏截圖。
爬蟲API
from fastapi import FastAPI
from Scraper import scrape
app = FastAPI()
data = scrape()
@app.get("/data")
async def songs():
return data.scrapedata()
刮刀
import time
from selenium import webdriver
import selenium
from selenium.webdriver.chrome import service
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
import pandas as pd
class scrape:
def scrapedata(self):
ser = Service("C:\Program Files (x86)\chromedriver.exe")
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options,service=ser)
driver.get('https://soundcloud.com/jujubucks')
print(driver.title)
wait = WebDriverWait(driver,30)
wait.until(EC.element_to_be_clickable((By.ID,"onetrust-accept-btn-handler"))).click()
song_list = []
for i in range(1, 35):
song_contents = driver.find_element(By.XPATH, "//li[@class='soundList__item'][{}]".format(i))
driver.execute_script("arguments[0].scrollIntoView(true);",song_contents)
try:
search = song_contents.find_element(By.XPATH, ".//a[contains(@class,'soundTitle__username')]/span").text
search_song = song_contents.find_element(By.XPATH, ".//a[contains(@class,'soundTitle__title')]/span").text
search_date = song_contents.find_element(By.XPATH, ".//time[contains(@class,'relativeTime')]/span").text
search_plays = song_contents.find_element(By.XPATH, ".//span[contains(@class,'sc-ministats-small')]/span").text
except NoSuchElementException:
continue
if search_plays == False:
continue
option ={
'Artist': search,
'Song_title': search_song,
'Date': search_date,
'Streams': search_plays
}
song_list.append(option)
df = pd.DataFrame(song_list)
print(df)
driver.quit()
data = scrape()
data.scrapedata()

uj5u.com熱心網友回復:
您實際上只是在列印應該傳遞給您的 FastAPI 站點的結果
它應該return data代替print(data)
喜歡:
song_list.append(option)
df = pd.DataFrame(song_list)
return df
driver.quit()
然后,稍后將其傳遞給 FastAPI 的歌曲函式
@app.get("/data")
async def songs():
return data.scrapedata()
而且,FastAPI 只會以 JSON 型別回傳所有??內容,無論是字串,它最終都會出現在application/json類似的回應頁面中
所以最好先將資料幀轉換為 dict,然后再將它們傳遞到 FastAPI 回應中,例如
return df.to_dict()
或者最好只回傳song_list減少其他不必要的函式操作的(但如果你真的希望它是一個資料幀,你可能必須將回應內容處理到資料幀中)
喜歡:
return song_list
告訴我它是否不起作用...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/342827.html
