【发布时间】:2012-07-21 13:09:22
【问题描述】:
我正在开发一个在 Google 搜索结果的 URL 中搜索电子邮件地址的应用。问题是它需要将它在每个页面中找到的值 + 找到电子邮件的 URL 返回到具有 2 列的 datagridview:电子邮件和 URL。 我为此使用 Parallel.ForEach,但它当然会返回随机 URL,而不是它真正找到电子邮件的 URL。
public static string htmlcon; //htmlsource
public static List<string> emailList = new List<string>();
public static string Get(string url, bool proxy)
{
htmlcon = "";
try
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
if (proxy)
req.Proxy = new WebProxy(proxyIP + ":" + proxyPort);
req.Method = "GET";
req.UserAgent = Settings1.Default.UserAgent;
if (Settings1.Default.EnableCookies == true)
{
CookieContainer cont = new CookieContainer();
req.CookieContainer = cont;
}
WebResponse resp = req.GetResponse();
StreamReader SR = new StreamReader(resp.GetResponseStream());
htmlcon = SR.ReadToEnd();
Thread.Sleep(400);
resp.Close();
SR.Close();
}
catch (Exception)
{
Thread.Sleep(500);
}
return htmlcon;
}
private void copyMails(string url)
{
string emailPat = @"(\b[a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}\b)";
MatchCollection mailcol = Regex.Matches(htmlcon, emailPat, RegexOptions.Singleline);
foreach (Match mailMatch in mailcol)
{
email = mailMatch.Groups[1].Value;
if (!emailList.Contains(email))
{
emailList.Add(email);
Action dgeins = () => mailDataGrid.Rows.Insert(0, email, url);
mailDataGrid.BeginInvoke(dgeins);
}
}
}
private void SEbgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//ALOT OF IRRELEVAMT STUFF BEING RUN
Parallel.ForEach(allSElist.OfType<string>(), (s) =>
{
//Get URL
Get(s, Settings1.Default.Proxyset);
//match mails 1st page
copyMails(s);
});
}
就是这样:我执行一个 Get 请求(其中“s”是列表中的 URL),然后从 URL 的 html 源执行 copyMails(s)。它使用正则表达式来复制电子邮件。 如果我在没有并行的情况下执行此操作,它会为 datagridview 中的每封电子邮件返回正确的 URL。我怎样才能做到这一点并在 datagridview 中仍然得到正确的匹配?
谢谢
【问题讨论】:
-
您能否更清楚地描述 copyValue 中发生的事情。我说的对吗,您从结果页面获取 URL 并向该页面发出 http 请求以检索真实 URI,并在 Get 操作中完成?
-
基本上 copyValue() 读取 GET 返回的 html 并在 html 中搜索值。
-
这两种方法很可能在线程之间共享某些东西。当可以展示他们的实现时,我可以说更多。
-
@Regfor OK 查看我的帖子 - 我编辑并放置了整个相关代码。再次感谢!
-
澄清一下:“正确匹配”是在输入
allSElist中的URL 顺序和mailDataGrid中的电子邮件列表之间?
标签: c# foreach parallel-processing plinq