[python爬虫] 招聘信息定时系统 (一).BeautifulSoup爬取信息并存储MySQL

2023-11-03

        这系列文章主要讲述,如何通过Python爬取招聘信息,且爬取的日期为当前天的,同时将爬取的内容保存到数据库中,然后制作定时系统每天执行爬取,最后是Python调用相关库发送短信到手机。
        最近研究了数据库的定时计划备份,联系爬虫简单做了这个实验,虽然方法是基于单机,比较落后,但可行,创新也比较好。整个系列主要分为五部分,共五篇文章:
        1.Python爬取招聘信息,并且存储到MySQL数据库中;
        2.调用pyinstaller包将py文件打包成exe可执行文件;
        3.设置Windows系统的计划,制作定时任务,每天早上定时执行exe爬虫;
        4.结合PHP(因毕业设计指导学生的是PHP系统)简单实现前端招聘信息界面;
        5.补充知识:Python调用短信猫发送招聘短信到客户手机,研究ing。
         文章比较基础好玩,希望对您有所帮助,如果文章中存在错误或不足之处。


一. 运行结果

        爬取地址为智联招聘网站:http://sou.zhaopin.com/


        爬取结果存储至MySQL数据库如下图所示,注意只有4月22日的信息。


        运行结果及保存TXT文件如下所示:




二. BeautifulSoup爬虫详解

        完整代码如下所示:

# -*- coding: utf-8 -*-
"""
Created on 2017-04-22 15:10

@author: Easstmount
"""

import urllib2 
import re 
from bs4 import BeautifulSoup
import codecs
import MySQLdb
import os


#存储数据库
#参数:职位名称 公司名称 职位月薪 工作地点 发布时间 职位链接
def DatabaseInfo(zwmc, gsmc, zwyx, gzdd, gxsj, zwlj):  
    try:  
        conn = MySQLdb.connect(host='localhost',user='root',
                             passwd='123456',port=3306, db='eastmount')  
        cur=conn.cursor() #数据库游标  
  
        #报错:UnicodeEncodeError: 'latin-1' codec can't encode character  
        conn.set_character_set('utf8')  
        cur.execute('SET NAMES utf8;')  
        cur.execute('SET CHARACTER SET utf8;')  
        cur.execute('SET character_set_connection=utf8;')

        #SQL语句 智联招聘(zlzp)
        sql = '''insert into eastmount_zlzp 
                    (zwmc,gsmc,zwyx,gzdd,gxsj,zwlj) 
                values(%s, %s, %s, %s, %s, %s)'''

        cur.execute(sql, (zwmc, gsmc, zwyx, gzdd, gxsj, zwlj))
        print '数据库插入成功'            
        
    #异常处理  
    except MySQLdb.Error,e:  
        print "Mysql Error %d: %s" % (e.args[0], e.args[1])  
    finally:  
        cur.close()    
        conn.commit()    
        conn.close()  
    

