webmagic简单爬取51job信息
我是看的这位作者
当时发现怎么都抓取不了,差点崩溃了。还好看到了这位作者,知道了重点原因。
代码地址
具体的也就是获取解析的界面信息浏览器中的信息不一样,获取的信息存在script中,所以我们需要获取我们需要的信息。
最后利用ObjectMapper提供的readTree,返回JsonNode对象 最终获取我们需要的信息,具体核心信息如下:
//请求抓取数据
@Component
public class JobProcessor implements PageProcessor {
@Autowired
private JobServiceImp jobServiceImp;
private int count = 1;
private String URL = "https://search.51job.com/list/080200,000000,0000,00,9,99,java,2,1.html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=";
@Override
public void process(Page page) {
//请求抓取数据
//爬取解析的与页面不同,此次爬取得到数据中是以json形式存在script中
String jsonString = page.getHtml().css("script").regex(".*SEARCH_RESULT.*").toString();
//不为空即为招聘页
if (!StringUtils.isEmpty(jsonString)) {
//截取json类型字符串
String substring = jsonString.substring(jsonString.indexOf("{"), jsonString.lastIndexOf("}") + 1);
ObjectMapper objectMapper=new ObjectMapper();
try {
//使用mapper对数据进行解析
JsonNode jsonNode = objectMapper.readTree(substring);
JsonNode array = jsonNode.get("engine_search_result");
if (array.isArray()) {
for (JsonNode node : array) {
//获取详情链接
String detailUrl = node.get("job_href").asText();
page.addTargetRequest(detailUrl);
}
// 获取下一页的url
String bkUrl = "https://search.51job.com/list/080200,000000,0000,00,9,99,java,2,"+(++count)+".html?lang=c&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&ord_field=0&dibiaoid=0&line=&welfare=";
// // 把url放到任务队列中
page.addTargetRequest(bkUrl);
} else {
count = 0;
return;
}
} catch (JsonProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} else {
//进入详情页,保存数据到实体类,再通过page.putfiled(即resultItems)给Pipeline传入数据库savePage(page);
savePage(page);
}
}