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
非常浅显的代码,博主只是个菜鸟,但是如果每天有一点成长我就很开心了~