上前个星期花了一天的时间看了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获得。
最后在数据查看爬取得数据
历史上的今天:
欢迎来到菜鸟头头的个人博客本文章百度已收录,若发现本站有任何侵犯您利益的内容,请及时邮件或留言联系,我会第一时间删除所有相关内容。
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层
@姜辰 彼此彼此