有个任务。需要做一个类似网页采集的东西。我在网上找了点资料。(类似于火车头的东西)
现在能做的是:可以把给定的一个静态网页中的源代码给抓取下来。
(刚上手,别嫌弃做得丑啊)
但是对于想抓取的东西不能进行提取。求大神们给个思路。
比如:我想在新浪新闻网页中,把所有的新闻标题给抓取下来。
还有对于新闻标题所对应的的链接。这个新闻的正文网页中的内容也抓取出来。
也就是这个节点下的所有网页全都能抓取下来。最好别弄些太高级的东西。还是新手阶段。
现在能做的是:可以把给定的一个静态网页中的源代码给抓取下来。
(刚上手,别嫌弃做得丑啊)
但是对于想抓取的东西不能进行提取。求大神们给个思路。
比如:我想在新浪新闻网页中,把所有的新闻标题给抓取下来。
还有对于新闻标题所对应的的链接。这个新闻的正文网页中的内容也抓取出来。
也就是这个节点下的所有网页全都能抓取下来。最好别弄些太高级的东西。还是新手阶段。
解决方案 »
- 关于匿名内部类的一个疑惑!感觉很有用的提问!
- 怎样获取键盘输入的数据!!!急用
- java 将数据转换json格式
- 如何使用数组实现阿拉伯数字转换成大写中文,比如1340转换成 壹仟叁佰肆拾 ,希望有高手帮忙解决下,急!!!
- 谁有《Tomcat权威指南中文版》啊
- Java Ftp的问题
- 往Access中插入新数据时的主键问题
- 如何将一串字符写入文件中 (100分)
- 谁有Borland Appserver 4.5的注册码,急用???
- ★★所有分赠送大虾,谁能告诉我抓取ip包的基本原理吗?用java怎么实现?急!!!
- 关于java中继承和接口的问题
- jocky代码加密遇见的问题,希望有高手指点,谢谢
1,使用httpclient连接网页,包括登录获得session。
2,获取要抓取页面的页面源码。
3,从页面源码中获取需要的信息。这个可以自己手动写个方法,比如需要的xxxx 在一堆html标记中,反过来根据这些标记定位说要的内容。
实例原来写过类似的程序,不过很久以前的手上也没实例,建议去百度上搜索httpclient吧,我当时也是刚开始学java的时候,用这个工具包前面几步都很简单,关键是后面的如何提取自己要的数据。页面节点下的所有文件,那么这个页面应该有个列表什么的,在源码中是有体现的,举个例子,很多列表或者文章上都有“下一页”,要获取下一页的信息,只要定位到这个地方,截取下一页的地址,然后重复上面的工作就行了。怎么定位,楼上说了,用正则去找。正则没你想的那么难,去网上搜一下,有个叫 正则表达式30分钟教程的文本教程,半个小时就能学会。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.regex.*;
import java.io.*;
import java.net.URL;
import java.sql.*;
class GroupMethod{
public String regularGroup(String pattern,String matcher){
Pattern p=Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
Matcher m=p.matcher(matcher);
if(m.find()){
return m.group(1);
}
else{
return "";
}
}
}public class TestCatchWeb extends JFrame{
JButton
b1=new JButton("确定"),
b2=new JButton("导入到数据库"),
b3=new JButton("查看数据库");
JTextField
t1=new JTextField(30);
TextArea
t2=new TextArea(20,80);
JLabel
l1=new JLabel("您所查找的网页信息"),
l2=new JLabel("输入您要查找的网页");
String strUrl="http://news.sina.com.cn";
String title;
String urls;
int number;
TestCatchWeb(){
setTitle("网页抓取");
JPanel p=new JPanel();
t1.setText(strUrl);
b1.addActionListener(new B1());
t2.setEditable(false);
//t2.setLineWrap(true);
p.setLayout(new FlowLayout());
p.add(t2);p.add(l1);
p.add(t1);p.add(l2);
p.add(b1);
p.add(b2);
p.add(b3);
add(p);
}
static class WL extends WindowAdapter{
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
class B1 implements ActionListener{
public void actionPerformed(ActionEvent e){
catches();
t2.append("标题是:"+title+"\n");
t2.append("url地址是:"+urls+"\n");
t2.append("共收集到"+number+"条信息");
}
}
public void catches(){
strUrl=t1.getText();
BufferedReader br;
try{
URL url=new URL(strUrl);
InputStreamReader isr=new InputStreamReader(url.openStream());
br=new BufferedReader(isr);
String strRead="";
String regularTitle="target=._blank.>([\u4E00-\u9FA5].+)</a>";
String regularUrl="<a href=.(\\w.+). target=._blank.>";
GroupMethod gMethod=new GroupMethod();
int i=0;
while((strRead=br.readLine())!=null){
String strGet=gMethod.regularGroup(regularTitle,strRead);
if(!strGet.equals("")){
title+=strGet+"\n";
}
strGet=gMethod.regularGroup(regularUrl, strRead);
if(!strGet.equals("")){
urls+=strGet+"\n";
i++;
}
}
br.close();
number=i;
}
catch(IOException e){
e.printStackTrace();
}
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestCatchWeb news=new TestCatchWeb();
news.addWindowListener(new WL());
news.setSize(300,200);
news.setVisible(true);
}}
简单得用正则写了个代码。但是由于不同标题的格式不一样,所以不能完美提取。还有一些是源代码。大神们指导下。
实例原来写过类似的程序,不过很久以前的手上也没实例,建议去百度上搜索httpclient吧,我当时也是刚开始学java的时候,用这个工具包前面几步都很简单,关键是后面的如何提取自己要的数据。页面节点下的所有文件,那么这个页面应该有个列表什么的,在源码中是有体现的,举个例子,很多列表或者文章上都有“下一页”,要获取下一页的信息,只要定位到这个地方,截取下一页的地址,然后重复上面的工作就行了。怎么定位,楼上说了,用正则去找。正则没你想的那么难,去网上搜一下,有个叫 正则表达式30分钟教程的文本教程,半个小时就能学会。大神,我是这样打算的,先将这个网页的所有链接保存到一个数组,然后通过数组的读取,再重复一遍网页抓取的过程,这样合适么。
这一句用我的正则String regularTitle="target=._blank.>([\u4E00-\u9FA5].+?)</a>"。会将 <a href="http://news.sina.com.cn/c/2013-08-23/085028026971.shtml" target="_blank">多名网民散布洪灾谣言被拘</a>]</p>后面的也读进来。如果吧正则改成String regularTitle="target=._blank.>([\u4E00-\u9FA5].+?)</a>";这样则会把后面的遗漏。因为这是在同一行的。有没有什么好的解决方案
jsoup比httpclient操作要简单的多,只要懂点jquery,很快就上手了。
这一句用我的正则String regularTitle="target=._blank.>([\u4E00-\u9FA5].+?)</a>"。会将 <a href="http://news.sina.com.cn/c/2013-08-23/085028026971.shtml" target="_blank">多名网民散布洪灾谣言被拘</a>]</p>后面的也读进来。如果吧正则改成String regularTitle="target=._blank.>([\u4E00-\u9FA5].+?)</a>";这样则会把后面的遗漏。因为这是在同一行的。有没有什么好的解决方案
http://blog.csdn.net/jadyer/article/category/1157727
请问你去查看jsoup了吗? 他完全不需要你写正则进行匹配获取a标签文字和href链接.
里面有提供方法.并且也能找到指定的div块内的内容.你所要做的就是分析你要爬取网页源代码的相同和不同点.
中文api地址
请问你去查看jsoup了吗? 他完全不需要你写正则进行匹配获取a标签文字和href链接.
里面有提供方法.并且也能找到指定的div块内的内容.你所要做的就是分析你要爬取网页源代码的相同和不同点.大师,还没去看呢。现在正则用了一半了,想先用正则把整个的做出来,然后再用您说的jsoup做个改良版的。