我在做什么:
我正在开发一个“webscraper”(多线程),就是这样,哈哈。我需要在从页面中提取数据之前提交表单,所以布局是这样的:
除非POST请求(步骤4)的响应告诉我返回步骤1,否则一切正常。
问题:
我需要从cookie中提取它的形式中的一个值,所以我使用GetCookies()
函数,但是,就像我说的,如果响应告诉我回到步骤1,所有请求(都是GET)之后缺少cookie(并添加了奇怪的cookie)。见下图:
我的代码:
public class CWeb : IDisposable
{
private WebClientEx _wc;
private string _originalUrl;
public CWeb()
{
_wc = new WebClientEx(new CookieContainer());
}
public string downloadPage(string url)
{
_originalUrl = url;
string pgSrc = "error";
int tries = 0;
while (tries < 3 && pgSrc == "error)
{
try
{
pgSrc = _wc.DownloadString(url);
}
catch (Exception err)
{
tries += 1;
pgSrc = "error";
...
}
}
if (needSubmit(pgSrc)) // needSubmit just peform IndexOf on pgSrc
do
{
pgSrc = sendForm(pgSrc);
} while (needSubmit(pgSrc));
return WebUtility.HtmlDecode(pgSrc);
}
public string sendForm(pageSource)
{
// 1- Get Cookie Value
string cookie = _wc.CookieContainer.GetCookies(new Uri(_originalUrl))["JSESSIONID"].Value;
// 2- Get hidden values in pageSource parameter
// skip this, since there's no web request here, only some html parsing
// with Html Agility Pack
...
// 3- Get key value
string tmpStr = _wc.DownloadString("http://example.com/path/sub/other.jsp");
... more html parsing ...
// 4- Build form
NameValueCollection nvc = new NameValueCollection();
nvc["param1"] = cookie;
nvc["param2"] = key;
...
// 5- Send
_wc.UploadValues("example.com/path/submit.jsp", nvc);
// 6- Return
return _wc.DownloadString(_originalUrl);
}
public void Dispose()
{
_wc.Dispose();
}
}
主程序:
static void Main(string[] args)
{
// Load tons of 'doc' url list from database...
List<string> urls = new List<string>();
...
Parallel.ForEach(urls, (url) =>
{
using (CWeb crawler = new CWeb())
{
string pageData = crawler.downloadPage(url);
... parse html data here ...
}
});
}
我的环境:
BugFix_CookieDomain()
(来自this question),但即使使用该修复程序,仍会出现此问题。我的所有网址都包含http://前缀。
使用Fiddler查看请求信息。
答案 0 :(得分:0)
我使用System.Net.WebRequest来做类似于你正在做的事情。它通过名为CookieContainer的属性使用Http(WebRequest的HttpWebRequest子类)时处理cookie。我注意到cookie被添加并且显然也从cookie容器中删除了。我的信念是,这完全由服务器端(您正在请求的Web应用程序)控制。它能够添加额外的cookie。
此外,如果Cookie具有过期日期,丢弃标志和域名,那么如果过期日期过去,服务器会设置丢弃标志,或者域名更改适用的Cookie列表可能会更改。
不确定这是否有用,但我尝试了。