【问题标题】:Requests and generator. Parallel Compute and request请求和生成器。并行计算和请求
【发布时间】:2021-05-14 04:15:32
【问题描述】:

我正在从主页抓取博客网址,然后我遍历所有网址以检索其上的文本。 如果我将循环移动到 blogscraper 并制作 yield some_text ,生成器会更快吗?我猜应用程序仍然是一个线程,并且在从 html 计算文本时不会请求下一页。

我应该使用异步吗?或者有一些更好的模块可以让它parrel? Create generator that yields coroutine results as the coroutines finish

我也想以后做个小rest app来显示结果

def readmainpage(self):
   blogurls = []
   while(nextPage):       
       r = requests.get(url)
       ...
       blogurls += [new_url]
   return blogurls


def blogscraper(self, url):
   r = request.get(url)
   ...
   return sometext

def run(self):
    blog_list = self.readmainpage()
    for blog in blog_list:
        data = self.blogscraper(blog['url'])

【问题讨论】:

  • 为了让它变得非常快,你可以尝试使用scrapy,它就是为此而构建的,快速的网络抓取......
  • 仅供参考,它是 scrapingscraper 不是报废或 scrapper

标签: python python-requests


【解决方案1】:

使用线程包,您可以异步运行您的顶级函数(对象初始化)。它将为您的请求创建子并行子流程。例如,单页抓取需要 2 分钟,而您有 10 页。在线程中,所有将需要 2 分钟。 Threading in Python 3.x

【讨论】:

    【解决方案2】:

    使用 asyncio 你可以尝试使用 aiohttp module: pip install aiohttp 作为示例代码,它可以看起来像这样,也可以进行一些改进,但这取决于您的代码...

    import sys
    import aiohttp
    import asyncio
    import socket
    from urllib.parse import urlparse
    
    class YourClass:
        def __init__(self):
            self.url = "..."
            url_parsed = urlparse( self.url )
            self.session = aiohttp.ClientSession(
                headers = { "Referer": f"{ url_parsed.scheme }://{ url_parsed.netloc }" },
                auto_decompress = True,
                connector = aiohttp.TCPConnector(family=socket.AF_INET, verify_ssl=False) )
    
    
        async def featch(self, url):
            async with self.session.get( url ) as resp:
                assert resp.status == 200
                return await resp.text()
    
        async def readmainpage(self):
            blogurls = []
            while nextPage:       
                r = await self.featch(self.url)
                # ...
                blogurls += [new_url]
            return blogurls
    
    
        async def blogscraper(self, url):
            r = await self.featch(url)
            return r
            # ...
            return sometext
    
        async def __call__(self):
            url_parsed = urlparse( self.url )
            blog_list = await self.readmainpage()
            coros = [ asyncio.Task( self.blogscraper( blog['url']) ) for blog in blog_list ]
            
            for data in await asyncio.gather( *coros ):
                print(data)
    
            # do not forget to close session if not using with statement
            await self.session.close()
            
    
    def main():
        featcher = YourClass()
        loop = asyncio.get_event_loop()
        loop.run_until_complete( featcher() )
        sys.exit(0)
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-16
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多