python - 如何正确地将我的 FASTAPI 数据传递给浏览器?
问题描述
我正在使用 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()
解决方案
您实际上只是在打印应该传递给您的 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
告诉我它是否不起作用...