日期:2014-05-17  浏览次数:20778 次

使用socket抓去网页数据
自己封了一个MYsocket,底层用的是socket ,(需要登录)用来抓网页数据。
我同时开10个线程去抓,但是返回的结果并不是线程启动的顺序,有可能最先启动的线程最后才反回结果(不知道是为什么)。
目前我已经实现了一些功能:
1.socket长连接
2.自动登录,并通过时钟刷新某个网页来保持session不失效
3. System.Net.ServicePointManager.DefaultConnectionLimit = 1000
如果我想尽可能的提高抓取的速度,需要怎么做?
PS:白天人多的时候服务器非常卡,闲时完整的一个来回3s左右,最卡的时候差不多要15s。
200分不够,可以再开帖放分。谢谢了

------解决方案--------------------
“但是返回的结果并不是线程启动的顺序” 这个无碍,如果你要靠这个顺序识别数据 只能说明你的 程序不够完善

Threading.ThreadPool.SetMaxThreads(100, 500) 最大线程数100,最大io线程数500
System.Net.ServicePointManager.DefaultConnectionLimit = 1000 我一般只设256
socket长连接 需要看服务器是否支持长连接,现在服务器应该都支持,个人觉得webclient封装下cookie 足矣支援 cookie和session , 自己封装socket要注意妥善处理 连接断开问题,否则根据tcp响应规则 太多的等待关闭端口 小心弱爆你 具体查看》cmd》netstat -an

你的10个线程 不知是单线程还是线程池里,建议使用线程池

多线程往往涉及数据共享问题,这个要注意
------解决方案--------------------
线程执行本来就不是高级语言所能控制的.
下面的话来自msdn对于Thread.Priority Property的解释:
Operating systems are not required to honor the priority of a thread.

意思是即使设置了Priority, 操作系统不承诺一定按照Proirity来执行线程。更何况没有指定了。

参考:
http://msdn.microsoft.com/en-us/library/system.threading.thread.priority.aspx




如果想保证order的话,可以读读这篇文章:
Ordered Execution With ThreadPool
http://msdn.microsoft.com/en-us/magazine/dd419664.aspx
------解决方案--------------------
探讨

我跟踪了一下代码,所有的时间都花在socket.revice上面了,至少都在5s以上。
同样的环境,我用网上一个现成的软件,它能控制在3s以内,一般都是2s。
不知道还有没有可以提升的地方。

------解决方案--------------------
探讨

我跟踪了一下代码,所有的时间都花在socket.revice上面了,至少都在5s以上。
同样的环境,我用网上一个现成的软件,它能控制在3s以内,一般都是2s。
不知道还有没有可以提升的地方。