代理云

申请试用
 
主页  >  行业动态  >  文章详情
 

C#网络爬虫代理ip抓取图片

来源:官方 发布:2017-05-16

  C#网络爬虫代理ip抓取图片怎么抓?最近在研究C#爬虫,先从简单的指定网站图片爬虫开始。其次就是代理ip,使用代理云代理IP成功率更高,真实高质量高匿代理IP,分布式。


  这个程序的工作原理如下图,自己画的图,相当丑,各位讲究看吧。




  接下去就和大家分享一下我用代理ip的思路:


  1. 在基址采集图片


  2. 去基址采集链接


  3. 把采集到的链接放入队列


  4. 继续采集图片,然后继续采集链接,无限循环


  这里准备了4个队列


  1. 等待采集链接的 NconnUrls


  2. 等待采集图片链接的 LoadingUrls


  3. 已经采集过图片的链接 UsedUrls


  4. 已经采集过链接的链接 UsedConnUrls


5. 已经使用过的图片链接 UsedImgUrls


  《代理云四大优势,稳固品牌地位》


  1、资源优势:代理节点覆盖全国各省市


  聚合多种高质量节点资源,其中拨号节点600+,个人节点20000+,散段IP随机分配。


  2、技术优势:自主研发的代理服务器


  超过8年研发高性能web服务器,具有丰富的大规模分布式系统设计经验。


  3、服务优势:1v1服务,提升客户价值


  从注册账户到客户消费,您都可以享受代理云平台贯穿生命周期的尊贵1v1服务。


  4、经验优势:行业定制方案超过80例


  4年内为多家小中企业定制专属代理服务器池方案。客户好评率高达99%。


  这里分享一下源代码:


  获取网页的HTML,这里说一下我在编写的时候遇到的bug,首先是代理ip的价格,刚抓去了几个页面,HttpWebRequest就抓取不到页面了,全是操作超时,原因就是HttpWebRequest用完了没关。


  /// 获取HTML所有的源代码


  public static string HtmlCode(string url)


  {


  if (string.IsNullOrEmpty(url))


  {


  return "";


  }


  try


  {


  //创建一个请求


  HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(url);


  webReq.KeepAlive = false;


  webReq.Method = "GET";


  webReq.UserAgent = "Mozilla/5.0 (Windows NT 5.1; rv:19.0) Gecko/20100101 Firefox/19.0";


  webReq.ServicePoint.Expect100Continue = false;


  webReq.Timeout = 5000;


  webReq.AllowAutoRedirect = true;//是否允许302


  ServicePointManager.DefaultConnectionLimit = 20;


  //获取响应


  HttpWebResponse webRes = (HttpWebResponse)webReq.GetResponse();


  string content = string.Empty;


  using (System.IO.Stream stream = webRes.GetResponseStream())


  {


  using (System.IO.StreamReader reader =


  new StreamReader(stream, System.Text.Encoding.GetEncoding("utf-8")))


  {


  content = reader.ReadToEnd();


  }


  }


  webReq.Abort();


  return content;


  }


  catch (Exception)


  {


  return "";


  }


  }


  用正则表达式筛选HTML中的img


  12345678910111213141516171819202122232425 ///


  /// 取得HTML中所有图片的 URL。


  ///


  /// HTML代码


  /// 图片的URL列表


  public static List GetHtmlImageUrlList(string url)


  {


  string html = HttpHelper.HtmlCode(url);


  if (string.IsNullOrEmpty(html))


  {


  return new List();


  }


  // 定义正则表达式用来匹配 img 标签


  Regex regImg = new Regex(@"]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*


  (?[^\s\t\r\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);


  // 搜索匹配的字符串


  MatchCollection matches = regImg.Matches(html);


  List sUrlList = new List();


  // 取得匹配项列表


  foreach (Match match in matches)


  sUrlList.Add(match.Groups["imgUrl"].Value);


  return sUrlList;


  }


  用正则表达式筛选HTML中所有link


  public static List GetLinks(string url)


  {


  string html = HttpHelper.HtmlCode(url);


  if (string.IsNullOrEmpty(html))


  {


  return new List();


  }


  //匹配http链接


  const string pattern2 = @"http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?";


  Regex r2 = new Regex(pattern2, RegexOptions.IgnoreCase);


  //获得匹配结果


  MatchCollection m2 = r2.Matches(html);


  List links = new List();


  foreach (Match url2 in m2)


  {


  if (StringHelper.CheckUrlIsLegal(url2.ToString()) || !StringHelper.IsPureUrl(url2.ToString())


  || links.Contains(url2.ToString()))


  continue;


  links.Add(url2.ToString());


  }


  //匹配href里面的链接


  const string pattern = @"(?i)]*?href=(['""]?)(?!javascript|__doPostBack)


  (?[^'""\s*#<>]+)[^>]*>";


  Regex r = new Regex(pattern, RegexOptions.IgnoreCase);


  //获得匹配结果


  MatchCollection m = r.Matches(html);


  // List links = new List();


  foreach (Match url1 in m)


  {


  string href1 = url1.Groups["url"].Value;


  if (!href1.Contains("http"))


  {


  href1 = Global.WebUrl + href1;


  }


  if (!StringHelper.IsPureUrl(href1) || links.Contains(href1)) continue;


  links.Add(href1);


  }


  return links;


  }


  开始收集图片


  /// 收集图片


  private void DownLoading()


  {


  if (LoadingUrls.Count < 1)


  {


  TextResultChange("-----------下载完毕,正在重新收集链接 \r\n");


  CollectionUrls();


  }


  else


  {


  //继续下载


  //Tdown.Start();


  StartDownLoad();


  }


  }


  收集链接


  /// 开始爬行网页


  private void CollectionUrls()


  {


  if (NconnUrls.Count > 0)


  {


  try


  {


  string url = NconnUrls.FirstOrDefault();


  //加入链接已采集存档


  UsedConnUrls.Add(url);


  //获取该链接的所有URL


  List urlList = HttpHelper.GetLinks(url);


  foreach (string url1 in urlList)


  {


  //如果没采集过链接


  if (!UsedConnUrls.Contains(url1))


  {


  NconnUrls.Add(url1);


  }


  //如果没采集过图片


  if (!UsedUrls.Contains(url1))


  {


  LoadingUrls.Add(url1);


  }


  }


  //删除已使用


  NconnUrls.RemoveAt(0);


  }


  catch (Exception)


  {


  }


  DownLoading();


  }


  else


  {


  TextResultChange("-----------任务结束,全部爬行完毕 \r\n");


  }


  }


  下载图片,这边下载图片有个最多任务条数限制,我限制的是200条。如果超过的话线程等待5秒,这里下载图片是异步调用的委托


  /// 下载中


  ///


  private void StartDownLoad()


  {


  //是否超过最大的队列


  if (_downingPicCount < _maxtask)


  {


  List imgurls = HttpHelper.GetHtmlImageUrlList(LoadingUrls.FirstOrDefault());


  UsedUrls.Add(LoadingUrls.FirstOrDefault());


  LoadingUrls.RemoveAt(0);


  foreach (string url in imgurls)


  {


  if (!UsedImgUrls.Contains(url))


  {


  //创建异步下载


  DownloadHelper helper = new DownloadHelper();


  StopTimeHandler stop = new StopTimeHandler(helper.DowloadImg);


  AsyncCallback callback = new AsyncCallback(onDownLoadFinish);


  IAsyncResult asyncResult = stop.BeginInvoke(url, callback, "--下载完成 \r\n");


  //链接载入已使用


  UsedImgUrls.Add(url);


  TipStartDownLoad();


  }


  }


  imgurls.Clear();


  TextUrlChange("");


  }


  else


  {


  Thread.Sleep(5000);


  TextResultChange("-----------任务过多,搜集程序休眠5秒 \r\n");


  }


  DownLoading();


最新文章
热门文章
Copyright©2014 版权归属 代理云 吉ICP备16003059号-5 增值电信经营许可证:B2-20170117
   
wee

商务洽谈

为保证客户使用质量,代理云采用渠道销售方式。
请联系下方商务人员洽谈需求!

 

商务 - 小卜

商务 - 老李

手机:153-2632-8586

手机:133-3160-3344