背景

我们在前面已经介绍过很多网络爬虫的图文:

  • 如何利用 C# 爬取 One 持有者返利数据!
  • 如何利用 C# 爬取Gate.io交易所的公告!
  • 如何利用 C# 爬取BigOne交易所的公告!
  • 如何利用 C# 爬取 ONE 的交易数据?
  • 如何利用 C# 爬取「猫眼电影:热映口碑榜」及对应影片信息!
  • 如何利用 C# 爬取「猫眼电影专业版:票房」数据!
  • 如何利用 C# 爬取「猫眼电影:最受期待榜」及对应影片信息!
  • 如何利用 C# 爬取「猫眼电影:国内票房榜」及对应影片信息!
  • 如何利用 C# + Python 破解猫眼电影的反爬虫机制?

这里有一个潜在的问题,如果网络请求过于频繁,会被对方服务器封掉IP,导致无法获取数据。

解决方案有两个:一个是降低请求的频率,另一个是使用 IP 代理服务器,即通过不同的 IP 代理服务器来进行网络请求,这样对方服务器就会认为是不同 IP 进行的网络请求,不会判定为异常,被封掉。

今天,咱们就一起通过程序来寻找免费的代理服务器,并通过代理服务器来下载 CSDN 博主的图文。


技术分析

获取免费 IP 代理服务器的网页如下:

该网页采用分页的方式进行显示,每页显示100条数据,对应的网址如下:

第一页

https://www.xicidaili.com/wt/1

第二页

https://www.xicidaili.com/wt/2

以此类推,我们就得到抓取网页的 URL 地址。

我们再来看一下网页的源码。

所有数据全部放置在 <tr> 标签中,只要我们获取对应网页的 HTML DOM TREE 即可。


代码实现

Step1 创建存储 IP 代理服务器的结构 ProxyDataItem

public class ProxyDataItem
{/// <summary>/// 国家/// </summary>public string Country { get; set; } = "cn";/// <summary>/// ip 地址/// </summary>public string IpAddress { get; set; } = string.Empty;/// <summary>/// 端口号/// </summary>public string Port { get; set; } = string.Empty;/// <summary>/// 服务器地址/// </summary>public string ServerAddress { get; set; } = string.Empty;/// <summary>/// 是否匿名/// </summary>public string IsAnonymous { get; set; } = string.Empty;/// <summary>/// 速度/// </summary>public string Speed { get; set; } = string.Empty;/// <summary>/// 连接时间/// </summary>public string ConnectionTime { get; set; } = string.Empty;
}

Step2 获取给定 URL 地址的 HTML DOM TREE。

public static IHtmlDocument GetHtmlDocument(string url)
{IHtmlDocument document;try{document = new JumonyParser().LoadDocument(url);}catch{document = null;}return document;
}

Step3 获取 IP 代理服务器的列表。

public static string EntryPoint = @"https://www.xicidaili.com/";public static List<ProxyDataItem> GetProxy(int page)
{List<ProxyDataItem> result = new List<ProxyDataItem>();string url = EntryPoint + @"/wt/" + page;IHtmlDocument document = HtmlSpiter.GetHtmlDocument(url);if (document == null)return result;List<IHtmlElement> lists = document.Find("tr").ToList();for (int i = 1; i < lists.Count; i++){ProxyDataItem item = new ProxyDataItem();List<IHtmlElement> lst = lists[i].Find("td").ToList();try{item.Country = lst[0].FindFirst("img").Attribute("alt").AttributeValue;item.IpAddress = lst[1].InnerHtml();item.Port = lst[2].InnerHtml();item.ServerAddress = lst[3].FindFirst("a").InnerHtml();item.IsAnonymous = lst[4].InnerHtml();item.Speed = lst[6].FindFirst("div").Attribute("title").AttributeValue;item.ConnectionTime = lst[7].FindFirst("div").Attribute("title").AttributeValue;result.Add(item);}catch{;}}return result;
}

Step4 验证 IP 代理服务器的有效性。

通过该 IP 代理服务器向百度服务器发出访问请求,如果返回的响应中包含“百度”这个字符串,说明通过该 IP 代理服务器能够访问百度主页,也即该 IP 代理服务器有效。

