上前个星期花了一天的时间看了webmagic,学着写了一个简单的爬虫。在此分享给需要学习的人。
先放上完整的源码,在放上爬取得内容。
过程不想写了,此文留作我参考使用。
先到webmagic官网下载相应的jar包。我这里也提供分享。
(一)
package sing.test;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.JsonFilePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
public class SinaBlogProcessor implements PageProcessor {
	public static final String URL_LIST = "http://localhost:8080/cloudrecomm/course/job/\\w+";
	public static final String URL_POST = "http://localhost:8080/cloudrecomm/51job/\\w+\\.html";
	
	public static final String URL_LIST2 = "http://localhost:8080/cloudrecomm/course/job/";
	private static int count = 0;
	//抓取网站的相关配置,包括编码、抓取间隔、重试次数等
	private Site site = Site
			.me()
			.setDomain("web")
			.setSleepTime(3000)
			.setUserAgent(
					"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.65 Safari/537.31");
	// process是定制爬虫逻辑的核心接口,在这里编写抽取逻辑
	@Override
    public void process(Page page) {
    	Domian domian = new Domian();
       
    	//列表页
        if (page.getUrl().regex(URL_LIST).match()){
        	//找出每页的规律,然后把每页存入待爬取
        	for(int i=2 ;i<=10 ;i++){
        		page.addTargetRequest(URL_LIST2 + i);
        	}
        	//获取列表的div下的所有链接。利用xpath过滤,links获取链接,regex符合的正则表达。
            page.addTargetRequests(page.getHtml().xpath("//div[@class=\"main-right\"]").links().regex(URL_POST).all());
            page.addTargetRequests(page.getHtml().links().regex(URL_LIST).all());
            //文章页
        } else {
        	//内容页的内容,也是直接利用xpath获取html下内容
        	domian.setTitle(page.getHtml().xpath("/html/body/div[2]/div[2]/div[2]/div/div[1]/h1/text()").get());
        	domian.setPice(page.getHtml().xpath("/html/body/div[2]/div[2]/div[2]/div/div[1]/strong/text()").get());
        	//我自己定的爬取次数。想看到能爬取多少次。
        	count++;
        	//调用jdbc方法,存入数据库。
        	new SqlUitl().insert(domian);
        }
        
        
    }
	@Override
	public Site getSite() {
		return site;
	}
/**
 * .addUrl:要开始爬取得网页
 * 
 */
	public static void main(String[] args) {
		Spider.create(new SinaBlogProcessor())
				.addUrl("http://localhost:8080/cloudrecomm/course/job/1")
				.thread(100).run();
		System.out.println("得到" + count + "条记录");
	}
}
(二)
package sing.test;
public class Domian {
	private String title;
	private String pice;
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getPice() {
		return pice;
	}
	public void setPice(String pice) {
		this.pice = pice;
	}
}
(三)
package sing.test;
import java.sql.*;
public class SqlUitl {
	private static Connection getConn() {
	    String driver = "com.mysql.jdbc.Driver";
	    String url = "jdbc:mysql://localhost:3306/crawler";
	    String username = "root";
	    String password = "123456";
	    Connection conn = null;
	    try {
	        Class.forName(driver); //classLoader,加载对应驱动
	        conn = (Connection) DriverManager.getConnection(url, username, password);
	    } catch (ClassNotFoundException e) {
	        e.printStackTrace();
	    } catch (SQLException e) {
	        e.printStackTrace();
	    }
	    return conn;
	}
	
	public int insert(Domian domian) {
	    Connection conn = getConn();
	    int i = 0;
	    String sql = "insert into sing (title,pice) values(?,?)";
	    PreparedStatement pstmt;
	    try {
	        pstmt = (PreparedStatement) conn.prepareStatement(sql);
	        pstmt.setString(1, domian.getTitle());
	        pstmt.setString(2, domian.getPice());
	        i = pstmt.executeUpdate();
	        pstmt.close();
	        conn.close();
	    } catch (SQLException e) {
	        e.printStackTrace();
	    }
	    return i;
	}
}
爬取得第一页
我获取列表的div下的所有内容

获得相应的xpath

观察列表,发现规律
 
找个要爬取得内容,依旧用xpath获得。

最后在数据查看爬取得数据

历史上的今天:
- 2024: 再次改天龙八部游戏的想法(2)
 - 2023: 【天龙百问】天龙八部单机免虚拟机是什么意思?(0)
 
本文章百度已收录,若发现本站有任何侵犯您利益的内容,请及时邮件或留言联系,我会第一时间删除所有相关内容。


				
2019年4月16日 10:44 沙发
请问 怎么用webmaigc 写一个自动切换代理的downloader
2019年4月16日 21:11 1层
@can 无能为力,这我也帮不到你,我自己也很菜。
2017年11月11日 15:00 板凳
JAVA大佬
2017年11月11日 23:10 1层
@姜辰 彼此彼此