`

基于机器学习(machine learning)的SEO实战日记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_urlvarchar(1000)网站在百度的映射url
original_urlvarchar(1000)网站真实的url
web_htmlMEDIUMTEXT网站内容


对应于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();
    }
}


未完待续……
0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics