HttpClient请求返回状态410 Gone

时间:2015-05-29 12:10:38

标签: c# web-crawler dotnet-httpclient

我正在使用httpclient .NET 4.5练习我的技能,但是我在尝试从网页上获取html内容遇到了一些麻烦,我可以通过浏览器查看没有问题,但是当我发现时,我会得到410使用httpclient 我可以通过httpclient实际获得第一页 https://selfservice.mypurdue.purdue.edu/prod/bwckschd.p_disp_detail_sched?term_in=201610&crn_in=20172

但是上面这个url中的链接,就像"查看目录条目"

所表示的网址

当我尝试使用httpclient访问时,我将获得410 Gone。 我使用Tuple来设置一系列请求

var requests = new List<Tuple<Httpmethod, string, FormUrlEncodedContent, string>>()
        {
            new Tuple<Httpmethod, string, FormUrlEncodedContent, string>(Httpmethod.GET, "https://selfservice.mypurdue.purdue.edu/prod/bwckschd.p_disp_detail_sched?term_in=201610&crn_in=20172", null, ""),
            new Tuple<Httpmethod, string, FormUrlEncodedContent, string>(Httpmethod.GET, "https://selfservice.mypurdue.purdue.edu/prod/bwckctlg.p_display_courses?term_in=201610&one_subj=EPCS&sel_crse_strt=10100&sel_crse_end=10100&sel_subj=&sel_levl=&sel_schd=&sel_coll=&sel_divs=&sel_dept=&sel_attr=", null, ""),
            new Tuple<Httpmethod, string, FormUrlEncodedContent, string>(Httpmethod.GET, "https://selfservice.mypurdue.purdue.edu/prod/bwckctlg.p_disp_listcrse?term_in=201610&subj_in=EPCS&crse_in=10100&schd_in=%", null, "")

        };

然后使用foreach循环将请求中的每个元素传递给函数

 HttpClientHandler handler = new HttpClientHandler()
        {
            CookieContainer = cookies,
            AllowAutoRedirect = false,
            AutomaticDecompression = DecompressionMethods.GZip
        };
        HttpClient client = new HttpClient(handler as HttpMessageHandler)
        {
            BaseAddress = new Uri(url),
            Timeout = TimeSpan.FromMilliseconds(20000)
        };
        client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate, sdch");
        client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Language", "en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4");
        client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36");
        client.DefaultRequestHeaders.Connection.Add("keep-alive");
        if (referrer.Length > 0)
            client.DefaultRequestHeaders.Referrer = new Uri(referrer);
        System.Diagnostics.Debug.WriteLine("Navigating to '" + url + "...");
        HttpResponseMessage result = null;
        //List<Cookie> cook = GetAllCookies(cookies);
        try
        {
            switch (method)
            {
                case Httpmethod.POST:
                    result = await client.PostAsync(url, post_content);
                    break;
                case Httpmethod.GET:
                    result = await client.GetAsync(url);
                    break;
            }
        }
        catch (HttpRequestException ex)
        {
            throw new ApplicationException(ex.Message);
        }

我不知道我的方法有什么问题,因为我已经成功处理了需要使用此方法登录的请求。 我打算使用它构建某种Web爬虫。 请提前帮助,谢谢。

我忘了提及,上面网址中的链接可以通过在网络浏览器上点击来访问,只需将它们复制到地址栏就可以获得410了。

编辑:我在页面源代码中看到了一些JavaScript代码,它创建了一个XMLHttpRequest来获取内容,因此它可能只刷新部分页面而不是创建新的网页。但网址发生了变化。如何让httpclient进行点击?

0 个答案:

没有答案