我需要从我拥有有效凭据的网站上抓取信息表,因为该网站的所有者不提供API。
我执行了登录并使用Fiddler保存了流量,我正在尝试复制关键步骤 我将展示我到目前为止所做的步骤,然后到达我被困的地方。
CookieContainer jar = new CookieContainer();
request = (HttpWebRequest)WebRequest.Create(urlBase);
request.CookieContainer = jar;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
newUrl = response.ResponseUri.ToString();
随着返回,设置了cookie。当我查看CookieContainer
时,它在通话后的计数为1
有趣的是,响应对象不包含cookie - 但我认为一切正常,因为我可以使用jar
。
我还没有出现名称和密码的页面,直到第4次通话才会发生。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlBase +
secondCallFolderAddition);
CookieCollection bakery = new CookieCollection();
request.KeepAlive = true;
request.Headers.Add("Upgrade-Insecure-Requests", @"1");
//request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 OPR/46.0.2597.57";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp, image/apng,*/*;q=0.8";
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string newURL = response.ResponseUri.ToString();
我获得了OK状态,与原始的Fiddler流量捕获相比,响应看起来很好。在原来的第二次调用没有设置cookie,并且没有设置cookie。
但在这里我迷路了:浏览器发送了三个值的cookie数据(我已经混淆了):
__utma=1.123456789.123456789.123456789.123456789.1
olfsk=olfsk12345678901234567890123456789
hblid=abCDl11ABCabXabc1aABv1FLFX1RE1OS
我不知道这些值的设定位置。它们似乎与Google Analytics(与我发现的文章相关)有关,但我不知道如何收集它们以便我可以将它们附加到我拨打的电话上。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl);
request.KeepAlive = true;
request.Headers.Add("Upgrade-Insecure-Requests", "1");
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36 OPR/46.0.2597.57";
request.Accept = "text/html,application/xhtml+xml,application/xml;
q=0.9,image/webp,image/apng,*/*;q=0.8";
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8");
///request.Headers.Set(HttpRequestHeader.Cookie,
@"__utma=1.123456789.123456789.123456789.123456789.1;
olfsk=olfsk12345678901234567890123456789;
hblid=abCDl11ABCabXabc1aABv1FLFX1RE1OS");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string newURL = response.ResponseUri.ToString();
请注意带有Cookie数据的注释掉的行 - 我已尝试使用未注释的那行。
我从未收到对电话的回复。
我非常感谢任何见解
我猜测第三次调用中的cookie数据是需要的,这是由在第二次和第三次调用之间收集的客户端脚本设置的 - 但我是新手并且不确定。
此外 - 如果在客户端设置,我如何获得有效的cookie,让我通过这个障碍。 (这是下一次调用中的另一个障碍,使用更多的cookie,我在服务器响应中没有看到设置 - 但我还没有。)
我知道我可以通过使用WebBrowser
对象来解决这个问题,但这似乎是一个笨拙的解决方案。有没有笨拙的方式去?我应该尝试其他对象或库吗? (RestSharp?Postman?Webrequest对象而不是HTTPWeRequest?)