基于机器学习(machine learning)的SEO实战日记4--数据抓取
程序员文章站
2022-04-06 22:18:17
...
一、创建数据表
对应于mysql的建表语句:
对应于mysql的建表语句:
二、编写抓取函数
说明:本战记的编程语言为java,所有代码都是java,由于数据库在云服务器中,以及一些数据抓取需要登录,所以给出的代码将屏蔽这部分参数;另外还会用到一些工具类(代码全贴出来有点多),所以这里给出的是核心代码,而不是全部代码,读者无法直接运行博客中的代码,但是可以通过博客中的代码了解整个项目的过程和思路,如需完整代码,可以发邮件联系。
1、 引入jsoup的maven依赖包
2、 抓取百度搜索数据
3、 数据去重
4、 抓取网站内容数据
未完待续……
表名:relative_web | ||
表中文名:网站信息表 | ||
字段名称 | 字段类型 | 字段解释 |
keywords | varchar(100) | 关键词 |
source_domain | varchar(200) | 网站域名 |
rw_title | varchar(1000) | 搜索引擎给出的网站标题 |
rw_url | varchar(1000) | 搜索引擎给出的网站url |
rw_description | varchar(5000) | 搜索引擎给出的网站标题 |
rw_position | int | 搜索引擎中的排名 |
对应于mysql的建表语句:
Create table relative_web(keywords varchar(100),source_domain varchar(200),rw_title varchar(1000), rw_url varchar(1000),rw_description varchar(5000), rw_position int) character set utf8mb4 collate utf8mb4_bin;
表名:web_detail | ||
表中文名:网站详情表 | ||
字段名称 | 字段类型 | 字段解释 |
baidu_url | varchar(1000) | 网站在百度的映射url |
original_url | varchar(1000) | 网站真实的url |
web_html | MEDIUMTEXT | 网站内容 |
对应于mysql的建表语句:
Create table web_detail( baidu_url varchar(1000),original_url varchar(1000), web_html MEDIUMTEXT) character set utf8mb4 collate utf8mb4_bin;
二、编写抓取函数
说明:本战记的编程语言为java,所有代码都是java,由于数据库在云服务器中,以及一些数据抓取需要登录,所以给出的代码将屏蔽这部分参数;另外还会用到一些工具类(代码全贴出来有点多),所以这里给出的是核心代码,而不是全部代码,读者无法直接运行博客中的代码,但是可以通过博客中的代码了解整个项目的过程和思路,如需完整代码,可以发邮件联系。
1、 引入jsoup的maven依赖包
<dependency> <!-- jsoup HTML parser library @ http://jsoup.org/ --> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.9.1</version> </dependency>
2、 抓取百度搜索数据
/** * 抓取51msg.net相关的网站信息,并保存到数据库 */ public void crawl51msgRelative() { BaiduSearch bs = new BaiduSearch(); String[] keywords = {"搜索导航","搜索大全","搜索引擎大全","国外搜索引擎","网页搜索","谷歌搜索","谷歌镜像","综合搜索"};//"搜索","搜索引擎" Sort sort = new Sort(); Sqlca sqlca = null; try { sqlca = sort.getSqlca(); for (String keyworod : keywords) { int pos = 0; for (int i = 0; i < 60; i++) { String ss = bs.searchRealTime(keyworod, i, "Baidu"); System.out.println(i); JSONObject jsonObject=null; try { jsonObject = JSONObject.parseObject(ss); }catch (Exception e){ e.printStackTrace(); break; } String tt = jsonObject.getJSONObject("hits").getString("total"); if (Integer.parseInt(tt) < 1) System.out.println("无数据"); //插入数据库 JSONArray ja = jsonObject.getJSONObject("hits").getJSONArray("hits"); for (Object obj : ja) { pos++; JSONObject jos = (JSONObject) obj; JSONObject jo = jos.getJSONObject("_source"); String title = ""; if (jo.containsKey("Title")) title = jo.getString("Title"); title=title.replace("'","‘"); String Domain = ""; if (jo.containsKey("Domain")) Domain = jo.getString("Domain"); Domain=Domain.replace("'","‘"); String Description = ""; if (jo.containsKey("Description")) Description = jo.getString("Description"); Description=Description.replace("'","‘"); sqlca.execute("insert into relative_web(keywords ,source_domain ,rw_title,rw_url ,rw_description , rw_position) values('" + keyworod + "','51msg.net','" + title + "','" + Domain + "','" + Description + "'," + pos + ")"); } Thread.sleep(6000); } } } catch (Exception e) { e.printStackTrace(); } finally { if (sqlca != null) sqlca.closeAll(); } }
3、 数据去重
/** * 关联网站去重 */ public void removeRepeat(){ Sort sort = new Sort(); Sqlca sqlca = null; try { sqlca = sort.getSqlca(); sqlca.execute("create table temp008 as \n" + "select min(keywords ) keywords,source_domain ,rw_title,min(rw_url ) rw_url , rw_description, min(rw_position) rw_position from relative_web group by source_domain ,rw_title, rw_description limit 10\n "); sqlca.execute("delete from relative_web"); sqlca.execute("insert into relative_web(keywords,source_domain ,rw_title, rw_url , rw_description, rw_position) select keywords,source_domain ,rw_title, rw_url , rw_description, rw_position from temp008 "); sqlca.execute("drop table temp008"); }catch (Exception e){ e.printStackTrace(); } finally { if (sqlca != null) sqlca.closeAll(); } }
4、 抓取网站内容数据
/** * 通过百度url,抓取网站的内容数据 */ public void getWebContentByBaiduUrl( ){ Sort sort = new Sort(); Sqlca sqlca = null; try { sqlca = sort.getSqlca(); sqlca.execute("select rw_url from relative_web a where not exists(select 1 from web_detail b where a.rw_url=b.baidu_url)"); List<String> list_url=new ArrayList<>(); while (sqlca.next()){ list_url.add(sqlca.getString("rw_url")); } for(String baiduUrl:list_url) { try { Document doc = Jsoup.connect(baiduUrl).timeout(150000).get(); System.out.println(doc.baseUri()); sqlca.execute("insert into web_detail(\n" + " baidu_url ,original_url , web_html )" + "values('" + baiduUrl + "','" + doc.baseUri() + "','" + doc.html().replace("'", "’") + "')"); Thread.sleep(1000); }catch (Exception e){ e.printStackTrace(); } } }catch (Exception e){ e.printStackTrace(); } finally { if (sqlca != null) sqlca.closeAll(); } }
未完待续……
上一篇: 电商前端交易型系统设计原则
下一篇: 详解Nginx如何配置继承模型
推荐阅读
-
基于机器学习(machine learning)的SEO实战日记2--寻找切入点
-
基于机器学习(machine learning)的SEO实战日记4--数据抓取
-
基于机器学习(machine learning)的SEO实战日记1--序言
-
基于机器学习(machine learning)的SEO实战日记6--训练集准备
-
基于机器学习(machine learning)的SEO实战日记3--构思
-
基于机器学习(machine learning)的SEO实战日记5--分词与词频计算
-
基于机器学习(machine learning)的SEO实战日记2--寻找切入点
-
基于机器学习(machine learning)的SEO实战日记6--训练集准备
-
基于机器学习(machine learning)的SEO实战日记4--数据抓取
-
基于机器学习(machine learning)的SEO实战日记3--构思