#爬虫函数
def crawl(url):
    page = urllib2.urlopen(url) 
    contents = page.read() 
    soup = BeautifulSoup(contents, "html.parser") 
    print u'贵阳JAVA招聘信息: 职位名称 \t 公司名称 \t 职位月薪 \t 工作地点 \t 发布日期 \n'
    infofile.write(u"贵阳JAVA招聘信息: 职位名称 \t 公司名称 \t 职位月薪 \t 工作地点 \t 发布日期  \r\n")
    print u'爬取信息如下:\n'

    i = 0
    for tag in soup.find_all(attrs={"class":"newlist"}):
        #print tag.get_text()
        i = i + 1
        
        #职位名称
        zwmc = tag.find(attrs={"class":"zwmc"}).get_text()
        zwmc = zwmc.replace('\n','')
        print zwmc
        #职位链接
        url_info = tag.find(attrs={"class":"zwmc"}).find_all("a")
        #print url_info
        #url_info.get(href) AttributeError: 'ResultSet' object has no attribute 'get' 
        for u in url_info:
            zwlj = u.get('href')
            print zwlj
        #公司名称
        gsmc = tag.find(attrs={"class":"gsmc"}).get_text()
        gsmc = gsmc.replace('\n','')
        print gsmc
        #find另一种定位方法 <td class="zwyx">8000-16000</td>
        zz = tag.find_all('td', {"class":"zwyx"})
        print zz
        #职位月薪
        zwyx = tag.find(attrs={"class":"zwyx"}).get_text()
        zwyx = zwyx.replace('\n','')
        print zwyx
        #工作地点
        gzdd = tag.find(attrs={"class":"gzdd"}).get_text()
        gzdd = gzdd.replace('\n','')
        print gzdd
        #发布时间
        gxsj = tag.find(attrs={"class":"gxsj"}).get_text()
        gxsj = gxsj.replace('\n','')
        print gxsj
        #获取当前日期并判断写入文件
        import datetime
        now_time = datetime.datetime.now().strftime('%m-%d') #%Y-%m-%d
        #print now_time
        if now_time==gxsj:
            print u'存入文件'
            infofile.write(u"[职位名称]" + zwmc + "\r\n")
            infofile.write(u"[公司名称]" + gsmc + "\r\n")
            infofile.write(u"[职位月薪]" + zwyx + "\r\n")
            infofile.write(u"[工作地点]" + gzdd + "\r\n")
            infofile.write(u"[发布时间]" + gxsj + "\r\n")
            infofile.write(u"[职位链接]" + zwlj + "\r\n\r\n")  
        else:
            print u'日期不一致,当前日期: ', now_time
        
        #####################################
        # 重点:写入MySQL数据库
        #####################################
        if now_time==gxsj:
            print u'存入数据库'
            DatabaseInfo(zwmc, gsmc, zwyx, gzdd, gxsj, zwlj)
        
        print '\n\n'

    else:
        print u'爬取职位总数', i
        
        
