- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章JAVA 多线程爬虫实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
JAVA 多线程爬虫实例详解 。
前言 。
以前喜欢Python的爬虫是出于他的简洁,但到了后期需要更快,更大规模的爬虫的时候,我才渐渐意识到Java的强大。Java有一个很好的机制,就是多线程。而且Java的代码效率执行起来要比python快很多。这份博客主要用于记录我对多线程爬虫的实践理解.
线程 。
线程是指一个任务从头至尾的执行流。线程提供了运行一个任务的机制。对于Java而言,可以在一个程序中并发地启动多个线程。这些线程可以在多处理器系统上同时运行.
runnable接口 。
任务类必须实现runnable接口,它只包含一个run方法。需要实现这个方法来告诉系统线程将如何运行.
Thread类 。
包含为任务而创建的线程的构造方法,以及控制线程的方法.
synchronized关键字 。
为避免竞争状态,防止多个线程同时进入程序的某个特定部分,即临界区,以便一次只有一个线程可以访问临界区.
利用加锁同步 。
Java可以显式加锁,一个锁是一个Lock接口的实例,它定义了加锁和释放锁的方法.
线程池 。
线程池是管理开发执行任务个数的理想方法。Java提供Executor接口来执行线程池中的任务,提供ExecutorService接口管理和控制任务.
使用线程池的方法获取url列表 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
import
java.util.ArrayList;
import
java.util.List;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.locks.Lock;
import
java.util.concurrent.locks.ReentrantLock;
/*
* 获取京东评论url列表
*/
public
class
MyThreading {
private
static
String p_id =
null
;
private
static
Url urls =
null
;
public
MyThreading(String p_id){
this
.p_id = p_id ;
// 京东商品的id
urls =
new
Url(p_id);
}
public
List<String> getUriList(){
ExecutorService executor = Executors.newCachedThreadPool();
for
(
int
i =
0
; i <
600
; i ++){
executor.execute(
new
AddUrl(i));
// 添加任务到线程池
}
executor.shutdown();
while
(!executor.isTerminated()){}
return
urls.getList();
}
public
static
class
AddUrl
implements
Runnable{
int
page;
public
AddUrl(
int
page){
this
.page = page;
}
public
void
run(){
urls.addList(page);
// 启动多线程任务
}
}
public
static
class
Url {
private
static
Lock lock =
new
ReentrantLock();
// 开启显式家锁
private
static
List<String> urlList =
new
ArrayList();
private
String p_id;
public
Url(String p_id ){
this
.p_id = p_id ;
}
public
List<String> getList(){
return
urlList;
}
public
void
addList(
int
page){
lock.lock();
try
{
String url =
"http://club.jd.com/productpage/p-"
+ p_id +
"-s-0-t-0-p-"
+ String.valueOf(page) +
".html"
;
// Thread.sleep(5);
urlList.add(url);
//添加url到url列表
}
catch
(Exception ex ){
}
finally
{
lock.unlock();
// 解锁
}
}
}
public
static
void
main(String[] args) {
String p_id =
"2441288"
;
MyThreading myThreading =
new
MyThreading(p_id);
List <String> urlList = myThreading.getUriList();
for
(String url : urlList){
System.out.println(url);
}
System.out.println(urlList.size());
}
}
|
代码分析 。
使用线程池的方法根据url列表爬取网页元素 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
import
java.io.BufferedReader;
import
java.io.InputStreamReader;
import
java.net.URL;
import
java.net.URLConnection;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
import
java.util.concurrent.locks.Lock;
import
java.util.concurrent.locks.ReentrantLock;
import
java.util.regex.Matcher;
import
java.util.regex.Pattern;
public
class
ThreadingCrawel {
private
static
Content content =
null
;
private
static
List<String> urlList =
null
;
public
ThreadingCrawel(List<String> urlList){
this
.urlList = urlList;
content =
new
Content();
}
public
List<String> getContent(){
ExecutorService executor = Executors.newCachedThreadPool();
for
(String url : urlList){
executor.execute(
new
AddContent(url));
}
executor.shutdown();
while
(!executor.isTerminated()){}
return
content.getContent();
}
public
static
class
AddContent
implements
Runnable{
String url;
public
AddContent(String url){
this
.url = url;
}
public
void
run(){
content.addContent(url);
}
}
public
static
class
Content {
private
static
Lock lock =
new
ReentrantLock();
private
static
List<String> contentList =
new
ArrayList();
public
void
addContent(String url){
String content =
""
;
BufferedReader in =
null
;
try
{
URL realUrl =
new
URL(url);
URLConnection connection = realUrl.openConnection();
in =
new
BufferedReader(
new
InputStreamReader(connection.getInputStream(),
"gbk"
));
String line;
while
( (line = in.readLine()) !=
null
){
content += line +
"\n"
;
}
}
catch
(Exception e){
e.printStackTrace();
}
finally
{
try
{
if
(in !=
null
){
in.close();
}
}
catch
(Exception e2){
e2.printStackTrace();
}
}
Pattern p = Pattern.compile(
"content\":\".*?\""
);
Matcher match = p.matcher(content);
String tmp;
lock.lock();
while
(match.find()){
tmp = match.group();
tmp = tmp.replaceAll(
"\""
,
""
);
tmp = tmp.replace(
"content:"
,
""
);
tmp = tmp.replaceAll(
"<.*?>"
,
""
);
contentList.add(tmp);
try
{
Thread.sleep(
1
);
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
lock.unlock();
}
public
List getContent(){
return
contentList;
}
}
public
static
void
main(String[] args){
long
start = System.currentTimeMillis();
String p_id =
"2441288"
;
MyThreading myThreading =
new
MyThreading(p_id);
List <String> urlList = myThreading.getUriList();
ThreadingCrawel threadingCrawel =
new
ThreadingCrawel(urlList);
List <String> contentList = threadingCrawel.getContent();
for
(String content : contentList){
System.out.println(content);
}
long
end = System.currentTimeMillis();
System.out.println(end - start);
}
}
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
原文链接:http://blog.csdn.net/qq_30843221/article/details/52486735 。
最后此篇关于JAVA 多线程爬虫实例详解的文章就讲到这里了,如果你想了解更多关于JAVA 多线程爬虫实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我在一个网站上工作。 我需要了解我的网站是否获得了来自 Google 或任何其他搜索引擎的抓取工具/机器人的访问 在我的应用程序中,我正在拦截 http 请求。并且需要查明爬虫/机器人是否正在发出 h
我与北京理工大学python爬虫的邂逅 在人生的旅途中,我们时常有机会邂逅一些惊艳的事物,它们仿佛一束亮光照亮了前行的道路。而我,一个平凡的人类,也不例外。回想起那个让我心动的时刻,我想起了与北京理工
从“爬虫”谈起 在这个信息爆炸的时代,互联网上的数据宛如茫茫星海,琳琅满目。但是,我们能否想象到这些数据背后隐藏着多少珍贵的信息呢?有人说,要想获得这些数据,我们需要借助一种神奇的力量——爬虫。 什么
探索未知的领域 曾几何时,我陷入了对互联网世界的好奇之中。作为一个普通的人类,我对于计算机技术的了解可谓是一窍不通。然而,好奇心驱使着我踏上了学习的征途。 奇妙的爬虫 在探索计算机领域的过程中,我翻阅
教室的奇妙之旅 在一个晴朗的早晨,我来到了一所神奇且富有魅力的教室。这里充满了未知的冒险和无限的学习可能。嘿,你没听错,就是那个零基础Python视频教程课程的教室!让我带你一起踏上这趟令人期待的爬虫
零基础学python3 爬虫 嗨,各位小伙伴们!今天要和大家分享一段有关学习Python3爬虫的故事。无论是技术小白还是编程高手,都可以从中获益良多。 1. 邂逅神奇的爬虫世界 就像是迷失在未知之地的
我正在开发一个 Python(3) 程序,在该程序中,我必须使用输入作为表示各种操作的多次迭代列表来返回目录迭代的移动次数,例如: ../ 表示移动到当前文件夹的父文件夹。 ./ 保留在同一文件夹中
我和Python:一段关于爬虫和第三方库的故事 曾经有一个人,他和一门编程语言结下了不解之缘。这门语言就是Python,一个灵活而强大的工具,让他的世界变得多姿多彩。 遇见爬虫:探索未知的世界 某天,
偷心技艺:大众点评TOP10 爬虫 Python 故事发生在一个被互联网包围的城市,充满了各种各样的餐馆、咖啡厅和美食街巷。每天都有无数的食客们纠结于选择哪家餐厅才能获得满足和享受。就在这个时候,我偶
登山寻宝:为什么Python爬虫部分网页源码 人生就像登山寻宝的旅程,充满了未知和挑战。而对于爱好编程的我来说,写一个Python爬虫,探索网络世界也是一种刺激的冒险。今天,我想和大家分享一下为什么要
插班生的悲喜交加 记得那个夏天,我踏入了编程的殿堂,成为了一名程序员。对于一个毫无基础的人来说,这是一次勇敢而激动的尝试。然而,更令我兴奋的是,在我的码农之旅中,我发现了一种神奇的力量——Python
一、 意外的宝藏 当我踏进了编程的大门,发现了那个绚丽多彩的世界时,我仿佛捡到了一个意外的宝藏。在编码的世界里,我像是一个魔术师,用着神奇的符号与逻辑来创造奇迹。然而,随着时间的推移,我渐渐找到了一种
“呜呜呜~” 夏日的阳光穿过微风,洒在我身上,仿佛一片温暖而宁静的海洋。我望着眼前充满希望与挑战的屏幕,满脸的期待和困惑。作为一个刚刚入门的编程初学者,我竭尽全力探索着那座神秘的编程世界,好像是航行在
我的编程之旅 嗨,大家好!我是一个普通的人类,对于编程世界充满着无限的好奇和热情。今天,我想向大家讲述一段关于我的编程经历,特别是在爬虫领域的探索之旅。 1. 踏上未知的征途 就像一只踏上大海的小船,
揭秘神奇的爬虫世界:探寻京东销量数据库 从古至今,人类一直渴望了解世界的各个角落。而对于互联网这个充满未知和神秘的领域来说,我们更是怀着好奇和充满冒险精神的心态去探索。今天,我将带领大家踏上一段激动人
啊!你好呀!很高兴能遇到你,让我向你讲一个关于python爬虫爬取关键词排名的故事。 章节一:奇妙的网络世界 网络就像一片浩瀚的海洋,里面有无数宝藏等待着我们发掘。而当我们学会了使用python这把钥
一次意外的奇遇 在我们生活的世界中,技术如今已经无处不在,无论是大型软件开发还是个人应用,都离不开它的支持。而其中最为神奇的领域之一,就是爬虫技术。想象一下,你有可能仅凭几行代码,就能够在电脑屏幕上将
奇遇之旅 在这个大千世界中,我有幸踏上了一次令人兴奋的冒险之旅。故事的开始,是一个寂静而神秘的夜晚。 迷宫的入口 深夜的城市,街道上弥漫着微弱的灯光,仿佛点缀着无数的星星。我沿着曲径通幽的小巷走着,脚
python 爬虫 自动上传下载 从前有一个热爱编程的小伙子,他喜欢利用自己的技术解决各种实际问题。有一天,他面对一个任务:需要在网络上批量上传和下载文件。这可不是一件轻松的工作,但对于这位小伙子来说
一场奇妙的探险之旅:Python编程语言中的爬虫第三方库 故事从一个寻宝者开始。他身穿一件斑驳的皮衣,手持一柄锈迹斑斑的剑,如同一个当代版的荒野游侠。这位勇士的目标是探索Python编程语言中的神秘领
我是一名优秀的程序员,十分优秀!