知乎爬虫(二)

JAVA爬虫--增加多线程爬取


1.项目更新

继续上一篇文章之后,其实项目一直在更新,但是博客却没有跟上,过了好几个月才更新~我们的项目目前增加了多线程爬取功能,在Initial.java里配置的dayCount和threadNum,来控制爬取的天数和线程数目,比如目前配置的是从当前天数往前爬取100天,分给10个线程去爬,每个线程爬取10天的量,这样速度就快多啦~如果想改爬取的天数和线程数目就在Initial.java里改动。

2.具体代码

在Initial.java里还增加了如下变量:
    public static ArrayList<Long> timeArray = new ArrayList<Long>();		//unix时间戳数组,分给线程分别去爬
    public static ArrayList<Integer> threadTimeArray = new ArrayList<Integer>();		//线程时间分配数组,已分配的线程不会继续分配
    
    public static ArrayList<String> tinyFoxUrls = new ArrayList<String>(); 	//已经爬取到的urls
    
    public static UrlQueue[] zhiHuUrlsQueue = new UrlQueue[threadNum];    //总线程数个UrlQueue,一个线程一个UrlQueue
    
其中,timeArray记录着各个线程的“时间限值”,比如假设第一个线程thread0爬取今天之前的10天,那么十天前的那一天的unixTime值即为thread0的时间限值,thread0从今天的unixTime开始爬,直到链接里的starttime值小于时间下限即停止爬取:
ContentParser.java:
if(Long.valueOf(data_time) >= end_time) {
        		moreContentUrl += "?start=" + data_time + "&_xsrf=" + xsrf;
        		
        	}
这样我们就可以控制线程在特定的时间区间里爬啦~

threadTimeArray其实就是一个标记值,因为实际运行下来发现,同一个线程可能会领取多次时间限值,所以就标记一下,如果已经领取了时间限值那么就不能再领取 了。

tinyFoxUrls(这个名字随便起的...)会记录爬取到的urls,这样就不会在url.txt里写重复的url。

zhiHuUrlsQueue是个UrlQueue的数组,记录着每个线程自己要爬取的url,这样各个线程就不会干扰到其他的线程。

3.存在的问题

项目里现在用了比较多的全局变量,感觉非常不好,希望后面能有时间重构下。。
另外想添加下载图片的功能,但是发现直接发问题的请求需要登录网站才能获取到源码了,但是如果直接登录网站又需要验证码,还没想到好的方法,如果大家有好的想法请大家不吝赐教~项目源码已更新:https://github.com/StormSpirit22/ZhihuSpider
非常浅显的代码,博主只是个菜鸟,但是如果每天有一点成长我就很开心了~


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值