JAVA爬取网页内容

之前的文章没有整理好,这边重新标注一下,有需要可以到我的个人博客看完整的三篇文章。

1.初识Jsoup

2.爬取CSDN文章

3.模拟用户表单登录

在此之前,大家先了解一个Jsoup,一个html页面解析的jar包。


如果你上面的Jsoup看完了。

前期准备工作:需要去查看一下要爬的网页的结构,对自己要爬的数据的标签要熟悉。


操作:在页面上按F12查看标签的内容。JAVA爬取网页内容_第1张图片


就是js+css+html标签的构造,我们使用比较多的是a、img这两个标签。第一个是链接,第二个是图片所以图片也是可以爬的~~。里面的内容也都是一个链接地址。

其余的标签就可能是文本数据的内容了。比如说我现在想要爬的就是这个标题中的链接。

JAVA爬取网页内容_第2张图片

和标题的内容。找到这里看到这个标签的href值。

使用Jsoup的方法:Elements elements = doc.getElementsByTag("a");//找到所有a标签

对a标签进行过滤就行了

也可以直接获取class标签下的内容,再在这个class下找到a标签获取a标签的href属性值。

好了就是这么简单。接下来看看代码吧。


import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MySearchTest {
	private static String url = "https://blog.csdn.net";
	private static String blogName = "guoxiaolongonly";

	public static void main(String[] args) {
		getArticleListFromUrl(url+"/" + blogName);
	}

 /**
 * 获取文章列表
 *
 * @param listurl
 */
public static void getArticleListFromUrl(final String listurl) {
    boolean isStop = false;
    Document doc = null;
    try {
        doc = Jsoup.connect(listurl).userAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36").timeout(3000).post();
    } catch (IOException e) {
        e.printStackTrace();
    }
    Elements elements = doc.getElementsByTag("a");//找到所有a标签
    for (Element element : elements) {
        final String relHref = element.attr("href"); // == "/"这个是href的属性值,一般都是链接。这里放的是文章的连接
        //用if语句过滤掉不是文章链接的内容。因为文章的链接有两个,但评论的链接只有一个,反正指向相同的页面就拿评论的链接来用吧
        if (!relHref.startsWith("http://") && relHref.contains("details") && relHref.endsWith("comments")) {
            StringBuffer sb = new StringBuffer();
            sb.append(relHref);
            System.out.println(sb.substring(0, sb.length() - 9));//去掉最后的#comment输出
            getArticleFromUrl(sb.substring(0, sb.length() - 9));//可以通过这个url获取文章了
        }
        if (relHref.equals("https://mp.csdn.net//postlist")) {
            isStop = true;
        }
    }


    if (!isStop) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (!listurl.contains("list")) {
                    getArticleListFromUrl(listurl + "/article/list/1");//获取下一页的列表
                } else {
                    getArticleListFromUrl(listurl.substring(0, listurl.length() - 1) +
                            (Integer.valueOf(listurl.substring(listurl.length() - 1, listurl.length())) + 1));//获取下一页的列表
                }


            }
        }).start();
    }
}
	/**
	 * 获取文章内容
	 * @param detailurl
	 */
	public static void getArticleFromUrl(String detailurl) {
		try {
			Document document = Jsoup.connect(detailurl).userAgent("Mozilla/5.0").timeout(3000).post();
			Element elementTitle = document.getElementsByClass("link_title").first();//标题。 这边根据class的内容来过滤
			System.out.println(elementTitle.text());
			String filename = elementTitle.text().replaceAll("/", "或");
			Element elementContent = document.getElementsByClass("article_content").first();//内容。
			saveArticle(filename , elementContent.text(), blogName);
			// String Content =elementContent.te  xt().replaceAll(" ", "\t");
			// System.out.println(elementContent.text()+"\n");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	/**
	 * 保存文章到本地
	 * @param titile
	 * @param content
	 * @param blogName
	 */
	public static void saveArticle(String titile, String content, String blogName) {
		String lujing = "d:\\MyLoadArticle\\" + blogName + "\\" + titile + ".txt";//保存到本地的路径和文件名
		File file = new File(lujing);
		if (!file.getParentFile().exists()) {
			file.getParentFile().mkdirs();
		}
		try {
			file.createNewFile();
		} catch (IOException e) {
			e.printStackTrace();
		}

		try {
			FileWriter fw = new FileWriter(file, true);
			BufferedWriter bw = new BufferedWriter(fw);
			bw.write(content);
			bw.flush();
			bw.close();
			fw.close();
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}

2018年6月4日 12:04:33 更新

先说一下不能保存的原因,

1.CSDN现在有做CA认证了。

解决方案:所有地址带https

2.原本的下一页属于静态生成的页面现在由js动态加载。

解决方案:

1.用另外一个框架带模拟点击实现

2.找到js代码,加载js来获取跳转内容(没找到js)

3.下下之策,因为文章列表地址为 https://blog.csdn.net/guoxiaolongonly/article/list/pageIndex 我把下一页写成默认跳转,如果当前页不存在文章内容就不在翻页。然后因为测试太多次被CSDN强制登录了。

我封装了获取文章列表、获取文章内容保存文章内容的方法。

大家可以设置blogName去爬你想要的文章了,比如说我:guoxiaolongonly

这边用post模拟浏览器请求。因为直接get,页面无法加载。还有就是使用cookie,模拟用户用户页面访问操作。会的小伙伴们也可以交流一下~~

针对文本文档编码乱码问题。还希望大家自己研究一下。


你可能感兴趣的:(JAVA学习)