多线程爬虫遇到问题求大神指教
2014-11-02 23:36
239 查看
老师要求做个爬虫..遇到一些疑惑求大神们指教,感激不尽有100,000个pdf下载地址的txt,从txt里取地址,然后多线程将pdf下载到本地电脑上
下载方法的主代码:
package crawler;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
public class DownLoading2 {
/**
* @param args
try {
//建立PDF下载的目的文件夹
// String dir = "d:/pdf/";
String dir = "d:/pdf/";
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
if(LinkQueue.unVisitedUrlsEmpty() || LinkQueue.getVisitedUrlNum() > 10200){
System.exit(0);
}
//未访问url出队列,入已访问url队列,在done.txt文件中写出,在输出面板中打印
//此处需互斥量
String pdf = LinkQueue.unVisitedUrlDeQueue().toString();
//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
FileWriter writer = new FileWriter( dir + "done.txt", true);
writer.write(pdf + "\n");
}
System.out.println(pdf);
//下载pdf文件,文件名以url中的最后一个名字命名
URL u = new URL(pdf);
try{
InputStream i = u.openStream();
OutputStream bos = new FileOutputStream(new File(dir + fileName));
while ((len = i.read(b)) != -1) {
bos.write(b, 0, len);
i.close();
} catch(UnknownHostException e){
//e.printStackTrace();
System.out.println("UnknownHostException");
}
//判断url访问失败或线程长时间未响应,把url从已访问队列删除,不放回未访问队列
HttpURLConnection urlcon=(HttpURLConnection)u.openConnection();
if(urlcon.getResponseCode()>=400){
System.out.println("服务器响应错误");
System.exit(-1);
}
/*if( ){
&n; WORD-WRAP: break-word; WHITE-SPACE: normal; LETTER-SPACING: normal; FONT-WEIGHT: normal; WORD-SPACING: 0px; -webkit-text-stroke-width: 0px">
}catch (MalformedURLException e) {
//e.printStackTrace();
System.out.println("MalformedURLException");
} catch (IOException e) {
e.printStackTrace();
}
}}
然后是调用这个方法的主函数:
public static void main(String[] args)throws Exception {
//TODO Auto-generated method stub
//调用存取100,000%A 0px; -webkit-text-stroke-width: 0px"> //把url读进内存,并存进队列
readTxtFile(filePath);
for(int i=0;i<20;i++){
for(int j=0;j<30;j++){
Thread t = new Mythread();
t.start();
}
}
class Mythread extends Thread{
public void run(){
DownLoading2.download();
}
}
我是想在那个循环里就全部下载下来,但是最后只爬到200多个,线程就全部没有反应了...
这是怎么回事......求大神指教可以的话顺便帮我修改下...
下载方法的主代码:
package crawler;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
public class DownLoading2 {
/**
* @param args
try {
//建立PDF下载的目的文件夹
// String dir = "d:/pdf/";
String dir = "d:/pdf/";
File file = new File(dir);
if (!file.exists()) {
file.mkdirs();
if(LinkQueue.unVisitedUrlsEmpty() || LinkQueue.getVisitedUrlNum() > 10200){
System.exit(0);
}
//未访问url出队列,入已访问url队列,在done.txt文件中写出,在输出面板中打印
//此处需互斥量
String pdf = LinkQueue.unVisitedUrlDeQueue().toString();
//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
FileWriter writer = new FileWriter( dir + "done.txt", true);
writer.write(pdf + "\n");
}
System.out.println(pdf);
//下载pdf文件,文件名以url中的最后一个名字命名
URL u = new URL(pdf);
try{
InputStream i = u.openStream();
OutputStream bos = new FileOutputStream(new File(dir + fileName));
while ((len = i.read(b)) != -1) {
bos.write(b, 0, len);
i.close();
} catch(UnknownHostException e){
//e.printStackTrace();
System.out.println("UnknownHostException");
}
//判断url访问失败或线程长时间未响应,把url从已访问队列删除,不放回未访问队列
HttpURLConnection urlcon=(HttpURLConnection)u.openConnection();
if(urlcon.getResponseCode()>=400){
System.out.println("服务器响应错误");
System.exit(-1);
}
/*if( ){
&n; WORD-WRAP: break-word; WHITE-SPACE: normal; LETTER-SPACING: normal; FONT-WEIGHT: normal; WORD-SPACING: 0px; -webkit-text-stroke-width: 0px">
}catch (MalformedURLException e) {
//e.printStackTrace();
System.out.println("MalformedURLException");
} catch (IOException e) {
e.printStackTrace();
}
}}
然后是调用这个方法的主函数:
public static void main(String[] args)throws Exception {
//TODO Auto-generated method stub
//调用存取100,000%A 0px; -webkit-text-stroke-width: 0px"> //把url读进内存,并存进队列
readTxtFile(filePath);
for(int i=0;i<20;i++){
for(int j=0;j<30;j++){
Thread t = new Mythread();
t.start();
}
}
class Mythread extends Thread{
public void run(){
DownLoading2.download();
}
}
我是想在那个循环里就全部下载下来,但是最后只爬到200多个,线程就全部没有反应了...
这是怎么回事......求大神指教可以的话顺便帮我修改下...
相关文章推荐
- 多线程爬虫遇到的一些问题
- 求大神指教,ios应用发布到appstore遇到了问题
- 做毕设途中遇到了问题,求大神指教。
- 求助 3ds max模型导入vrp的问题 求大神指教 等 这个问题大家有遇到过吗 应该怎么解决啊
- 在C#中使用SerialPort类实现串口通信 遇到多线程问题
- 遇到多线程问题,关于MyDownload
- 今天遇到多线程,windowsService的问题---学习记录
- 关于android中多线程相关遇到的问题总结
- 多线程程序写日志时遇到加锁的问题
- 遇到问题-UI界面无响应,多线程解决UI界面无响应问题
- windows下的网络爬虫遇到的问题
- 在C#中使用SerialPort类实现串口通信 遇到多线程问题
- 做爬虫时候遇到的中文字符编码问题(Python)
- Servlet参数持久化时可能遇到的多线程问题以及解决之道
- 在C#中使用SerialPort类实现串口通信 遇到多线程问题
- 毕业论文遇到的vtk多线程的问题
- JAVA中的多线程问题(高级面试中经常遇到)
- 2011-09-07 java多线程临界资源同步和调度问题,遇到困难加锁和解锁问题
- 多线程遇到的小问题
- debug和release编译结果在多线程的遇到的一个问题