webmagic学习之路-3:采集安居客经纪人详情页
这里希望安居客的同行的轻喷!!单纯的做测试,玩玩。
就这么糟践你们的服务器了!!!sorry!
这次学会了webmagic 设置处理的访问HTML返回代码,因为之前一直404的页面process根本都不会进来,纳闷很久,也百度了半天。
看源码看了好半天,才知道原来有这个方法设置进process的状态码,让我看源码的决心来源于 我用logger 打印的内容告诉我,webmagic已经获取了404,只是没处理而已。
也同时学会了 scheduler
package com.action; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern; import javax.management.JMException;
import javax.swing.plaf.synth.SynthSpinnerUI; import org.apache.commons.collections.bag.SynchronizedSortedBag;
import org.apache.log4j.Logger;
import org.bson.Document; import com.model.AgentListByNumModel;
import com.model.AgentListModel;
import com.model.Model_AnjukeList;
import com.mongodb.BasicDBObject;
import com.util.Constants;
import com.util.GetDate;
import com.util.MysqlUtils;
import com.util.MD5With32;
import com.util.MongoDBUtil; import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Request;
import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.downloader.AbstractDownloader;
import us.codecraft.webmagic.downloader.Downloader;
import us.codecraft.webmagic.monitor.SpiderMonitor;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.scheduler.PriorityScheduler;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable; public class GetAnjukeAgentByNum implements PageProcessor { static Logger logger = Logger.getLogger(GetAnjukeAgentByNum.class);
static AgentListByNumModel anjukeList;
static List<String> list = new ArrayList<String>();
static List<AgentListByNumModel> list_insert = new ArrayList<AgentListByNumModel>();
static BasicDBObject doc = null;
static int num = 0;
private Site site = Site.me().setSleepTime(1000).setRetryTimes(3).setCharset("UTF-8").setUserAgent(
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36");
@Override
public Site getSite() {
// TODO Auto-generated method stub
Set<Integer> acceptStatCode = new HashSet<Integer>();
acceptStatCode.add(200);
acceptStatCode.add(404);
site = site.setAcceptStatCode(acceptStatCode);
return this.site;
}
@Override
public void process(Page page) {
if(page.getStatusCode()==404
||page.getHtml().xpath("//div[@class='p_1180 p_crumbs']/a[2]/text()").get().replace("经纪人", "").equals("")
||(page.getHtml()+"").contains("经纪人店铺暂时关闭")){
String spider_urls = page.getUrl() +"";
anjukeList = new AgentListByNumModel("", "", "", "", "anjuke", GetDate.getDay0(),
spider_urls, "", spider_urls, "", "", "", "", "", "");
list_insert.add(anjukeList);
MysqlUtils.InsertAnjukeAgentByNum(list_insert);
list_insert.clear();
}else{
if((page.getHtml()+"").contains("访问验证-安居客")){
num = num+1;
System.out.println("被封次数 : "+num);
}
String zone = "";
String street = "";
String contact = "";
String city = page.getHtml().xpath("//div[@class='p_1180 p_crumbs']/a[2]/text()").get().replace("经纪人", "");
String name = page.getHtml().xpath("//div[@class='p_1180 p_crumbs']/a[4]/text()").get().replace("的店铺", "");
String staffNo = page.getUrl() + "";
String company = page.getHtml().xpath("//div[@class='section service']/dl/dd/p[1]/a/text()").get();
String company_url = page.getHtml().xpath("//div[@class='section service']/dl/dd/p[1]/a/@href").get();
String store = page.getHtml().xpath("//div[@class='section service']/dl/dd/p[2]/a/text()").get();
String store_url = page.getHtml().xpath("//div[@class='section service']/dl/dd/p[2]/a/@href").get();
String comms = page.getHtml().xpath("//dl[@class='item last']/dd/a/text()").all() + "";
comms = comms.replace("[", "").replace("]", "");
String contacts = page.getHtml().xpath("//head/meta[3]/@content").get();
Pattern p = Pattern.compile(Constants.reg_phone);
Matcher m = p.matcher(contacts);
if (m.find()) {
contact = m.group(0);
}
Object[] zs = page.getHtml().xpath("//div[@class='section service']/dl[3]/dd/a/text()").all().toArray();
if (zs == null || zs.length == 0) {
String zss = page.getHtml().xpath("//div[@class='details-item']/span[@class='comm-address']/@title").get();
if (zss!=null&&(zss.contains("[") && zss.contains(" "))) {
zss = zss.substring(zss.indexOf("["), zss.indexOf("]"));
zss = zss.substring(1, zss.indexOf(" "));
if (zss.contains("-")) {
zone = zss.split("-")[0];
street = zss.split("-")[1];
}
}
anjukeList = new AgentListByNumModel("", city, zone, street, "anjuke", GetDate.getDay0(),
page.getUrl() + "", name, staffNo, company, company_url, store, store_url, contact, comms);
list_insert.add(anjukeList);
} else {
for (int i = 0; i < zs.length; i++) {
if ((zs[i] + "").contains("-")) {
String[] zss = zs[i].toString().split("-");
zone = zss[0];
street = zss[1];
}
anjukeList = new AgentListByNumModel("", city, zone, street, "anjuke", GetDate.getDay0(),
page.getUrl() + "", name, staffNo, company, company_url, store, store_url, contact, comms);
list_insert.add(anjukeList);
}
}
if(list_insert.size()>0){
MysqlUtils.InsertAnjukeAgentByNum(list_insert);
list_insert.clear();
}
} } public static void main(String[] args) {
MysqlUtils.SelectSpiderID();
PriorityScheduler scheduler = new PriorityScheduler();
Spider spider = Spider.create(new GetAnjukeAgentByNum()).setScheduler(scheduler).addPipeline(new ConsolePipeline());
for (int n = 0; n < 100000; n++) {
if(Constants.map_id.containsKey(n+"")){
System.out.println("contain : " +n);
continue;
}
String url = "https://junranfangchan.anjuke.com/gongsi-jjr-" + n + "/";
scheduler.push(new Request(url), spider);
}
System.out.println("total task num :" +scheduler.getTotalRequestsCount(spider));
spider.thread(25).run();
// Spider.create(new GetAnjukeAgentByNum()).addUrl("https://junranfangchan.anjuke.com/gongsi-jjr-99988/")
// .addPipeline(new ConsolePipeline()).thread(1).run();
//
}
}
webmagic学习之路-3:采集安居客经纪人详情页的更多相关文章
- webmagic学习之路-2:采集安居客经纪人列表
相比较 1 稍微成熟了一点,会用的东西多了. 正则用的不好,很多东西不会,大神轻喷! package com.action; import java.util.ArrayList; import ja ...
- HelloDjango 第 08 篇:开发博客文章详情页
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按 ...
- webmagic学习之路-1:采集安居客列表页测试
---恢复内容开始--- package com.action; import java.util.ArrayList; import java.util.List; import java.util ...
- Python爬虫实战(3):安居客房产经纪人信息采集
1, 引言 Python开源网络爬虫项目启动之初,我们就把网络爬虫分成两类:即时爬虫和收割式网络爬虫.为了使用各种应用场景,该项目的整个网络爬虫产品线包含了四类产品,如下图所示: 本实战是上图中的“独 ...
- python爬虫爬取安居客并进行简单数据分析
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 爬取过程一.指定爬取数据二.设置请求头防止反爬三.分析页面并且与网页源码进行比对四.分析页面整理数据 ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文
一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...
- java爬虫系列第四讲-采集"极客时间"专栏文章、视频专辑
1.概述 极客时间(https://time.geekbang.org/),想必大家都知道的,上面有很多值得大家学习的课程,如下图: 本文主要内容 使用webmagic采集极客时间中某个专栏课程生成h ...
- RPC远程过程调用学习之路(一):用最原始代码还原PRC框架
RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
随机推荐
- 【软件工程】Beta冲刺(1/5)
链接部分 队名:女生都队 组长博客: 博客链接 作业博客:博客链接 小组内容 恩泽(组长) 过去两天完成了哪些任务 描述 tomcat的学习与实现 服务器后端部署,API接口的beta版实现 后端代码 ...
- python 文件压缩及解压
文件压缩 import os import zipfile def zip_dir(dirname,zipfilename): """ | ##@函数目的: 压缩指定目录 ...
- ubuntu 14.04 升级到18.04
http://www.360doc.com/content/18/0929/09/35082563_790606785.shtml
- CPU排行-台式
此文已经于2017年11月1日更新!来源于极速空间 实际对比: intel i3-7100(双核四线程) CPU性能远超过 AMD X4 860K(四核四线程) intel i5-7500(四核四线程 ...
- FullSync不支持中文文件名
FullSync,能实现多种方式.协议的目录同步软件,但不支持中文文件名.
- java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】
转: java.lang.reflect.Method.getAnnotation()方法示例 java.lang.reflect.Method.getAnnotation(Class <T&g ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-2.微服务下登录检验解决方案 JWT讲解
笔记 2.微服务下登录检验解决方案 JWT讲解 简介:微服务下登录检验解决方案 JWT讲解 json wen token 1.JWT 是一个开放标准,它定义了一种用于简洁,自包含的用于通信双方 ...
- 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-1.单机和分布式应用的登录检验讲解
笔记 第四章 开发在线教育视频站点核心业务之JWT微服务下的用户登录权限校验 1.单机和分布式应用的登录检验讲解 简介:讲解单机和分布式应用下登录校验,session共享,分布式缓存使用 1. ...
- vue组件命名和传值 and 父子组件传值
https://www.cnblogs.com/lianxisheng/p/10907350.html
- 这些喜闻乐见的Java面试知识点,你都掌握了吗?
最近分享了一些有关学习方法和经验的文章,得到了很多读者的反馈,恰巧大家在昨天推文中的投票里一直选择了"Java基础的复习方法"这一项,那么今天我们就谈谈这方面的内容吧. 其实对于J ...