http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 9280|回复: 10

[求助] 关于目标服务器对访问频率做了限制的解决方案

[复制链接]
发表于 2014-10-24 14:53:08 | 显示全部楼层 |阅读模式
我在做一个项目遇到了目标服务器对访问频率做了限制这种问题,一台电脑访问这个网站成功响应次次之后不再响应,五分钟后会再次响应。我测试过访问完一次后换一个网卡再访问,能再次收到响应。

于是我计划,通过连接多个外置网卡,设置多线程,每个线程控制一个网卡访问外网,能增加一个时段内的访问次数。


然后,我自己的解决方案是:
一,通过socket来绑定ip然后访问,这个我只是简单测试了一下,是可以同时访问的。但是如果全部由httpHelper改写为socket我感觉太麻烦了,就没有继续做。


二,在HttpWebRequest里通过BindIPEndPointDelegate这个委托处理,我外接了两个网卡再接到路由,网卡ip 192.168.1.100  192.168.1.101  通过绑定ip能访问外网,但是两个线程,同时只能一个线程访问,而且访问一次的时间较长。
问题具体说明:
1.同时只能一个线程访问,给我的感觉是实际这个委托并没有绑定到对应的网卡,只是设置了一个ip给请求。因为我把代码里的ip直接改为非网卡本身的ip依然可以访问,比如 192.168.1.105。
我有看到一些资料说,如果windows下有两个网卡都能连接外网,实际只有一个网卡做发送和接收,另一个网卡只接收数据。
http://www.cnblogs.com/cesium/archive/2010/08/14/1799706.html  
上面这个帖子应该是一个网卡多个ip的,也设置了一个Thread.Sleep(ServicePointManager.MaxServicePointIdleTime);还是在一个线程下的,所以我估计是windows系统是由一个ServicePointManager统一控制设备信息。
我也查了一些资料,比如说通过修改路由表能解决这类问题。
2.
                //设置对外访问所使用网卡的IP
                //string sendingIp = "192.168.0.1";
                //设置对外访问所使用的端口
                //int sendingPort = 80;
                Uri uri = new Uri(item.URL);
                //HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(uri);
                //获取对外访问的包,并指定使用那个IP(网卡)与端口来发送数据包
                ServicePoint sp = ServicePointManager.FindServicePoint(uri);
                sp.BindIPEndPointDelegate = (servicePoint, remoteEp, retryCount) =>
                {
                    return new IPEndPoint(IPAddress.Parse(sendingIp ), sendingPort );
                };
                //提交请求并获取返回结果
                //var data = new StreamReader(wr.GetResponse().GetResponseStream()).ReadToEnd();



通过这样的方式尝试能双线程访问,但 “System.Net.Sockets.SocketException”类型的第一次机会异常在 System.dll 中发生,多线程访问一段时间也内部挂掉了,原因不明。


3.不熟悉监听,虽然有时看着程序在运行,但无法证实是在对应的网卡上请求和响应。最好有专门的程序能测试一下。


由于了解c#和网络通讯的时间较短,对这类比较深入的问题很难定性分析解决。
如果有关于目标服务器对访问频率做了限制的成熟解决方案,请不吝赐教,万分感激。
不到万不得已的情况下,不想用多个电脑处理,或者虚拟机,分布式处理的方法。


此问题我会持续解决,请各位朋友多提建议,谢谢。
socket貌似是可以的,至少测试多线程一个请求时都能收到响应,且未报异常,只是我不知道怎么监听确认每个线程是从不同网卡请求响应的。真心不想把httpHelper全部改成socket,太折腾。
BindIPEndPointDelegate网上有一些帖子,但我这里没有实际解决问题。
有没有懂系统操作网卡原理的朋友?




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2014-10-24 14:53:53 | 显示全部楼层
沙发,自己留。
发表于 2014-10-24 19:01:30 | 显示全部楼层
可能使用proxy会更好一些,毕竟这样切换麻烦了。
对了,你所说的第一个用socket的办法,效率如何?
 楼主| 发表于 2014-10-24 19:04:30 | 显示全部楼层
kueiwa 发表于 2014-10-24 19:01
可能使用proxy会更好一些,毕竟这样切换麻烦了。
对了,你所说的第一个用socket的办法,效率如何?

代理应该怎么样?才弄网络编程,代理方面没有很懂的。或者相关资源?
我一开始还以为你说的是本地多网卡之间的代理。

socket的效率我没测,只是试了能响应。
发表于 2014-10-24 19:15:59 | 显示全部楼层
百度关键词“代理ip”,一大堆呢
 楼主| 发表于 2014-10-24 19:18:04 | 显示全部楼层
kueiwa 发表于 2014-10-24 19:15
百度关键词“代理ip”,一大堆呢

哥哥,我是买了然后调用他们的api还是他们直接提供ip,然后我直接写在代理里加上账号密码?

我果然新手啊
发表于 2014-10-24 21:17:46 | 显示全部楼层
asaman 发表于 2014-10-24 19:18
哥哥,我是买了然后调用他们的api还是他们直接提供ip,然后我直接写在代理里加上账号密码?

我果然新 ...

直接使用代理的ip,话说,api能能提供实时切换ip,如果几万个ip在查询,再如何限制也没毛用的了
 楼主| 发表于 2014-10-25 10:16:57 | 显示全部楼层
kueiwa 发表于 2014-10-24 21:17
直接使用代理的ip,话说,api能能提供实时切换ip,如果几万个ip在查询,再如何限制也没毛用的了

感谢朋友指点。膜拜中....!
发表于 2014-10-25 21:10:39 | 显示全部楼层
我只是路过打酱油的。
发表于 2014-10-27 12:54:01 | 显示全部楼层
注意不要用代理服务器传输重要资料。可能会被盗号
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-4-25 18:49

© 2014-2021

快速回复 返回顶部 返回列表