C# HttpClient请求返回状态410 Gone

C# HttpClient请求返回状态410 Gone,c#,web-crawler,dotnet-httpclient,C#,Web Crawler,Dotnet Httpclient,我正在练习使用httpclient.NET4.5的技巧,但是我在尝试从一个我可以用浏览器查看的网页中获取html内容时遇到了一些麻烦,但是当我使用httpclient时,我将失去410 这是我可以通过httpclient获得的第一个页面 但是上面url中的链接,如“查看目录条目”表示的url 当我尝试使用httpclient访问时,我会得到一个410。 我使用Tuple设置了一系列请求 var requests = new List<Tuple<Httpmethod, string

我正在练习使用httpclient.NET4.5的技巧,但是我在尝试从一个我可以用浏览器查看的网页中获取html内容时遇到了一些麻烦,但是当我使用httpclient时,我将失去410 这是我可以通过httpclient获得的第一个页面

但是上面url中的链接,如“查看目录条目”表示的url

当我尝试使用httpclient访问时,我会得到一个410。 我使用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, "")

        };
var请求=新列表()
{
新元组(Httpmethod.GET,“https://selfservice.mypurdue.purdue.edu/prod/bwckschd.p_disp_detail_sched?term_in=201610&crn_in=20172“,null,”,
新元组(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,”,
新元组(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);
        }
HttpClientHandler处理程序=新的HttpClientHandler()
{
CookieContainer=饼干,
AllowAutoRedirect=false,
AutomaticDecompression=DecompressionMethods.GZip
};
HttpClient客户端=新HttpClient(处理程序为HttpMessageHandler)
{
BaseAddress=新Uri(url),
超时=时间跨度。从毫秒(20000)
};
client.DefaultRequestHeaders.TryAddWithoutValidation(“Accept”、“text/html、application/xhtml+xml、application/xml;q=0.9、image/webp、*/*;q=0.8”);
client.DefaultRequestHeaders.TryAddWithoutValidation(“接受编码”、“gzip、deflate、sdch”);
client.DefaultRequestHeaders.tryadd不带验证(“接受语言”,“en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4”);
client.DefaultRequestHeaders.TryAddWithoutValidation(“用户代理”、“Mozilla/5.0(Windows NT 6.3;WOW64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/41.0.2272.118 Safari/537.36”);
client.DefaultRequestHeaders.Connection.Add(“保持活动”);
如果(referer.Length>0)
client.DefaultRequestHeaders.referer=新Uri(referer);
System.Diagnostics.Debug.WriteLine(“导航到“'+url+”);
HttpResponseMessage结果=null;
//列出cook=GetAllCookies(cookies);
尝试
{
开关(方法)
{
案例Httpmethod.POST:
结果=wait client.PostAsync(url、post_内容);
打破
案例Httpmethod.GET:
结果=wait client.GetAsync(url);
打破
}
}
捕获(HttpRequestException-ex)
{
抛出新的ApplicationException(例如消息);
}
我不知道我的方法有什么问题,因为我已经成功地处理了需要用这个方法登录的请求。 我打算用这个来构建某种网络爬虫。 请帮忙,提前谢谢

我忘了提到,上面url中的链接可以通过在web浏览器上单击它们来访问,只需将它们复制到地址栏,也会消失410


编辑:我在PageSource中看到了一些JavaScript代码,它正在创建一个XMLHttpRequest来获取内容,所以它可能只是刷新页面的一部分,而不是创建一个新的网页。但url已更改。如何让httpclient执行单击操作?

这样您的爬虫程序的行为与您的浏览器相同。这有什么问题?这是从服务器发送的消息,与HttpClient无关。在某个时刻,服务器返回410。现在,链接工作如果链接地址甚至在浏览器上都不工作,我想锚点有JS onclick处理程序,可以重定向到正确的位置目录页面上的日期是5月29日。我怀疑你试图访问一个刚刚过期的目录,现在。。。一去不复返。新目录现在可用,因此在到期之前不再有410个well@PanagiotisKanavos我怀疑该页面是在我单击链接时创建的,如果您尝试不单击该链接并从页面源获取url,请尝试将其复制到web浏览器,它将为您提供410 Gone,如果您单击它,则您将获得下一个网页。