请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

网络爬虫-案例实现

[复制链接]
查看: 77|回复: 0

3万

主题

3万

帖子

9万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
91650
发表于 2020-2-15 03:26 | 显示全部楼层 |阅读模式
营业分析

    获得 www.51.job.com 上的招聘信息。只爬取“盘算机软件”和“互联网电子商务”两个行业的信息。
    1. 查询页面,获得查询到列表的中的url
   
我的关键词 收集爬虫-案例实现  热门消息 1581339299134084563


    2. 跳转到响应页面,获得需要的数据
        
我的关键词 收集爬虫-案例实现  热门消息 1581339961251073984

存储数据

建立数据库,建立存储对应数据的表
        
我的关键词 收集爬虫-案例实现  热门消息 1581342545205017509

实现流程

    起头 —— > 列表页面 —— > 获得url —— > url加入使命 —— > 竣事
   
Scheduler 组件

    在分解页面时,很大要会分解出类似url地点,假如不举行处置惩罚,一样的url分解处置惩罚屡次,浪费资本。需要一个url去重功用。
    Scheduler 是 WebMagic 及第行URL治理的组件。包含两个功用:
        1. 对抓取的URL页面行列举行治理;
        2. 对已抓取的URL举行去重
   
    - WebMagic 内置来几个常用的Scheduler,再当地实行范围比力小的爬虫,那末底子无需定制Scheduler:



    • DuplicateRemoveScheduler:笼统基类,供给一些模板方式;
    • QueueScheduler:利用内存行列保存待抓取的URL。(内存空间小,易形成内存溢出)
    • FileCacheQueueScheduler:利用文件保存抓取URL,可以在封闭步伐并下次启动时,从之前抓取到的URL继续抓取(需指定途径,会建立 .urls.txt 和 .cusor.txt两个文件)
    • PriorityScheduler:利用带有优先级的内存行列保存待抓取的URL
    • RedisScheduler:利用 Redis 保存抓取行列,可以举行多台呆板同时合作抓取(需要安装并启动 Redis)


    - 去重部分被零丁笼统成了一个接口:DuplicateRemove。从而可以为同一个 Scheduler 挑选差此外去重方式,以顺应差此外需求。目条件供了两种去重方式:


    • HashSetDuplicateRemove(默许):利用 HashSet 来举行去重,占用内存比力大
    • BloomFilterDuplicateRemove:利用 BloomFilter 来举行去重,占用内存比力小,但大要漏抓页面

      • 假如利用 BloomFilter ,必须加入依靠:
        1.     com.google.guava
        2.     guava
        3.     18.0
        复制代码


代码实现        

    1. 导入相关依靠包
  1.     4.0.0            org.springframework.boot        spring-boot-starter-parent        2.0.2.RELEASE        com.xiaojian    crawler-jobinfo    1.0-SNAPSHOT                                org.springframework.boot            spring-boot-starter-web                                    org.springframework.boot            spring-boot-starter-data-jpa                                    mysql            mysql-connector-java            8.0.17                                    us.codecraft            webmagic-core            0.7.3                                                org.slf4j                    slf4j-log4j12                                                                us.codecraft            webmagic-extension            0.7.3                                    com.google.guava            guava            18.0                                    org.apache.commons            commons-lang3            
复制代码
  2. application.properties 设备文件
  1. #DB Configuration:spring.datasource.driverClassName=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/db_crawler?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNullspring.datasource.username=rootspring.datasource.password=243600#JPA Configuration:spring.jpa.database=mysqlspring.jpa.show-sql=true
复制代码

    3. 钞缮相关类:pojo、dao、service、指导类

