当前位置: 首页 > 知识库问答 >
问题:

RestSharp使用异步刮取多个URL

吕向荣
2023-03-14

检查暗号。这里我得到了一个URL的列表,它们需要报废,并将Html填充到data.datas全局类的Html属性中。我已经尝试过使用RestSharpClient.GetAsync来实现它,但我不知道如何才能将它转到URL的所有列表中,其中包含data.datas

public class Data
    {
        public int Id { get; set; }
        public string Url { get; set; }
        public string Html { get; set; }
        public static List<Data> Datas = new List<Data>();
    }

class Program
    {

        static void Main(string[] args)
        {
          

            //seeding 10 demo data
            for (int i = 0; i < 10; i++)
            {
                Data.Datas.Add(new Data
                {
                    Id = i,
                    Url = "https://www.httpbin.org",
                    Html = null,
                });
            }

            var task = Task.Run(async () =>
            {
                await DoScrapeAsync();
            });


            do
            {

            } while (!task.IsCompleted);

            Console.WriteLine("compleated");
            Console.ReadLine();


        }



        static async Task DoScrapeAsync()
        {
            var thisData = Data.Datas.FirstOrDefault();//doing firstOrDefault() which is wrong. I have to take whole list to scrape
            var client = new RestClient("http://api.scraperapi.com/?api_key=c3df2_fake_4d5e&url=" + thisData.Url + "/ip&country_code=us");
            RestRequest req = new RestRequest(Method.GET);

            //string html = client.Execute<string>(req).Content;

            var html = await client.GetAsync<string>(req);

            thisData.Html = html;
            
            Console.WriteLine(html);
        }


        }

共有1个答案

郝修为
2023-03-14

使doscrapeasync接受单个data实例

static async Task DoScrapeAsync(Data data)
{
    string url = $"http://api.scraperapi.com/?api_key=c3df2_fake_4d5e&url={data.Url}/ip&country_code=us";
    var client = new RestClient(url);
    RestRequest req = new RestRequest(Method.GET);

    var html = await client.GetAsync<string>(req);

    data.Html = html;
        
    Console.WriteLine(html);
}

然后可以在main中这样调用:

static async Task Main(string[] args)
{
    //seeding 10 demo data
    for (int i = 0; i < 10; i++)
    {
        Data.Datas.Add(new Data
        {
            Id = i,
            Url = "https://www.httpbin.org",
            Html = null,
        });
    }

    await Task.WhenAll(Data.Datas.Select(DoScrapeAsync));

    Console.WriteLine("completed");
    Console.ReadLine();
}

几点:您需要使mainAsync能够等待对DoscrapeAsync的每次调用。

此外,使用task.run也是完全不必要的,因为这只是将工作卸载到线程池中,在您的情况下什么也没有实现。

 类似资料:
  • 我调用了多个ajax调用,但代码只在所有ajax调用执行之后才到达API。 JavaScript: AppFactory API 链接工作很好,但我需要运行两个独立,我真的想知道发生了什么。 谢谢!!!

  • 最近,我一直试图从一个网站上获取大量的定价,从一个页面开始,每个项目的页面都链接到起始页面。我希望运行一个脚本,允许我单击某个项目的框,删除该项目的定价和描述,然后返回起始页并继续该循环。然而,有一个明显的问题,我在刮掉第一件物品后遇到了。返回起始页后,容器没有定义,因此出现了一个陈旧的元素错误,该错误会中断循环并阻止我获取其余的项。这是我使用的示例代码,希望能够一个接一个地刮去所有项目。 然而,

  • 但是,如下所示的调用序列使用相同的TCP连接。 我还没有对此进行调试,但OkHttp似乎迫使我们首先在主线程上发出阻塞HTTP请求,以获得TCP连接上下文,然后与其他线程共享该上下文?或者,我是不是漏掉了什么?

  • 我正在开发一个移动应用程序,现在我正在进行身份验证。在我访问我的主页之前,我需要访问我构建的API上的各种endpoint,然后才能向用户显示数据。 在Postman中测试时,所有endpoint都返回了正确的数据,但是当我在应用程序中使用它时,我在第二次异步调用中得到了一个值。 我确信这与这些呼叫的顺序有关,所以我只是在寻找一些帮助,如何在开始另一个呼叫之前正确地等待一个呼叫完成。

  • RestSharp 进行 rest/http 请求的 .NET 工具库。 功能 支持.NET 3.5+,Silverlight 5,Windows Phone 8,Mono,MonoTouch,Mono for Android 容易安装,NuGet 适合大多数 .NET 风格 支持使用 NuGet 的大多数 .NET 风格的强命名 自动 XML 和 JSON 反序列化 支持通过 ISerializ

  • 我试图写一个异步函数,使多个读取,等待所有完成,然后返回JSON结果作为一个数组。这是我到目前为止所拥有的: 文件1。js 应用程序编程接口。js util.js 当执行在调试器处暂停时,我使用Chrome的开发工具检查,它正确地是由3个对象组成的数组,但如果我检查,它奇怪地在控制台中返回一个