#主函数
if __name__ == '__main__':
    
    infofile = codecs.open("Result_ZP.txt", 'a', 'utf-8')     
    #翻页执行crawl(url)爬虫
    i = 1  
    while i<=2:  
        print u'页码', i
        url = 'http://sou.zhaopin.com/jobs/searchresult.ashx?in=160400&jl=%E8%B4%B5%E9%98%B3&kw=java&p=' + str(i) + '&isadv=0'  
        crawl(url)  
        infofile.write("###########################\r\n\r\n\r\n")  
        i = i + 1
        
    infofile.close()


        安装Beautifulsoup如下图所示,使用pip install bs4即可。


        重点是分析智联招聘的DOM树结构。
        1.分析URL
        URL为:http://sou.zhaopin.com/jobs/searchresult.ashx?in=160400&jl=%E8%B4%B5%E9%98%B3&kw=java&p=2&isadv=0
        其中,"in=160400" 表示 "行业类别" 选择"计算机软件"(可以多选);"jl=贵阳" 表示工作地点选择贵阳市;"kw=java" 表示职位选择Java相关专业;"p=2" 表示页码,main函数通过循环分析爬取。
        2.分析DOM树节点
        然后浏览器右键审查元素,可以看到每行职位信息都是在HTML中都是一个<table></table>,其中class为newlist。
        核心代码:for tag in soup.find_all(attrs={"class":"newlist"}):
        定位该节点后再分别爬取内容,并赋值给变量,存储到MySQL数据库中。



        3.具体内容分析
        获取职位名称代码如下:
        zwmc = tag.find(attrs={"class":"zwmc"}).get_text()
        print zwmc

        另一段代码,会输出节点信息,如:
        zz = tag.find_all('td', {"class":"zwyx"})
        print zz
        #<td class="zwyx">8000-16000</td>

        对应的HTML DOM树分析如下图所示。


        4.判断为当前日期则保存到TXT和MySQL中,这是为了后面方便,每天爬取最新的信息并周期执行,然后发送短信给手机。我也是佩服自己的大脑,哈哈~

        参考前文,并推荐官网。
        Python爬虫之Selenium+BeautifulSoup+Phantomjs专栏
        [python知识] 爬虫知识之BeautifulSoup库安装及简单介绍
        [python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息


三. 数据库操作

        SQL语句创建表代码如下:

CREATE TABLE `eastmount_zlzp` (  
  `ID` int(11) NOT NULL AUTO_INCREMENT,  
  `zwmc` varchar(100) COLLATE utf8_bin DEFAULT NULL COMMENT '职位名称',  
  `gsmc` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '公司名称',  
  `zwyx` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '职位月薪',  
  `gzdd` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '工作地点',  
  `gxsj` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '发布时间',
  `zwlj` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '职位链接',
	`info` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '详情', 
  PRIMARY KEY (`ID`)  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;  
        显示如下图所示:


        其中,Python调用MySQL推荐下面这篇文字。
        [python] 专题九.Mysql数据库编程基础知识
        核心代码如下所示:

# coding:utf-8 
import MySQLdb
 
try:
    conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',port=3306, db='test01')
    cur=conn.cursor()
    
    #插入数据
    sql = '''insert into student values(%s, %s, %s)'''
    cur.execute(sql, ('yxz','111111', '10'))

    #查看数据
    print u'\n插入数据:'
    cur.execute('select * from student')
    for data in cur.fetchall():
        print '%s %s %s' % data
    cur.close()
    conn.commit()
    conn.close()
except MySQLdb.Error,e:
     print "Mysql Error %d: %s" % (e.args[0], e.args[1])

        后面还将继续探寻、继续写文,写完这种单击版的定时发送功能,后面研究Python服务器的相关功能。最后希望文章对你有所帮助,如果文章中存在错误或不足之处,还请海涵~
        太忙了,但是年轻人忙才好,多经历多磨砺多感悟;想想自己都是下班在学习,配女神的时候学习,真的有个好贤内助。胡子来省考,晚上陪他们吃个饭。感觉人生真的很奇妙,昨天加完班走了很远给女神一个91礼物和一个拼图,感觉挺开心的。生活、教学、编程、爱情,最后献上一首最近写的诗,每句都是近期一个故事。
        风雪交加雨婆娑,
        琴瑟和鸣泪斑驳。
        披星戴月辗转梦,
        娜璋白首爱连绵。

         同时准备写本python书给我的女神,一直没定下来,唯一要求就是她的署名及支持。
      (By:Eastmount 2017-04-22 下午4点   http://blog.csdn.net/eastmount/

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[python爬虫] 招聘信息定时系统 (一).BeautifulSoup爬取信息并存储MySQL 的相关文章

随机推荐

  • 组合优化

    组合优化 MATLAB实现GA BP和PSO BP多输入单输出预测 目录 组合优化 MATLAB实现GA BP和PSO BP多输入单输出预测 基本介绍 程序设计 GA BP PSO BP 参考资料 基本介绍 MATLAB实现GA BP和PS
  • Android混合开发详解

    1 Android加载HTML页面 1 1 WebView简介与使用 Webview的应用场景 WebView控件功能强大 除了具有一般View的属性和设置外 还可以对url请求 页面加载 渲染 页面交互进行强大的处理 主要用于html页面
  • 淘宝购物车测试用例

    功能 购物车界面的所有跳转链接都可以点的动 点击店铺名可以跳转到店铺界面 点击商品可以跳转到商品界面 如果店铺的 table 区域中有 凑单 字样 跳转到凑单界面 如果店铺有 领券 字样 可以弹出领券界面 如果不选择任何商品就进行结算 则显
  • C语言可以开发哪些项目?

    C语言是我们大多数人的编程入门语言 对其也再熟悉不过了 不过很多初学者在学习的过程中难免会出现迷茫 比如 不知道C语言可以开发哪些项目 可以应用在哪些实际的开发中 这些迷茫也导致了我们在学习的过程中不知道如何学 学什么 所以 总结这个列表
  • 第147篇 笔记-预言机(Oracle)

    定义 区块链预言机是将区块链连接到外部系统的实体 从而使智能合约能够基于现实世界的输入和输出执行 预言机为分散的 Web3 生态系统提供了一种访问现有数据源 遗留系统和高级计算的方式 去中心化预言机网络 DON 支持创建混合智能合约 其中链
  • Sentinel服务熔断和流控

    简介 Sentinel 随着微服务的流行 服务和服务之间的稳定性变得越来越重要 Sentinel 是面向分布式服务架构的流量控制组件 主要以流量为切入点 从限流 流量整形 熔断降级 系统负载保护 热点防护等多个维度来帮助开发者保障微服务的稳
  • Spring 框架——利用HandlerExceptionResolver实现全局异常捕获

    一 需求描述 因为在项目中 我们不可否认的会出现异常 而且这些异常并没有进行捕获 经常出现的bug如空指针异常等等 在之前的项目中 如果我们没有进行任何配置 那么容器会自动打印错误的信息 如果tomcat的404页面 400页面等等 如果我
  • kettle(五):下载 Sakila数据库

    Step1 下载 Sakila数据库 参考网址 https blog csdn net geekcoder article details 8988052 下载地址 https dev mysql com doc index other h
  • 基于arduino实现的智能窗

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 器件 二 代码 1 引入库 成果图 初次检测 https img blog csdnimg cn 921efe361a3043acaa08048f2ca0
  • weex 可用样式,与唯一布局方式flex

    Weex 布局模型基于 CSS Flexbox Flexbox 是默认且唯一的布局模型 所以你不需要手动为元素添加 display flex 属性 对于刚开始接触 weex想把它当html5 css3使用的我 在没看文档的情况下也是蒙蔽了
  • 深度学习自学第二周:基于keras实现猫狗大战

    目录 一 初步实现 一 选取训练集 测试集 验证集 二 构建神经网络模型 三 数据预处理 四 绘制损失曲线和精度曲线 二 优化模型 三 数据测试 结合之前学习的知识 现在可以进行猫狗大战的实现了 数据集是采用猫狗大战kaggle竞赛提供的2
  • 三句话,让Ai帮你画18万张图

    本文介绍Stable Diffusion的快速上手 本地部署 以及更多有趣的玩法展示 在 DALL E 2 和 Imagen 之后 AI绘图领域又一个热乎的深度学习模型出炉 Stable Diffusion 8月份发布的 Stable Di
  • Python 异常的传递性

    视频版教程 Python3零基础7天入门实战视频教程 异常是具有传递性的 假如方法A调用方法B 方法B调用方法C 如果方法C代码出现异常 并且没有处理异常 则会传递给方法B 同理 如果B依然没有处理异常 则最终传递给方法A def funC
  • FPGA边缘检测(上升沿、下降沿、双边沿)的三种实现方案

    边缘检测在数字电路设计中非常常见 通常包含上升沿检测 posedge 下降沿检测 negedge 以及双边沿检测 double edge 边缘检测虽然实现非常简单 但有一些值得注意的地方 在设计中一不留神可能就会出现边沿漏检的情况 下面结合
  • 小波理论的基本概念及概述 学习笔记

    本文来自 https blog csdn net seek97 article details 81266223 感谢前辈的分析和总结 下文我做了简要的修改 一 前言 欢迎阅读此份关于小波变换的入门教程 小波变换是一个相对较新的概念 其出现
  • SpringBoot+Nacos:@RefreshScope自动刷新原理

    RefreshScope的作用 经过 RefreshScope注解修饰的bean 将被RefreshScope进行代理 用来实现配置 实例热加载 即当配置变更时可以在不重启应用的前提下刷新bean中相关的属性值 RefreshScope注解
  • 超有趣的linux命令2

    超有趣的linux命令2 此次实验命令均在Ubuntu16 04版本上测试 注意有些命令需要在图形化界面才能显示效果 温馨提示 可能有人是第一次接触Ubuntu 所以下面详细写了如何配置源和网络 以及安装命令的方式 1 首先配置软件源 以命
  • 快手直播间如何引流?快手直播推广怎么玩?

    快手是一个超好玩的短视频社区 每时每刻都有来自世界各地的小伙伴在这里分享自己制作的短视频 现在的快手不仅可以制造短视频 还拥有了直播的功能 那么快手直播效果好吗 快手直播效果好吗 快手发展优势日益明显 快手的用户已经超过5亿之多了 日均活跃
  • 批处理IF-ELSE的使用

    IF Performs conditional processing in batch programs 在批程序中执行条件处理 IF NOT ERRORLEVEL number command IF NOT string1 string2
  • [python爬虫] 招聘信息定时系统 (一).BeautifulSoup爬取信息并存储MySQL

    这系列文章主要讲述 如何通过Python爬取招聘信息 且爬取的日期为当前天的 同时将爬取的内容保存到数据库中 然后制作定时系统每天执行爬取 最后是Python调用相关库发送短信到手机 最近研究了数据库的定时计划备份 联系爬虫简单做了这个实验