pojo类
  1. @Entity@Table(name = "t_jobinfo")public class JobInfo {    // 主键    @Id    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    // 公司称号    private String companyName;    ...    set,get.toString.....
复制代码

dao
  1. public interface JobInfoDao extends JpaRepository {}
复制代码

service
  1. public interface JobInfoService {    /**     * 保存招聘信息     * @param jobInfo     */    void save(JobInfo jobInfo);    /**     * 按照条件查询招聘信息     * @param jobInfo     */    List findJobInfo(JobInfo jobInfo);}
复制代码

serviceImpl
  1. @Servicepublic class JobInfoServiceImpl implements JobInfoService {    @Resource    private JobInfoDao jobInfoDao;    @Override    @Transactional    public void save(JobInfo jobInfo) {        // 按照招聘url和公布时候查询数据        JobInfo param = new JobInfo();        param.setUrl(jobInfo.getUrl());        param.setTime(jobInfo.getTime());        // 查询        List list = this.findJobInfo(param);        // 判定数据能否已存在        if(list.size() == 0){            // 假如数据库为空,表现招聘信息数据不存在,大要已经更新了,需要新增或更新数据            this.jobInfoDao.saveAndFlush(jobInfo);        }        jobInfoDao.save(jobInfo);    }    @Override    public List findJobInfo(JobInfo jobInfo) {        // 设备查询条件        Example example = Example.of(jobInfo);        return jobInfoDao.findAll(example);    }}
复制代码

指导类
  1. @SpringBootApplication// 利用按时使命,需要开启按时使命,需要加注解@EnableSchedulingpublic class Application {    public static void main(String[] args) {        SpringApplication.run(Application.class,args);    }}
复制代码

JobProcessor.java
  1. @Componentpublic class JobProcessor implements PageProcessor {    private String url = "https://search.51job.com/list/030200%252C110200,000000,0000,01%252C32,9,99,java,2,1.html" +            "?lang=c&stype=&postchannel=0000&workyear=99&cotype=99&degreefrom=99&jobterm=99&companysize=99&providesalary" +            "=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=";    @Override    public void process(Page page) {        // 分解页面,获得招聘信息详情的url地点     List list = page.getHtml().css("div#resultList div.el").nodes();     // 判定list聚集能否为空     if(list.size() == 0){            // 为空: 表现详情页     // 保存招聘详情信息     this.saveJobInfo(page);     } else{            // 不为空: 表现招聘列表页     // 分解出详情页url,放到使命行列中     for(Selectable s : list){                // 获得url地点     String link = s.links().toString();     // 把获得到的ulr地点放到使命行列中     page.addTargetRequest(link);     }            // 获得下一页url地点     String nextUrl = page.getHtml().css("div.p_in li.bk").nodes().get(1).links().toString();     // 把下一页url放到使命行列中     page.addTargetRequest(nextUrl);     }            String html = page.getHtml().toString();    }    private Site site = Site.me()        .setTimeOut(10 * 1000) // 设备超不时候        .setCharset("gbk")    // 编码        .setRetryTimes(3)    // 重试次数        .setRetrySleepTime(3000)    // 重试间隔时候        ;    @Override    public Site getSite() {        return site;    }     /**     * 保存招聘详情信息     * @param page     */    private void saveJobInfo(Page page) {        Html html = page.getHtml();            JobInfo jobInfo = new JobInfo();        // 将信息封装到工具中        // 公司称号        jobInfo.setCompanyName(html.css("div.cn p.cname a","text").toString());        ... 按照需求,抓取对应的数据            // 把结果保存起来        page.putField("jobInfo",jobInfo);    }        // initialDelay,使命开启后,等多久实行方式    // fixedDelay,每隔多久实行一次    @Scheduled(initialDelay = 1000,fixedDelay = 600 * 1000)    public void processor(){        Spider.create(new JobProcessor())                .addUrl(url)                .setScheduler(new QueueScheduler().setDuplicateRemover(new BloomFilterDuplicateRemover(10000)))                .addPipeline(springDataPipeline)    // 数据要保存到数据库中                .thread(10)                .run()        ;    }}
复制代码

SpringDataPipeline.java
  1. @Componentpublic class SpringDataPipeline implements Pipeline {    @Resource    private JobInfoService jobInfoService;    @Override    public void process(ResultItems resultItems, Task task) {        // 获得封装好的JobInfo工具        JobInfo jobInfo = resultItems.get("jobInfo");        // 判定数据不为空        if(jobInfo != null){            this.jobInfoService.save(jobInfo);        }    }}
复制代码

4. 启动 Application.java
   
我的关键词 收集爬虫-案例实现  热门消息 1581402500326033176


完成 !

免责声明:假如加害了您的权益,请联系站长,我们会实时删除侵权内容,感谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 WAYSFOCUS 影像 你 我 他,中国商业影视一站式解决平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表