首页 > 解决方案 > 如何正确地将我的 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()

在此处输入图像描述

标签: pythonseleniumselenium-webdriverweb-scrapingfastapi

解决方案


您实际上只是在打印应该传递给您的 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

告诉我它是否不起作用...


推荐阅读