public static bool ValidateProxy(ProxyDataItem proxy)
{if (proxy == null)throw new ArgumentNullException();string address = proxy.IpAddress;int port;if (int.TryParse(proxy.Port, out port) == false)return false;try{WebProxy proxyObject = new WebProxy(address, port);HttpWebRequest req = WebRequest.Create("https://www.baidu.com") as HttpWebRequest;if (req == null)return false;req.Proxy = proxyObject; //设置代理HttpWebResponse resp = (HttpWebResponse) req.GetResponse();Encoding bin = Encoding.GetEncoding("UTF-8");using (StreamReader sr = new StreamReader(resp.GetResponseStream(), bin)){string str = sr.ReadToEnd();if (str.Contains("百度")){resp.Close();return true;}return false;}}catch{return false;}
}

Step5 通过代理服务器爬取 CSDN 博主网页。

public static bool SaveToHtml(string url, string fileName, ProxyDataItem proxy)
{string address = proxy.IpAddress;int port;if (int.TryParse(proxy.Port, out port) == false)return false;try{WebProxy proxyObject = new WebProxy(address, port);HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;if (request == null)return false;request.Proxy = proxyObject; //设置代理HttpWebResponse resp = (HttpWebResponse) request.GetResponse();Encoding bin = Encoding.GetEncoding("UTF-8");using (StreamReader sr = new StreamReader(resp.GetResponseStream(), bin)){string str = sr.ReadToEnd();StreamWriter vStreamReader = new StreamWriter(fileName, false, Encoding.UTF8);vStreamReader.Write(str);vStreamReader.Flush();vStreamReader.Close();}return true;}catch{return false;}
}

总结

我们来看一下从网站爬取的 IP 代理服务器列表(98条记录):

经过验证的 IP 代理服务器列表(18条记录):

爬取 CSDN 博主的网页:

有关爬取 CSDN 博主网页的图文可以参见:如何利用C#爬取CSDN的博客文章?。

爬取的网页列表:

好了,今天就到这里吧!希望本次介绍的技术对大家有用。See You!


相关图文

  • 如何利用 C# 实现 K 最邻近算法?
  • 如何利用 C# 实现 K-D Tree 结构?
  • 如何利用 C# + KDTree 实现 K 最邻近算法?
  • 如何利用 C# 对神经网络模型进行抽象?
  • 如何利用 C# 实现神经网络的感知器模型?
  • 如何利用 C# 实现 Delta 学习规则?
  • 如何利用 C# 爬取带 Token 验证的网站数据?
  • 如何利用 C# 向 Access 数据库插入大量数据?
  • 如何利用 C# 开发「桌面版百度翻译」软件!
  • 如何利用 C# 开发「股票数据分析软件」(上)
  • 如何利用 C# 开发「股票数据分析软件」(中)
  • 如何利用 C# 开发「股票数据分析软件」(下)
  • 如何利用 C# 爬取「财报说」中的股票数据?
  • 如何利用BigOne的API制作自动化交易系统 – 身份验证
  • 如何利用BigOne的API制作自动化交易系统 – 获取账户资产
  • 如何利用BigOne的API制作自动化交易系统 – 订单系统

技术图文:如何利用C#寻找免费的IP代理服务器?相关推荐

  1. python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?

    原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...

  2. 技术图文:如何利用BigOne的API制作自动化交易系统--网格交易法

    背景 前面,通过图文 如何利用 C# 爬取 ONE 的交易数据? 向大家介绍了如何爬取在 BigOne 上线的数字资产的交易数据. 其次,通过图文 如何利用BigOne的API制作自动化交易系统 – ...

  3. 如何利用互联网寻找创业的突破口

    不管你从事什么行业,做什么产品,都要把产品或服务做到极致,真正懂得商品价值的人他们在乎的不是钱,而是品味是否高.如何利用互联网寻找创业的突破口? 首先剖析如何做? 线下连锁服务+线上电商 做线下连锁服 ...

  4. 技术图文:排序技术在求解算法题中的应用

    背景 前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第五篇图文. 理论部分 C# 中的排序 对集合类的排序,我们通常使用位于 System.Core 程序集,System.Lin ...

  5. 利用免费代理ip网站建立自己IP数据库

    00.写在前面: 呃-.前两天爬取NSIDC的数据的时候被封IP,导致我不能下载数据,科研止步不前,于是下定决心来建立一个自己的代理IP池. 欢迎大家指出问题,共同学习.我只是一个萌新... 所用到的 ...

  6. 神经网络 mse一直不变_利用神经网络寻找超新星

    简介 天文学是研究天体的学科,其研究对象包含恒星.星系.黑洞等.研究天体有点像在自然物理实验室做实验.在这个实验室里,会发生自然界中最为极端的变化过程,而这些过程中的绝大部分都无法在地球上重现.通过比 ...

  7. 利用jsdelivr创建免费的CDN

    原文地址: 利用jsdelivr创建免费的CDN jsDelivr 首先对于cdn相信大家都不会陌生,国内外也有不少云服务提供付费的cdn服务,但对于我们这些开发者而言确实是有些不划算,所以今天就给大 ...

  8. python个人博客搭建说明书_技术分享|利用Python Django一步步搭建个人博客(二)...

    原标题:技术分享|利用Python Django一步步搭建个人博客(二) Hello,欢迎来到我们的"利用Python Django一步步搭建个人博客"系列的第二部分.在第一部分中 ...

  9. 如何利用OpenCV寻找轮廓的中心?

    简 介: 本文介绍了利用OpenCV和Python编程来计算形状轮廓的中心点.当然后面还会继续给出如何通过轮廓来分辨物体形状种类,以及对于各自的颜色进行标准. 关键词: OpenCV,contours ...

  10. .net oa 用到那些技术_一起来看看选择免费OA办公系统的难点

    当今许多企业都引入了免费OA办公系统作为管理工具,免费OA软件对企业管理的帮助也是有目共睹,但也有很多企业不能挑选到心仪的免费OA办公系统,使得免费OA并没有充分发挥作用,今天跟小晴来一起探讨这个问题 ...

最新文章

  1. 数据与分析领域的十大技术趋势
  2. MySQL两表联查,根据不同条件获得不同数据
  3. php having,having方法
  4. 前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?
  5. python数据变更邮件提醒_如何使python脚本在某些数据更改时自动发送电子邮件?...
  6. 关于js函数未定义not defined引发的感想
  7. 【动态规划】subsequence 1
  8. nginx服务器带宽_如何设置服务器的带宽?
  9. 查看sql_一键查看Oracle数据库当前SQL_WORKAREA_ACTIVE的相关操作
  10. 苍溪实验中学计算机等级考试,苍溪实验中学2021年招生录取分数线
  11. 计算机培训中学语文研修计划,初中语文个人研修计划书
  12. 微信公众平台教程,注册申请、认证、开发、推广营销,教你怎么用微信公众号...
  13. Unity项目在pc和ios设备上黑屏的原因探究
  14. 以虎嗅网4W+文章的文本挖掘为例,展现数据分析的一整套流程
  15. RTSP/Onvif视频智能平台EasyNVR播放视频卡顿的原因分析及解决
  16. 链接如何生成二维码?怎样创建一个网址二维码?
  17. C语言:实现蛇形数组
  18. golang中的值类型和引用类型
  19. 根据word自动生成html代码文件
  20. 添加到收藏夹和设置首页代码大全

热门文章

  1. 机器学习之------信号处理(入门原理)
  2. 计算机鼠标游戏教学法,浅谈游戏教学法在信息技术教学中的应用论文
  3. 大屏可视化之适配和布局
  4. H5 font标签及其属性
  5. 微信昵称 mysql_MySQL数据库之解决微信昵称含特殊表情或字符无法存入数据库的异常问题...
  6. 分享五个免费图片/视频资源网站
  7. 文件系统 - 文件类型 - 二进制/文本类型
  8. 联想微型计算机改win7,联想win10改win7如何实现?联想电脑Win10改Win7方法详解
  9. 联想win7旗舰版忘记开机密码--有效处理办法
  10. 镜头相关的基本参数总结