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- 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();
28
2019-04
23
2019-05
06
2019-05
15
2019-04
26
2019-04
31
2019-05