
根据java网络编程相关的内容,使用jdk提供的相关类可以得到url对应网页的html页面代码。
针对得到的html代码,通过使用正则表达式即可得到我们想要的内容。
比如,我们如果想得到一个网页上所有包括“java”关键字的文本内容,就可以逐行对网页代码进行正则表达式的匹配。最后达到去除html标签和不相关的内容,只得到包括“java”这个关键字的内容的效果。
我主要使用Jsoup解析,获取源码有时候使用Jsoup,比较复杂的时候比如需要换ip,改编码或者模拟登陆的时候使用>
Elements elestb = Jsoupselect("table");
Elelments elestr = elestbget(0)select("tr");
Elements eles= elestrget(1)select("a");
//第一个
String a1 = elestdget(0)text();
//第二个
String a2 = elestdget(1)text();
Elements elestd = elestrget(1)select("td");
//第三个
String td1 = elestdget(2)text();
//第四个
String td2 = elestdget(3)text();
下面是源代码,希望可以帮到你~~
package comlymainprocess;
import javaioBufferedReader;
import javaioInputStreamReader;
import javautilArrayList;
import javautilList;
import orgapache>
//这是一位老师讲课时的爬邮箱代码,你可以参考一下
package cnitcastregextest;
import javaioBufferedReader;
import javaioFileReader;
import javaioIOException;
import javaioInputStreamReader;
import javanetURL;
import javautilArrayList;
import javautilList;
import javautilregexMatcher;
import javautilregexPattern;
/
网页爬虫:其实就一个程序用于在互联网中获取符合指定规则的数据。
爬取邮箱地址。
/
public class RegexTest2 {
/
@param args
@throws IOException
/
public static void main(String[] args) throws IOException {
List<String> list = getMailsByWeb();
for(String mail : list){
Systemoutprintln(mail);
}
}
public static List<String> getMailsByWeb() throws IOException {
//1,读取源文件。
// BufferedReader bufr = new BufferedReader(new FileReader("c:\\mailhtml"));
URL url = new URL(">
一、需求
1定时抓取固定网站新闻标题、内容、发表时间和来源。
2程序需要支持分布式、多线程
二、设计
1网站是固定,但是未来也可能添加新的网站去抓取,每个网站内容节点设计都不一样,这样就需要支持动态可配置来新增网站以方便未来的扩展,这样就需要每次都需要开发介入。
2网站html节点的结构可能发生变化,所以也要支持提取节点可配置。
3怎样支持分布式?暂时最简单的想法就是:多机器部署程序,还有新搞一台或者部署程序其中一台制作一个定时任务,定时开启每台机器应该抓取哪个网站,暂时不能支持同一个网站同时可以支持被多台机器同时抓取,这样会比较麻烦,要用到分布式队列。所以暂时一个网站同时只会被单台机器抓取。
4多线程,怎样多线程?多线程抓取我这边有两个实现:
(1)一个线程抓取一个网站,维护一个自己的url队列做广度抓取,同时抓取多个网站。如图:
(2)多个线程同时抓取不同的网站。如图:
以上两张办法其实各有优点,也给有缺点,看我们怎么取舍了。
方法1:每个线程创建一个自己的队列,图中的queue可以不用concurrentQueue,优点:不涉及到控制并发,每个网站一个线程抓取一个网站,抓取完毕即自动回收销毁线程。控制方便。缺点:线程数不可以扩展,例如当只有3个网站,你最多只能开3个线程来抓取,不能开更多,有一定的局限性。
方法2:N个线程同时抓取N个网站,线程数和网站数目不挂钩,优点:线程数可以调整并且和和抓取网站数量无关。3个网站我们可以开4个5个或者10个这个可以根据您的硬件资源进行调整。缺点:需要控制并发,并且要控制什么时候销毁线程(thread1空闲,并且queue为空不代表任务可以结束,可能thread2结果还没返回),当被抓取的网站响应较慢时,会拖慢整个爬虫进度。
三、实现
抓取方式最终还是选择了方法二,因为线程数可配置!
使用技术:
jfinal用了之后才发现这东西不适合,但是由于项目进度问题,还是使用了。
maven项目管理
jettyserver
mysql
eclipse开发
项目需要重点攻破的难点:
(1)合理的控制N个线程正常的抓取网站,并且当所有线程工作都完成了并且需要抓取的队列为空时,N个线程同时退出销毁。
(2)不同网站设计节点不一样,需要通过配置解决各个网站需要抓取的URL和抓取节点内容在html节点的位置。
(3)个性化内容处理,由于html结构设计问题,北大青鸟认为抓取的内容可能有些多余的html标签,或者多余的内容该怎么处理。
正好最近在学习这方面的内容。
两种思路:
可以将当前爬取的url存在一个list中作登记,在下一次开始爬子链接的时候进行比对,如果已经存在在list中则跳过,如果不存在那么继续爬
可以将所有的url网络先遍历一遍存在list中,然后根据list而不是再次访问子链接url进行爬取,在url存入list的过程中进行查重处理
顺便为了方便控制。建议设置爬取深度,在一定深度内进行爬取。
以上就是关于请大家帮帮忙. 使用java爬虫得到网页以后怎么提取里面自己需要的内容呢如果会代码请您写一下.谢谢您全部的内容,包括:请大家帮帮忙. 使用java爬虫得到网页以后怎么提取里面自己需要的内容呢如果会代码请您写一下.谢谢您、如何用Java写一个爬虫、菜鸟求教 java爬虫 Jsoup 查找元素 求教如何select出来这四个数据,谢谢!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)