这里希望安居客的同行的轻喷!!单纯的做测试,玩玩。

就这么糟践你们的服务器了!!!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:采集安居客经纪人详情页的更多相关文章

  1. webmagic学习之路-2:采集安居客经纪人列表

    相比较 1 稍微成熟了一点,会用的东西多了. 正则用的不好,很多东西不会,大神轻喷! package com.action; import java.util.ArrayList; import ja ...

  2. HelloDjango 第 08 篇:开发博客文章详情页

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按 ...

  3. webmagic学习之路-1:采集安居客列表页测试

    ---恢复内容开始--- package com.action; import java.util.ArrayList; import java.util.List; import java.util ...

  4. Python爬虫实战(3):安居客房产经纪人信息采集

    1, 引言 Python开源网络爬虫项目启动之初,我们就把网络爬虫分成两类:即时爬虫和收割式网络爬虫.为了使用各种应用场景,该项目的整个网络爬虫产品线包含了四类产品,如下图所示: 本实战是上图中的“独 ...

  5. python爬虫爬取安居客并进行简单数据分析

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 爬取过程一.指定爬取数据二.设置请求头防止反爬三.分析页面并且与网页源码进行比对四.分析页面整理数据 ...

  6. 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文

    一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...

  7. java爬虫系列第四讲-采集"极客时间"专栏文章、视频专辑

    1.概述 极客时间(https://time.geekbang.org/),想必大家都知道的,上面有很多值得大家学习的课程,如下图: 本文主要内容 使用webmagic采集极客时间中某个专栏课程生成h ...

  8. RPC远程过程调用学习之路(一):用最原始代码还原PRC框架

    RPC: Remote Procedure Call 远程过程调用,即业务的具体实现不是在自己系统中,需要从其他系统中进行调用实现,所以在系统间进行数据交互时经常使用. rpc的实现方式有很多,可以通 ...

  9. Webwork 学习之路【03】核心类 ServletDispatcher 的初始化

    1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...

随机推荐

  1. legend3---7、videojs的使用配置的启示是什么

    legend3---7.videojs的使用配置的启示是什么 一.总结 一句话总结: 很多东西网上都有现成的,直接拿来用就好,效果是又快又好 1.用auth认证登录的时候报 "validat ...

  2. R语言:怎么进行异常检测

    a <- try(as.Date('2017-02-30'),silent = T) 当silent为F是,错误消息还是会返回 怎么检测a是否出错呢:if('try-error' %in% cl ...

  3. Django中三种方式写form表单

    除了在html中自己手写form表单外,django还可以通过 继承django.forms.Form 或django.forms.ModelForm两个类来自动生成form表单,下面依次利用三种方式 ...

  4. scikit-learn:CountVectorizer提取tf都做了什么

    from: https://blog.csdn.net/mmc2015/article/details/46866537 http://scikit-learn.org/stable/modules/ ...

  5. 怎么彻底关闭卸载删除Cortana小娜进程,最简单

    原文地址:https://jingyan.baidu.com/article/90bc8fc8be67bcf653640cfa.html Win10中的Cortana是微软开发的一款个人AI助理,集聊 ...

  6. js的深拷贝的理解和实现

    一:什么是深拷贝? 举例:a=b,正常情况下当改变a时b也改变,当改变a时b第一层不改变copy就是浅拷贝,当改变a时b底基层都不会改变就是深拷贝 二:实现深拷贝 1.最简单方法就是使用JSON.st ...

  7. handler四元素

    Looper 一个线程可以产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列). 我们知道一个线程是一段可执行的代码,当可执行代码执行完成后,线程生命周期便会终止,线程就 ...

  8. Mybati example generatorConfig.xml 配置详解

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration ...

  9. linux编译gpu_flow

    因为需要做双流,论文里面推荐到这个GPU版本的TVL1算法,于是开始编译. 一.下载源码 git clone https://github.com/feichtenhofer/gpu_flow.git ...

  10. rocketMQ配置事故

    公司的binlog消息通知,基于canal采集然后转发到rocketmq推送给业务进行消费. 基于此机制,为了实现实时计算通用源端处理,订阅了若干rocketmq的topic进行数据的幂等事务性投递到 ...