该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

package com.wjd.baidukey.crawler; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.URLEncoder; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.TimeZone; import org.apache.poi.poifs.filesystem.DirectoryEntry; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import cn.edu.hfut.dmic.contentextractor.ContentExtractor; import cn.edu.hfut.dmic.webcollector.model.CrawlDatum; import cn.edu.hfut.dmic.webcollector.model.CrawlDatums; import cn.edu.hfut.dmic.webcollector.model.Page; import cn.edu.hfut.dmic.webcollector.plugin.ram.RamCrawler; public class BdiduKeywordCrawler extends RamCrawler{ private Connection connection; private PreparedStatement pstatement; // 连接MySql数据库,用户名root,密码mahao String url = "jdbc:mysql://localhost:3306/wjd"; String username = "root"; String password = "mahao"; //保存抽取到的数据 StringBuilder result = new StringBuilder(); public BdiduKeywordCrawler(String keyword, int maxPageNum) throws Exception { for (int pageNum = 1; pageNum <= maxPageNum; pageNum++) { String url = createUrl(keyword, pageNum); CrawlDatum datum = new CrawlDatum(url) .putMetaData("keyword", keyword) .putMetaData("pageNum", pageNum + "") .putMetaData("pageType", "searchEngine") .putMetaData("depth", "1"); addSeed(datum); } } @Override public void visit(Page page, CrawlDatums next) { String keyword = page.getMetaData("keyword"); String pageType = page.getMetaData("pageType"); int depth = Integer.valueOf(page.getMetaData("depth")); if (pageType.equals("searchEngine")) { int pageNum = Integer.valueOf(page.getMetaData("pageNum")); System.out.println("成功抓取关键词" + keyword + "的第" + pageNum + "页搜索结果"); // || div[class=result-op c-container xpath-log ]>h3>a Elements results = page.select("div[class=result c-container ]>h3>a"); // Elements results1 = page.select("div[class=result-op c-container xpath-log]>h3>a");//,div[id=result-op c-container xpath-log]>h3>a //System.out.println(results1.get(0)); //results.add(results1.get(0)); for (int rank = 0; rank < results.size(); rank++) { Element result = results.get(rank); /* * 我们希望继续爬取每条搜索结果指向的网页,这里统称为外链。 * 我们希望在访问外链时仍然能够知道外链处于搜索引擎的第几页、第几条, * 所以将页号和排序信息放入后续的CrawlDatum中,为了能够区分外链和 * 搜索引擎结果页面,我们将其pageType设置为outlink,这里的值完全由 用户定义,可以设置一个任意的值 * 在经典爬虫中,每个网页都有一个refer信息,表示当前网页的链接来源。 * 例如我们首先访问新浪首页,然后从新浪首页中解析出了新的新闻链接, * 则这些网页的refer值都是新浪首页。WebCollector不直接保存refer值, * 但我们可以通过下面的方式,将refer信息保存在metaData中,达到同样的效果。 * 经典爬虫中锚文本的存储也可以通过下面方式实现。 * 在一些需求中,希望得到当前页面在遍历树中的深度,利用metaData很容易实现 * 这个功能,在将CrawlDatum添加到next中时,将其depth设置为当前访问页面 的depth+1即可。 */ CrawlDatum datum = new CrawlDatum(result.attr("abs:href")) .putMetaData("keyword", keyword) .putMetaData("pageNum", pageNum + "") .putMetaData("rank", rank + "") .putMetaData("pageType", "outlink") .putMetaData("depth", (depth + 1) + "") .putMetaData("refer", page.getUrl()); next.add(datum); } } else if (pageType.equals("outlink")) { /*int pageNum = Integer.valueOf(page.getMetaData("pageNum")); int rank = Integer.valueOf(page.getMetaData("rank")); String refer = page.getMetaData("refer");*/ try { String content = ContentExtractor.getContentByUrl(page.getUrl()); /*String line = String.format( "第%s页第%s个结果:标题:%s(%s字节)\tdepth=%s\trefer=%s", pageNum, rank + 1, page.getDoc().title(), content, depth, refer);*/ String line = String.format("标题:%s\n来源:%s\n正文:%s", page.getDoc().title(),page.getUrl(),content); HashMap data = new HashMap(); Date currentDate = new java.util.Date(); SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); TimeZone timeZoneChina = TimeZone.getTimeZone("Asia/Shanghai");// 获取中国的时区 myFmt.setTimeZone(timeZoneChina);// 设置系统时区 String grabTime = myFmt.format(currentDate);// new Date()为获取当前系统时间 data.put("title", page.getDoc().title()); data.put("from", page.getUrl()); data.put("content", content); data.put("grabTime", grabTime); //String line = String.format("标题:%s\n", page.getDoc().title()); //持久化到word文档中 //是否为线程安全??? //synchronized(this) { String destFile = "D:\\"+"Result"+keyword+".doc"; result.append(line); //将result写到doc文件中 write2File(destFile,result.toString()); //添加到数据库中 addResultData(data); //} System.out.println(line); } catch (Exception e) { //e.printStackTrace(); System.out.println("链接"+page.getUrl()+"失效"); } } } //将数据保存到mysql数据库中 private void addResultData(HashMap data) { String title = data.get("title"); String source_url = data.get("from"); String content = data.get("content").replaceAll("\\?{2,}", "");//去掉字符串中出现的多个连续问号。 //抓取时间 String grabTime = data.get("grabTime"); /*SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); Date date = null; try { date = format.parse(grabTime); } catch (Exception e) { e.printStackTrace(); }*/ //System.out.println("抓取时间"+grabTime); try { connection = DriverManager.getConnection(url, username, password); String sql = "INSERT INTO wjd_keyword_search_table(TITLE,GRAP_TIME,CONTENT,SOURCE_URL) VALUES(?,?,?,?)"; String checkSql = "select 1 from wjd_keyword_search_table where TITLE='" + title + "'"; Statement statement = connection.prepareStatement(checkSql); ResultSet result = statement.executeQuery(checkSql); if (!result.next()) { // 如果数据库中不存在该记录,则添加到数据库中 pstatement = connection.prepareStatement(sql); pstatement.setString(1, title); //pstatement.setString(2, date); pstatement.setString(2,grabTime); pstatement.setString(3, content); pstatement.setString(4, source_url); pstatement.executeUpdate(); } } catch (SQLException e) { e.printStackTrace(); } } /** * 将数据持久化到本地doc文件中 * @param destFile * @param line */ private void write2File(String destFile, String line) { try { //doc content ByteArrayInputStream bais = new ByteArrayInputStream(line.getBytes()); POIFSFileSystem fs = new POIFSFileSystem(); DirectoryEntry directory = fs.getRoot(); directory.createDocument("WordDocument", bais); FileOutputStream ostream = new FileOutputStream(destFile); fs.writeFilesystem(ostream); bais.close(); ostream.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { String[] keywordsList = {"网络爬虫","搜索引擎"}; int pageToal =5; for (String keyword : keywordsList) { BdiduKeywordCrawler crawler = new BdiduKeywordCrawler(keyword, pageToal); crawler.start(); } } /** * 根据关键词和页号拼接百度搜索对应的URL */ public static String createUrl(String keyword, int pageNum) throws Exception { int first = (pageNum-1) * 10; keyword = URLEncoder.encode(keyword, "utf-8"); return String.format("https://www.baidu.com/s?wd=%s&pn=%s", keyword, first); } }

java 网络百度搜索_Java爬虫怎么调用百度搜索引擎,对关键字的网页爬取?相关推荐

  1. java调用百度搜索_Java爬虫怎么调用百度搜索引擎,对关键字的网页爬取?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 package com.wjd.baidukey.crawler; import java.io.ByteArrayInputStream; import ...

  2. java spring+mybatis整合实现爬虫之《今日头条》搞笑动态图片爬取

    java spring+mybatis整合实现爬虫之<今日头条>搞笑动态图片爬取(详细) 原文地址原博客地址 先上效果图 抓取的动态图: 数据库: 一.此爬虫介绍 今日头条本身就是做爬虫的 ...

  3. 初探Scrapy爬虫框架之百度网页爬取

    初探Scrapy爬虫框架之百度网页爬取 scrapy框架及百度网页爬取与保存 一.scrapy框架简介 二.自己初使用的心得体会 1.爬虫之前明确目标 2.scrapy框架的简单使用流程 3.scra ...

  4. Python网络爬虫数据采集实战(八):Scrapy框架爬取QQ音乐存入MongoDB

    通过前七章的学习,相信大家对整个爬虫有了一个比较全貌的了解 ,其中分别涉及四个案例:静态网页爬取.动态Ajax网页爬取.Selenium浏览器模拟爬取和Fillder今日头条app爬取,基本涵盖了爬虫 ...

  5. 网络爬虫(动态网页爬取关于混合动力汽车的论文数据)

    一.实验目的 (1) 熟悉网页浏览器开发工具的使用: (2) 掌握动态网页加载过程: (3) 掌握 post 请求参数设置: (4) 掌握基本的反反爬技术: (5) 能够根据问题需求,指定网络爬虫方案 ...

  6. Python网络爬虫数据采集实战:同花顺动态网页爬取

    前文的爬虫都建立在静态网页基础之上,首先通过请求网站url获取到网页源代码.之后对源代码进行信息提取进而存储即可,本文则针对动态网页进行数据采集,首先介绍Ajax相关理论,之后实战爬取同花顺动态网页, ...

  7. 「Python爬虫系列讲解」十二、基于图片爬取的 Selenium 爬虫

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  8. Python爬虫新手入门教学(十八):爬取yy全站小视频

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  9. requests 获取div_爬虫系列第五篇 使用requests与BeautifulSoup爬取豆瓣图书Top250

    上一篇我们学习了BeautifulSoup的基本用法,本节我们使用它来爬取豆瓣图书Top250. 一.网页分析 我们爬取的网页的url是https://book.douban.com/top250?i ...

  10. 爬虫实战(二)—利用requests、selenium爬取王者官网、王者营地APP数据及pymongo详解

    概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider ,包括了项目的所有代码. 本文 ...

最新文章

  1. Arrays.asList详解
  2. 实验一 linux命令使用,实验一XXXXX常用linux命令的使用(一)
  3. CentOS7 redis-3.2.8 从单机到主从再到集群配置
  4. 报错笔记:cannot convert parameter 1 from 'char [1024]' to 'unsigned char *'
  5. P1422 小玉家的电费--2022.03.15
  6. wamp+多版本mysql_WampServer下安装多个版本的PHP、mysql、apache图文教程,_PHP教程
  7. 32 - II. 从上到下打印二叉树 II
  8. 实验5-9 使用函数输出水仙花数 (20 分)
  9. 最长公共子串_两个字符串的最长公共子串(后缀自动机)
  10. hdu 3506 Monkey Party 区间dp + 四边形不等式优化
  11. python 抓取微博评论破亿_利用python实现爬取微博评论的方法
  12. 精述wifi、zigbee在链路层的安全原理:CCM模式
  13. SNIFFER问题集锦
  14. 无法调用request.getContext()解决方法
  15. css 比较好看的字体
  16. LTE学习笔记--PHY--TM模式
  17. 图卷积神经网络GCN中的关键公式推导---干货
  18. Spring 框架更新了一条可能造成 RCE(远程命令执行漏洞)
  19. 200115(最小生成树的Kruskal算法(贪心))
  20. VMware之SNAT与DNAT

热门文章

  1. PDO和MySQLi , MySQL区别与选择?
  2. [Giveaway] 来自AnyBizSoft、4Media、EASEUS的限时免费软件
  3. MASM32编程将TimeStamp/UTC转换为具体日期时间的几个有用函数代码
  4. Windows2008之文件服务器资源管理器
  5. 前端框架Bootstrap
  6. node socketlog
  7. Oracle官网登录下载资源账号密码共享
  8. 编程题目:PAT 1006. 换个格式输出整数 (15)
  9. perl DBI高级编程
  10. C++重载箭头操作符的理解--c++primer这里有错误