期望目标

自动采集事业单位招聘信息+自动发布到网站+自动提交网址到百度+自动发外链。

技术框架

前端用layUI,后端用flask,数据库用的elasticsearch,编程语言用Python 3.7,服务器用的Windows 2008 sever 64位,部署站点用的IIS 7.5。

搭建思路

采集信息

相对轻车熟路,主要是确定需要提取哪些字段,比如标题、发布时间、截止日期、正文内容、附件、招聘单位、招聘人数、岗位所在省份、所在城市。

采集最重要的两点,一个是不要重复采集,另一个是尽可能及时采集。

所以我把采集过的页面网址也保存到数据库,每次采集到新网址时,会先在数据库精确搜索,没有结果就采集,并在数据库加入新网址,有结果就跳过。

原先是每天凌晨2点采集目标网站,这样尽可能的不影响目标站点正常访问。后来考虑到seo因素,尽可能缩短两个站点发布间隔,改成每小时访问一次,有新网址再采集。当然,设置time.sleep是必须的。

前端开发

前端页面比较简单,直接使用layUI组件。首页就是搜索框+ajax列表,列表页是搜索框+左侧列表+右侧广告位,内容页有标题、发布时间、结构化数据(招聘单位、招聘人数、所在省份、所在城市、截止日期)、正文、相关推荐、最新推荐。

页面开发虽然繁琐耗时,但比较简单,主要是考虑到内链优化,我给省份字段、城市字段加了超链接。

发布时间字段做了处理,比目标站点提前一天,新生成的发布日期如果是双休日,就再往前推移到星期五。目标站点的发布时间只精确到天,我又随机增加了时分秒。并且上午发布的占40%,下午发布的占60%,不同小时段的作者也不同,以此增加手动发布的真实性。

正文招聘内容只能照抄,没法改写,但可以新增摘要来增加页面原创度。所以我在正文前面加了摘要的字段,用textrank4zh提取摘要,长度3句话。

flask开发

flask主要就是功能实现,没什么特别的。比如模板内判断搜索结果数,如果没有搜索结果,就在<head>内添加一行代码,告诉爬虫不要收录该页面。

<meta name="robots" content="noindex">

比如flask默认无法直接访问文件,但提交站点地图时需要提交sitemap文件,可以添加以下代码。

@app.route('/<path>')
def info(path):
base_dir = os.path.dirname(__file__)
resp = make_response(open(os.path.join(base_dir, path)).read())
resp.headers["Content-type"]="text/plain;charset=UTF-8"
return resp

唯一费时的是分页效果的实现,可能因为我是伪码农吧,好在最后还是实现了。

站点部署

推荐用Linux,但我更熟悉Windows,很多人说的这个坑那个坑,在我这也只是繁琐,不算坑。Linux部署会容易很多,没这么折腾。部署Python站点,用的IIS+wsgi,具体步骤在之前博文写过。

elasticsearch使用

整个技术栈最陌生的就是elasticsearch,严格来说可能不属于数据库,但我认为存储数据的都可以当作数据库使用。创建索引、写入数据,都没啥难度,一方面是python-elasticsearch真的很容易上手,另一方面是完全按照教程按需操作。

难点在于查询,按关键词查询时默认是先中文分词,然后只要每个词搜到资源都会在结果页显示,但这精确度实在太低。后来改为必须所有词都存在,才出现在结果页。

举例来说,搜任意关键词,原先只要带了“招聘”,搜索结果数就是数据库全部数据量。现在是必须其他词也能搜到结果才行,所以很多词的搜索结果都为空了。

seo思路

链接提交

自动推送

百度、360搜索、神马搜索,支持自动推送。从站长平台获取一段JS代码,添加到所有页面,有用户访问时就会加载JS,实现自动提交到搜索引擎。

因为门槛低,注定数据量很大,所以提交后往往很久都没处理。好在百度还有其他提交方式。

主动推送

通过接口提交url,使用Python实现很简单,在页面生成时就自动提交。

sitemap

整理“事业单位招聘”相关长尾词,在elasticsearch搜索,有搜索结果的将搜索结果页网址保存到sitemap。

目前整理了8000多个网址,保存在sitemap.txt,已经提交百度和360搜索,但目前还没有处理。

外链发布

很多网站提供站内搜索,并且结果页源码包含搜索的关键词,如果页面源码包含的搜索词是url,并且搜索结果页被百度收录,那么这就是一条外链,虽然质量不高。

目前的方法是,现在豆瓣、新浪博客,这类可以发外链的地方发文章,再把文章地址拿去刷外链,增加外链页面的收录速度。

搜索结果页并不一定会被爬取,所以每天需要刷两遍以上,目前测试效果很好,即使是小号发帖,一般第二天或者隔天收录。

最简单省事的外链,还是交换高质量首页友链。当然,打铁还需自身硬,后面再考虑。

测试结果

网站在2019年9月底上线,期间有代码改动,甚至采集爬虫因为目标站点临时无法访问,导致爬虫也挂掉了。正好赶上国庆放假,挂掉了好几天才发现。

每天工作日更新,每次更新200多条信息,截止发此文,运行时间不足一个月,收录30条,百度权重1,期待后续。

