web Magic学习第一天

**

web Magic 学习

**

1.HTML零基础教学

HTML5 可以认为是xml的一种具体形式
<XXX> xxx为一个标签的开始
</XXX> xxx为一个标签的结束
元素可以有属性,属性都是以键值对的形式出现

<xxx aaa=" " bbb=" "> </xxx>

所谓的HTML5 的一种具体形式。

<!DOCTYPE html>
<html>
<head>
	<title>我是一个标题</title> 
</head>
<body>
	<h1>我是第一个标题</h1>
	<p>我是第一个段落</p>
	<h2>H<sub>5</sub></h2>
	<a href="www.baidu.com"> 百度一下</a>
	<tr>
		<td>刚开始的HTML的使用table进行排版</td>
	</tr>
</body>
</html>

所有的HTML元素都有一个所谓的盒模型的概念
1.block
2.inline
3.inline-block
元素的盒模型的种类,决定了该元素在页面上的位置和规则
block 类型的元素(在其父类型空间内)要求独立成行,即同一行的元素后不能有其他元素
inline 类型与block相反,可以使元素在同一行中
HTML的一个重要概念,使用“有语言化”元素来替代HTML 4 中有语言化。用strong来代替b
div和span是没有语言化概念,而且其他的元素都是有语义化的
HTML学习

2.Web Magic学习之路

1.新建一个Maven项目
#pom.xml
导入一下现有包,直接改pom.xml配置文件


<dependencies>
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.7.3</version>
        </dependency>
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.7.3</version>
        </dependency>
 </dependencies>


导入过程可能需要很长的时间
2.新建OschinaBlogPageProcesser类
这是一个最简单的例子

public class OschinaBlogPageProcesser implements PageProcessor {

    // 抓取网站的相关配置,包括:编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

    @Override
    public void process(Page page) {
        List<String> links = page.getHtml().links().regex("http://my\\.oschina\\.net/flashsword/blog/\\d+").all();
        page.addTargetRequests(links);
        page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1").toString());
        page.putField("content", page.getHtml().$("div.content").toString());
        page.putField("tags", page.getHtml().xpath("//div[@class='BlogTags']/a/text()").all());
    }

    @Override
    public Site getSite() {
        return site;

    }

    public static void main(String[] args) {
        Spider.create(new OschinaBlogPageProcesser())
              .`addUrl("http://my.oschina.net/flashsword/blog")`
              .addPipeline(new ConsolePipeline())
              .run();
    }
}

以后对爬虫进行改动也是对addURL和Xpath部分进行改动
Xpath详情请见XPath教学

addUrl("http://my.oschina.net/flashsword/blog")
//主要是用设置访问的URL
addPipeline(new ConsolePipeline())
//用来打印一些东西,比如你在Process函数中要读取的一些元素,可以自己设置打印的东西的

对于页面查找元素有两种方式
1.直接在页面上找到相应的元素

 page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1").toString());
 

2.`先通过相应的css,然后进行XPath

//step1:选中符合指定规则的所有元素(可能有很多)
//从页面上找到所有的<li class="f1.line"> 元素
  List<Selectable> list = page.getHtml().css("li.fl.line").nodes();
//step2:每个元素中哪个片段
//查看元素的文本内容 ://xx//xxx/xxx/span/text()
//查看元素的每个值://xx//xxx/xxx/a/@href
for(Selectable i:list){
String M_id = i.xpath("//li/a/@href").toString();
String M_Title = i.xpath("//li/div/p/a/@title").toString();
}
 

例子 获取电影的ID

https://www.1905.com/mdb/film/list/year-2019
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

import java.io.*;
import java.util.List;

public class OschinaBlogPageProcesser implements PageProcessor {

    // 抓取网站的相关配置,包括:编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

    @Override
    public void process(Page page) {
    //从页面上找所有的< li class="f1 line">
        List<Selectable> list = page.getHtml().css("li.fl.line").nodes();
        FileWriter fileWritter = null;
        String fPath = "id.txt";
        for (Selectable i:list
             ) {
            String M_id = i.xpath("//li/a/@href").toString();
            String M_Title = i.xpath("//li/div/p/a/@title").toString();
            System.out.println("id:"+M_id.split("/")[3].toString()+"  "+"title:"+M_Title);
            String id=M_id.split("/")[3].toString();

            try {

                https://www.1905.com/mdb/film/2250632/
                fileWritter = new FileWriter(fPath,true);
                BufferedWriter bufferWritter = new BufferedWriter(fileWritter);
                bufferWritter.write(M_id.split("/")[3].toString()+"\r\n");
                bufferWritter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }



        }
    }

    @Override
    public Site getSite() {
        return site;

    }

    public static void main(String[] args) {
       for(int i=0;i<10;i++){
           Spider.create(new OschinaBlogPageProcesser())
//                .addUrl("http://my.oschina.net/flashsword/blog")
                   .addUrl("https://www.1905.com/mdb/film/list/year-2019/o0d0p"+i+".html")
//                .addPipeline(new ConsolePipeline())
                   .run();
       }
       }

}

例子2 获取每个电影的导演与演员

https://www.1905.com/mdb/film/
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class detail implements PageProcessor {

    // 抓取网站的相关配置,包括:编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);

    @Override
    public void process(Page page) {
        //从页面上找所有的< li class="f1 line">
        List<Selectable> list = page.getHtml().css("a.creator-resume").nodes();
        List<String> author_name=new ArrayList<String>();
        List<String> major=new ArrayList<String>();
        for (Selectable i:list
        ) {
            String author=i.xpath("//a/span/text()").toString();
            if("导演".equals(author)){
                String a=i.xpath("//a/@title").toString();
//                System.out.println(a);
                author_name.add(a);
            }
            else{
                String a=i.xpath("//a/@title").toString();
                major.add(a);
            }
        }
        System.out.println("导演:");
        for(String i:author_name){
            System.out.println(i);
        }
        System.out.println("演员:");
        for(String i:major){
            System.out.println(i);
        }

    }

    @Override
    public Site getSite() {
        return site;

    }
    public static void main(String[] args) {
        int count=0;
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("id.txt")));//构造一个BufferedReader类来读取文件
            String s = null;
            while ((s = br.readLine()) != null) {//使用readLine方法,一次读一行
//                System.out.println(s);
                Spider.create(new detail())
                        .addUrl("https://www.1905.com/mdb/film/"+s)
//                .addPipeline(new ConsolePipeline())
                    .run();
            }
        }catch(FileNotFoundException e)
        {
            System.out.println("can not find it");
            System.exit(1);
        } catch (IOException e) {
            e.printStackTrace();
        }
//        for(int i=0;i<10;i++){
//            Spider.create(new detail())
//                .addUrl("http://my.oschina.net/flashsword/blog")
//                    .addUrl("https://www.1905.com/mdb/film/2250632/")
//                .addPipeline(new ConsolePipeline())
//                    .run();
        }
//    }

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值