JAVA爬取网页内容
2016-05-25 12:55
399 查看
之前的文章没有整理好,这边重新标注一下,有需要可以到我的个人博客看完整的三篇文章。
1.初识Jsoup
2.爬取CSDN文章
3.模拟用户表单登录
在此之前,大家先了解一个Jsoup,一个html页面解析的jar包。
如果你上面的Jsoup看完了。
前期准备工作:需要去查看一下要爬的网页的结构,对自己要爬的数据的标签要熟悉。
操作:在页面上按F12查看标签的内容。
就是js+css+html标签的构造,我们使用比较多的是a、img这两个标签。第一个是链接,第二个是图片所以图片也是可以爬的~~。里面的内容也都是一个链接地址。
其余的标签就可能是文本数据的内容了。比如说我现在想要爬的就是这个标题中的链接。
和标题的内容。找到这里看到这个标签的href值。
使用Jsoup的方法:Elements elements = doc.getElementsByTag("a");//找到所有a标签
对a标签进行过滤就行了
也可以直接获取class标签下的内容,再在这个class下找到a标签获取a标签的href属性值。
好了就是这么简单。接下来看看代码吧。
我封装了获取文章列表、获取文章内容保存文章内容的方法。
大家可以设置blogName去爬你想要的文章了,比如说我:guoxiaolongonly
这边用post模拟浏览器请求。因为直接get,页面无法加载。还有就是使用cookie,模拟用户用户页面访问操作。会的小伙伴们也可以交流一下~~
针对文本文档编码乱码问题。还希望大家自己研究一下。
1.初识Jsoup
2.爬取CSDN文章
3.模拟用户表单登录
在此之前,大家先了解一个Jsoup,一个html页面解析的jar包。
如果你上面的Jsoup看完了。
前期准备工作:需要去查看一下要爬的网页的结构,对自己要爬的数据的标签要熟悉。
操作:在页面上按F12查看标签的内容。
就是js+css+html标签的构造,我们使用比较多的是a、img这两个标签。第一个是链接,第二个是图片所以图片也是可以爬的~~。里面的内容也都是一个链接地址。
其余的标签就可能是文本数据的内容了。比如说我现在想要爬的就是这个标题中的链接。
和标题的内容。找到这里看到这个标签的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 = "http://blog.csdn.net"; private static String blogName = "guoxiaolongonly"; public static void main(String[] args) { getArticleListFromUrl(url+"/" + blogName); } /** * 获取文章列表 * @param listurl */ public static void getArticleListFromUrl(String listurl) { Document doc = null; try { doc = Jsoup.connect(listurl).userAgent("Mozilla/5.0").timeout(3000).post(); } catch (IOException e) { e.printStackTrace(); } // System.out.println(doc); Elements elements = doc.getElementsByTag("a");//找到所有a标签 for (Element element : elements) { String relHref = element.attr("href"); // == "/"这个是href的属性值,一般都是链接。这里放的是文章的连接 String linkHref = element.text(); //用if语句过滤掉不是文章链接的内容。因为文章的链接有两个,但评论的链接只有一个,反正指向相同的页面就拿评论的链接来用吧 if (!relHref.startsWith("http://") && relHref.contains("details") && relHref.endsWith("comments")) { StringBuffer sb = new StringBuffer(); sb.append(url).append(relHref); System.out.println(sb.substring(0, sb.length() - 9));//去掉最后的#comment输出 getArticleFromUrl(sb.substring(0, sb.length() - 9));//可以通过这个url获取文章了 } // System.out.println(linkHref); if(linkHref.equals("下一页"))//如果有下一页 { getArticleListFromUrl(url + relHref);//获取下一页的列表 } } } /** * 获取文章内容 * @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(); } } }
我封装了获取文章列表、获取文章内容保存文章内容的方法。
大家可以设置blogName去爬你想要的文章了,比如说我:guoxiaolongonly
这边用post模拟浏览器请求。因为直接get,页面无法加载。还有就是使用cookie,模拟用户用户页面访问操作。会的小伙伴们也可以交流一下~~
针对文本文档编码乱码问题。还希望大家自己研究一下。
相关文章推荐
- Java-蚂蚁爬杆(面向对象编程思想)
- Java获取文件Content-Type(Mime-Type)
- eclipse build很慢的时候,有可能是js文件编译验证慢的问题
- java.lang.NoSuchFieldError: TRACE
- java1.8函数式接口
- java类型与jdbc类型对应表
- java继承实质、父类引用指向子类对象(多态)、声明时类型、运行时类型
- Spring JDBC
- java设计模式-简单工厂模式
- 制作奥运五环
- spring aop相关概念和xml与注解实现方式
- Spring Security 4.X xml配置重定向
- Spring 依赖注入(DI)的注解
- Java线程终止状态
- Spring事物回滚
- spring-data-jpa中文文档
- Java并发编程:synchronized
- spring mvc 工作流程
- Spring+Mina(六)
- StrutsPrepareAndExecuteFilter中excludedPatterns变量的用法