【问题标题】:How to create an api with FastAPI and scrapy?如何使用 FastAPI 和 scrapy 创建 api?
【发布时间】:2022-06-11 06:55:43
【问题描述】:

我正在开发一个 Web 应用程序项目,该项目将允许用户从关键字中搜索并根据从抓取中输入的关键字获得一组结果。为此,我使用 scrapy 从网络搜索引擎中抓取结果。我写了一些代码将关键字传递给scrapy文件并在网页上显示scrapy结果。但是,我在使用 FastAPI 将关键字传递给 scrapy 时遇到了麻烦,因为当我运行我的 api 代码时,我总是从 Scrapy 收到一组错误。这是包含运行时终端output 的要点。我不明白这个问题,但我的scrapy代码在我将它连接到api之前运行良好,我是创建API的初学者,所以我请求你的帮助。这是我的网络爬虫的代码:

import scrapy
import datetime
from requests_html import HTMLSession 

class PagesearchSpider(scrapy.Spider):

    name = 'pageSearch'


    def start_requests(self,query):
        #queries = [ 'investissement']
        #for query in queries:
            url = f'https://www.ask.com/web?q={query}'
            s = HTMLSession()
            r = s.get
            print(r.status_code)
            qlist[""]
            
            yield scrapy.Request(url, callback=self.parse, meta={'pos': 0})




    def parse(self, response):

        print('url:', response.url)
        
        start_pos = response.meta['pos']
        print('start pos:', start_pos)

        dt = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')    
        
        items = response.css('div.PartialSearchResults-item')
        
        for pos, result in enumerate(items, start_pos+1):
            yield {
                'title':    result.css('a.PartialSearchResults-item-title-link.result-link::text').get().strip(), 
                'snippet':  result.css('p.PartialSearchResults-item-abstract::text').get().strip(), 
                'link':     result.css('a.PartialSearchResults-item-title-link.result-link').attrib.get('href'), 
                'position': pos, 
                'date':     dt,
            }

            qlist.append(items)

        # --- after loop ---
        
        next_page = response.css('.PartialWebPagination-next a')
        
        if next_page:
            url = next_page.attrib.get('href')
            print('next_page:', url)  # relative URL
            # use `follow()` to add `https://www.ask.com/` to URL and create absolute URL
            yield response.follow(url, callback=self.parse, meta={'pos': pos+1})


# --- run without project, and save in file ---

from scrapy.crawler import CrawlerProcess

c = CrawlerProcess({
    #'USER_AGENT': 'Mozilla/5.0',
    # save in file CSV, JSON or XML
    'FEEDS': {'test.json': {'format': 'json'}},
    #'ROBOTSTXT_OBEY': True,  # this stop scraping
})
c.crawl(PagesearchSpider)
c.start() 

允许我的 api 运行的代码:

from fastapi import FastAPI
from script import PagesearchSpider

app = FastAPI()
request = PagesearchSpider()

@app.get("/{cat}")
async def read_item(cat):
    return request.start_requests('cat')

我更改了部分爬虫代码,即:

def start_requests(self,query):
        #queries = [ 'investissement']
        #for query in queries:
            url = f'https://www.ask.com/web?q={query}'
            
            if __name__ == '__main__':
                                        s = HTMLSession()
                                        r = s.get
                                        print(r.status_code)
                                        qlist[""]

但我仍然遇到同样的错误。除非我得到错误的爬虫代码,否则我不太擅长scrapy 我还重写了我的函数下面的代码...

# --- run without project, and save in file ---
if __name__ == "__main__":
    from scrapy.crawler import CrawlerProcess
    c = CrawlerProcess({
    #'USER_AGENT': 'Mozilla/5.0',
    # save in file CSV, JSON or XML
    #'FEEDS': {'test.json': {'format': 'json'}},
    #'ROBOTSTXT_OBEY': True,  # this stop scraping
})
    c.crawl(PagesearchSpider)
    c.start() 

我执行了这个命令python -m uvicorn main:app --reload 来启动服务器,我在命令行中得到了以下结果:

←[32mINFO←[0m:     Will watch for changes in these directories: ['C:\\Users\\user\\Documents\\AAprojects\\Whelpsgroups1\\searchApi\\apiFast']
←[32mINFO←[0m:     Uvicorn running on ←[1mhttp://127.0.0.1:8000←[0m (Press CTRL+C to quit)
←[32mINFO←[0m:     Started reloader process [←[36m←[1m10956←[0m] using ←[36m←[1mstatreload←[0m
←[33mWARNING←[0m:  The --reload flag should not be used in production on Windows.
←[32mINFO←[0m:     Started server process [←[36m6724←[0m]
←[32mINFO←[0m:     Waiting for application startup.
←[32mINFO←[0m:     Application startup complete.
←[33mWARNING←[0m:  StatReload detected file change in 'main.py'. Reloading...
←[33mWARNING←[0m:  The --reload flag should not be used in production on Windows.
←[32mINFO←[0m:     Started server process [←[36m2720←[0m]
←[32mINFO←[0m:     Waiting for application startup.
←[32mINFO←[0m:     Application startup complete.

但是,当我从命令行单击我的服务器启动地址的链接时,它会在 Windows 10 上打开我的文件资源管理器,当我在浏览器搜索栏中手动编写该链接(即 http://127.0.0.0:8000/)时,它会显示 @987654329 @ 回复时间过长。但是我没有更改任何文件,只是我在控制台行中使用的命令,所以我不知道为什么会出现此错误。

我查看了堆栈溢出问题,但它们与 api 和网络爬虫之间难以共享数据的问题没有直接关系,并且在互联网上我找不到任何相关答案。所以我希望你能帮助我,我期待你的回答,谢谢!

【问题讨论】:

  • 错误消息似乎来自您在爬虫代码底部的代码(即在爬虫文件中实例化爬虫)。将此代码包装在 if __name__ == '__main__:` 部分中,仅当您直接调用该文件时才运行它。请在在您的问题中包含错误消息,而不是外部链接 - 外部链接随时可能消失,从而使问题在未来变得不那么有价值。
  • 我修改了我的爬虫代码并遇到了同样的问题,除非我的代码错误,我把细节放在我的问题中
  • 我不是这个意思。 # --- run without project, and save in file --- 之后的部分是应该包装在 if-guard 下的代码(如果所有内容都存在于单个文件中)。把它放在一个函数中是没有意义的。
  • 我尝试了你的建议,但仍然没有,我的问题中有更多细节
  • 你必须缩进 everything 下面的 if 正确,否则它不会成为 if-check 的一部分(这是你定义 c 的地方)。跨度>

标签: python-requests scrapy fastapi uvicorn


猜你喜欢
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多