文档章节

java+jsoup实现简单网络爬虫

爬爬皮皮
 爬爬皮皮
发布于 2017/07/12 14:10
字数 377
阅读 82
收藏 1

package body;

 

import java.io.IOException;

import java.util.HashMap;

import java.util.List;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

import javax.xml.ws.http.HTTPException;

 

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.nodes.Node;

import org.jsoup.select.Elements;

 

public class MyMain {

    static HashMap<String, Boolean> sendGet(HashMap<String, Boolean> oldHash) {

        HashMap<String, Boolean> newHash = new HashMap<String, Boolean>();

        String oldLine = "";

        try {

            for (java.util.Map.Entry<String, Boolean> mapping : oldHash.entrySet()) {

                if (!mapping.getValue()) {

                    oldLine = mapping.getKey();

                    Document doc = Jsoup.connect(oldLine).get();

                    // TODO 页面信息查找

                    Element info;

                    if ((info = doc.getElementById("info")) != null) {

                        String title = doc.title();

                        System.out.println("httpUrl ----" + oldLine);

                        System.out.println("title ----" +title);

                        findMovieInfo(info);

                    } else {

                        Elements elements = doc.select("[href]");

                        for (Element element : elements) {

                            String newUrl = element.attr("href");

                            if (!oldHash.containsKey(newUrl) && !newHash.containsKey(newUrl))

                                if (newUrl.startsWith("http")) {

//                                    System.out.println(newUrl);

                                    newHash.put(newUrl, false);

                                }

                        }

                    }

                }

                oldHash.replace(oldLine, false, true);

            }

        } catch (IOException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        } catch (HTTPException eh) {

            eh.printStackTrace();

        }

        if (!newHash.isEmpty()) {

            oldHash.putAll(newHash);

            oldHash.putAll(sendGet(oldHash));

        }

        return oldHash;

    }

    static void myRequest(String httpUrl) {

        HashMap<String, Boolean> oldHash = new HashMap<>();

        oldHash.put(httpUrl, false);

        oldHash = sendGet(oldHash);

    }

    public static void findMovieInfo(Element element) {

        Elements elements = element.children();

        for (Element info : elements) {

            if (info.childNodeSize() > 0) {

                String key = info.getElementsByAttributeValue("class", "pl").text();

                if (!key.isEmpty()) {

                    if ("导演".equals(key) || "编剧".equals(key) || "主演".equals(key)) {

                        String value = info.getElementsByAttributeValue("class", "attrs").text();

                        System.out.println(key + "----" + value);

                    } else if ("类型:".equals(key)) {

                        String value = element.getElementsByAttributeValue("property", "v:genre").text();

                        System.out.println(key + "----" + value);

                    } else if ("制片国家/地区:".equals(key)) {

                        Pattern patternCountry = Pattern.compile(".制片国家/地区:</span>.+\n<br>");

                        Matcher matcherCountry = patternCountry.matcher(element.html());

                        if (matcherCountry.find()) {

                            String value = matcherCountry.group().split("</span>")[1].split("<br>")[0].trim();

                            System.out.println(key + "----" + value);

                        }

                    } else if ("语言:".equals(key)) {

                        Pattern patternCountry = Pattern.compile(".语言:</span>.+\n<br>");

                        Matcher matcherCountry = patternCountry.matcher(element.html());

                        if (matcherCountry.find()) {

                            String value = matcherCountry.group().split("</span>")[1].split("<br>")[0].trim();

                            System.out.println(key + "----" + value);

                        }

                    } else if ("上映日期:".equals(key)) {

                        String value = element.getElementsByAttributeValue("property", "v:initialReleaseDate").text();

                        System.out.println(key + "----" + value);

                    } else if ("片长:".equals(key)) {

                        String value = element.getElementsByAttributeValue("property", "v:runtime").text();

                        System.out.println(key + "----" + value);

                    } else if ("又名:".equals(key)) {

                        Pattern patternCountry = Pattern.compile(".又名:</span>.+\n<br>");

                        Matcher matcherCountry = patternCountry.matcher(element.html());

                        if (matcherCountry.find()) {

                            String value = matcherCountry.group().split("</span>")[1].split("<br>")[0].trim();

                            System.out.println(key + "----" + value);

                        }

                    }

                }

            }

        }

    }

    public static void main(String[] args) {

        myRequest("https://movie.douban.com");

    }

}

© 著作权归作者所有

爬爬皮皮
粉丝 0
博文 1
码字总数 377
作品 0
长沙
私信 提问
用 Java+JSOUP解析网页

【业务需求】 按照附件java工程demo类组织形式要求完成十个左右网页企业界面内容采集,并按照标准要求入库即可,详细需求说明文档竞标后提供。 【人员要求】 1、有java语言采集网页解析方面开...

javadeveloper
2016/06/02
18
4
用 Java+JSOUP解析网页

【业务需求】 程序入口提供任意一组参数发起采集,参数示例: entId:20e38b8b3b96d8e5013bb249f29b2b47 credit_ticket:2FF17C2A25C417887C6FB569B76D8ED9 entNo:110115015475448 timeStamp:......

javadeveloper
2016/04/07
28
3
用 Java+JSOUP 解析网页

概述 根据开源工具JSOUP,为facebook/youtube/twitter三个网站中的6种页面编写解析工具,其他结构的页面不予考虑,输出为JSON,具体输出内容请看末尾说明。 这6种页面可分为所谓的列表页和帖...

天台道人
2016/01/17
17
2
python3简单爬虫实现代码

分享一个python实现的网络爬虫代码。转自:http://www.cnblogs.com/yes123/p/3761388.html 写了个python3的。代码非常简单就不解释了,直接贴代码。 #test rdp import urllib.request import...

mysoftsky
2014/05/30
344
0
5个python爬虫教材,让小白也有爬虫可写,含视频教程!

认识爬虫   网络爬虫,如果互联网是一张蜘蛛网,网络爬虫既是一个在此网上爬行的蜘蛛,爬了多少路程即获取到多少数据。 python写爬虫的优势   其实以上功能很多语言和工具都能做,但是用...

柯西带你学编程
2018/06/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Phpstorm2018 永久激活

1、安装phpstorm,安装包请自行官网下载 http://www.jetbrains.com/phpstorm/download/ 2、下载JetbrainsCrack.jar文件,存放至你的phpstorm执行文件同级目录下 下载JetbrainsCrack.jar 提取...

happyfish319
26分钟前
6
0
谈一谈Android进程间通信的几种方式

###来看一下Android中除了AIDL还有哪些进程间通信的方式: 1、Bundle Bundle实现了Parcelable,所以在Android中我们可以通过Intent在不同进程间传递Bundle数据。 但是在Intent 传输数据的过程...

二营长的意大利炮手
27分钟前
7
0
互联网薪资“高开低走”,你的能力是否真的可以匹配高薪?

对于国内外主流互联网大厂,技术出身似乎已经成为各大掌门人的必备标签。谷歌 CEO 桑达尔·皮查伊、马克·扎克伯格、李彦宏、马化腾、雷军等等皆为技术人出身,都曾参与了公司内部重要产品的...

Java技术剑
29分钟前
9
0
java 多线程

线程声明周期 线程的五个状态:新建,就绪,运行,阻塞,死亡。 其中就绪和运行两个状态客户互相转换,但运行到阻塞,阻塞到就绪,只能单向转换。 刚new出的线程就是【新建】状态,调用start...

雷开你的门
30分钟前
11
0
构造器Constructor是否可被overrid

构造器不能被重写,不能用static修饰构造器,只能用public private protected这三个权限修饰符,且不能有返回语句。

无名氏的程序员
34分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部