事业单位招聘网搭建思路和seo方法的更多相关文章

  1. python 爬虫之爬取大街网(思路)

    由于需要,本人需要对大街网招聘信息进行分析,故写了个爬虫进行爬取.这里我将记录一下,本人爬取大街网的思路. 附:爬取得数据仅供自己分析所用,并未用作其它用途. 附:本篇适合有一定 爬虫基础 crawl ...

  2. 如何内网搭建NuGet服务器

    NuGet 是.NET程序员熟知的给.NET项目自动配置安装library的工具,它可以直接安装开源社区中的各个公用组件,可以说是非常方便.不过,有些时候,公司内部的公用的基础类库,各个项目都有引用, ...

  3. Scrapy实现腾讯招聘网信息爬取【Python】

    一.腾讯招聘网 二.代码实现 1.spider爬虫 # -*- coding: utf-8 -*- import scrapy from Tencent.items import TencentIte ...

  4. 利用xpath爬取招聘网的招聘信息

    爬取招聘网的招聘信息: import json import random import time import pymongo import re import pandas as pd impor ...

  5. 【转】如何内网搭建NuGet服务器

    原文:http://www.cnblogs.com/zhangweizhong/p/7755332.html NuGet 是.NET程序员熟知的工具,它可以直接安装开源社区中的各个公用组件,可以说是非 ...

  6. Jobedin外企招聘网:6个要点不能不知道(转载)

    又到一年跳槽季,无数职场人士都在蠢蠢欲动,在工作之余,寻找更好的工作. Jobedin外企招聘网,特别提醒:年末跳槽,一定要在拿到新公司的Offer后,才能向现公司提出辞职.不然新工作没找到,却可能丢 ...

  7. python实现对某招聘网接口测试获取平台信息

    """通过接口测试的技术获取某招聘网平台的资料"""url = "https://www.lagou.com/jobs/posit ...

  8. EOS主网搭建教程--&&--搭建节点--&&--搭建mongodb数据库

    EOS主网搭建教程: 1.git clone https://github.com/EOS-Mainnet/eos.git --recursive 2.cd eos 3.git tag (查看有哪些分 ...

  9. 放弃了程序员互联网高薪,跑去事业单位做IT的尴尬

    “你是程序员对吧?”“是啊,怎么了?”“那你帮我修一下电脑吧.”我原来也是一个重点大学毕业,基本上事业里面搞IT就干这些事情,要是以前,我肯定会想,我是程序员和修电脑有啥关系. 但是自从进了事业单位, ...

随机推荐

  1. java架构之路-(12)JVM垃圾回收算法和垃圾回收器

    接上次JVM虚拟机堆内存模型来继续说,上次我们主要说了什么时候可能把对象直接放在老年代,还有我们的可能性分析,提出GCroot根的概念.这次我们主要来说说垃圾回收所使用的的算法和我们的垃圾回收器,需要 ...

  2. 松软科技课堂:sql函数-AVG

    定义和用法 AVG 函数返回数值列的平均值.NULL 值不包括在计算中. SQL AVG() 语法 SELECT AVG(column_name) FROM table_name SQL AVG() ...

  3. JavaScript之数学对象Math

    Javascript 中Math和其他对象不同,它具有数学常数和函数的属性和方法.因为它的属性是数学常数,所以不能被改变(可以进行赋值操作,但最后值不变). Math的方法就是普通函数,调用他们直接用 ...

  4. [python]泡菜存储(pickle)

    对于保存文本,如果要保存的数据像列表,字典甚至是类的实例时,普通的文件操作就会很复杂,如果把这些转化为字符串写入到文本文件中保存,把这个过程反过来读取的话就会异常麻烦,因此python提供了一个标准模 ...

  5. 从零开始入门 K8s | 应用配置管理

    一.需求来源 背景问题 首先一起来看一下需求来源.大家应该都有过这样的经验,就是用一个容器镜像来启动一个 container.要启动这个容器,其实有很多需要配套的问题待解决: 第一,比如说一些可变的配 ...

  6. Spring 梳理-@Controller

    @Controller是一个构造性注解(stereotype),它基于@Component 在自动扫描中,组件扫描器会自动将@Controller申明的类注册为Spring应用上下文的一个bean 可 ...

  7. 百度富文本编辑器ueditor添加到pom

    <!-- 百度富文本编辑start --> <dependency> <groupId>com.baidu</groupId> <artifact ...

  8. 对vue nextTick深入理解-vue性能优化、DOM更新时机、事件循环机制

    一.定义[nextTick.事件循环] nextTick的由来: 由于VUE的数据驱动视图更新,是异步的,即修改数据的当下,视图不会立刻更新,而是等同一事件循环中的所有数据变化完成之后,再统一进行视图 ...

  9. 夯实Java基础系列15:Java注解简介和最佳实践

    Java注解简介 注解如同标签 Java 注解概述 什么是注解? 注解的用处 注解的原理 元注解 JDK里的注解 注解处理器实战 不同类型的注解 类注解 方法注解 参数注解 变量注解 Java注解相关 ...

  10. 微服务架构-利用Redis特性进行业务解耦

    背景:     接着上篇文章来,上篇文章讲的是如何利用ApplicationContext的事件机制来达到业务解耦,而且这只能作用在单体应用中.在当下这么盛行的微服务架构中,想要再利用此方案做业务解耦 ...