**
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();
}
// }
}