您的位置:首页 >新闻资讯

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

来源:本站 作者:admin 时间:2019-06-01 17:40:52

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


C#网络爬虫代理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- http://www.dailiyun.com/active/?%&=]*)?";

 

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=http://www.dailiyun.com/active/(['""]?)(?!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();

 


相关文章内容简介
推荐阅读