Python爬虫校园招聘信息网

import re #正则表达式提取规则
from bs4 import BeautifulSoup  # 网页解析,获取数据
import urllib.request, urllib.error  #指定URL,获取网页数据
import xlwt  # 进行Excel操作

def main():
    baseurl = "http://job.gdut.edu.cn/unijob/index.php/web/Index/job-list?p="#基本路径
    finalList=[]#用来放最终数据
    for i in range(1,2359):  # 调用获取页面信息的函数,2359次,一次10条,一共爬取到23590条数据
        url = baseurl + str(i)#根据链接的规律,找到每一页的链接
        datalist =getData(url)#解析网页,得到一个网页的内容,并提取相关数据
        finalList=finalList+datalist#把提取到的两万多条数据放进一个大表格
    #print(finalList)#看看格式是不是符合要求的
    savepath = './'#文件路径
    saveData(finalList, savepath)#将数据存储到Excel表格中

    dbpath = "jobDB.db" #数据库路径
    init_db(dbpath)#初始化数据库
    saveData2DB(dbpath, finalList)#将数据保存在数据库里,更加安全,以防弄丢

#利用正则表达式查找目标数据
findTitle = re.compile(r'<div class="col-xs-4 job-name">(.*)</div>')#职位名称
findTime=re.compile(r'<div class="col-xs-2 job-time">(.*)</div>')#发布时间
findCompany=re.compile(r'<div class="col-xs-4 col-xs-offset-1 job-company" style="width:170px;">(.*)</div>')#公司名称
#salary格式不同,要另外设置re
findSalary=re.compile(r'<divclass="col-xs-4job-salary">(.*)</div>')#月薪
findEdu=re.compile(r'<div class="col-xs-3 job-edu">(.*)</div>')#学历
findType=re.compile(r'<div class="col-xs-5 job-industry">(.*)</div>')#公司类型
findDetail=re.compile(r'<div class="qrcode-container" data-url="(.*?)"></div>')#详情链接
findBenefit=re.compile(r'<div class="third-line">(.*)</div>')#工作福利
findAddress=re.compile(r'<div class="col-xs-12 job-industry">(.*)</div>')#公司地址

#解析网页,利用正则表达式提取数据
def getData(url):
    datalist = []
    html = askURL(url)  # 保存获取到的网页源码
    print("正在解析网页!请耐心等待~")
    soup = BeautifulSoup(html, "html.parser")

    #由于页面中月薪一项格式和其它的都不一样,所以要单独处理
    al = soup.find_all('div', class_="col-xs-6")
    bl = soup.find_all('div', class_="col-xs-4 job-salary")
    salList=[]
    for b in bl:
        b=str(b)
        b=re.sub('[\t\s]',"",b)
        salary=re.findall(findSalary, b)
        salList.append(salary)
    i = 0

    # 搜索目标<a>标签
    for a in al:
        a = str(a)
        data=[]

        #职位名称
        titles = re.findall(findTitle, a)
        if titles != []:
            data.append(titles[0])

        #发布时间
        time = re.findall(findTime, a)
        if time != []:
            data.append(time[0])

        #公司名称
        company = re.findall(findCompany, a)
        if company != []:
            data.append(company[0])

        #月薪
        if i<len(salList):
            if salList[i]!=[]:
                data.append(salList[i][0])
            else:
                data.append(' ')
            i = i + 1

        #学历要求
        edu = re.findall(findEdu, a)
        if edu != []:
            data.append(edu[0])

        #公司类别
        type = re.findall(findType, a)
        if type!= []:
            data.append(type[0])

        #公司地址
        address=re.findall(findAddress, a)
        if address != []:
            data.append(address[0])

        #公司福利
        benefit = re.findall(findBenefit, a)
        if benefit != []:
            data.append(benefit[0])

        #详情链接
        detail=re.findall(findDetail,a)
        if detail!=[]:
            data.append(detail[0])

        #把每一条信息放进去
        if data!=[]:
            datalist.append(data)
    print("正在将数据存进去数组!请耐心等待~")
    return datalist
    #print(datalist)

# 得到指定一个URL的网页内容
def askURL(url):
    head = {  # 模拟浏览器头部信息,向豆瓣服务器发送消息(伪装)
        "User-Agent":"XXXXXXXXXXXXXXXXXXXXX",
        "Cookie":"xxxxxxxxxxxxxxxxxxxxxxxxxx"
    }
    # 用户代理,表示告诉广工校园网站服务器,我们是什么类型的机器、浏览器(本质上是高数浏览器,我们可以接收什么水平的文件内容)
    request = urllib.request.Request(url, headers=head)
    html = ""  # 网页先用''存一下
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode("utf-8")  # 解码
        # print(html)
    except urllib.error.URLError as e:
        if hasattr(e, "code"):
            print(e.code)
        if hasattr(e, "reason"):
            print(e.code)
    return html

#将数据存到文件中
def saveData(datalist, savepath):
    print("save......")
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建workbook对象
    sheet = book.add_sheet("广东工业大学职位招聘情况", cell_overwrite_ok=(True))  # 创建工作表,每个单元格可以覆盖内容
    col = ('职位名称', '发布时间', '公司名称', '月薪', '学历要求', '公司类型', '公司地址','福利', '详情链接' )
    for i in range(0, 9):
        sheet.write(0, i, col[i])  # 列名
    for i in range(0, len(datalist)):
        print("第%d条" % i)
        data = datalist[i]
        for j in range(0, 9):
            sheet.write(i + 1, j, data[j])
    book.save('广东工业大学职位招聘情况.xls')  # 保存数据表

import sqlite3
import xlrd
import xlwt

#将数据存储到数据库中
def saveData2DB(datalist, dbpath):
    init_db(dbpath)#初始化数据库
    conn = sqlite3.connect(dbpath)#连接数据库
    cur = conn.cursor()#打开游标

    for data in datalist:  # 行
        for index in range(len(data)):  # 列
            data[index] = '"' + data[index] + '"'  #取出元素并加上“”号
        sql='''insert into jobDB
            (name,time,company,salary,edu,industry,address,benefit,link)
            values(%s)'''%",".join(data)
        #print(sql)
        cur.execute(sql)#游标执行
        conn.commit()#提交
    cur.close()#关闭游标
    conn.close()#关闭连接


# 初始化数据库
def init_db(dbpath):
    # 创建数据表
    sql = '''
        create table jobs
        (
        id integer primary key autoincrement,
        name text,
        time text,
        company text,
        salary text,
        edu text,
        industry text,
        address text,
        benefit text,
        link text
        )
        '''
    conn = sqlite3.connect(dbpath)
    cursor = conn.cursor()#获取游标
    cursor.execute(sql)#执行sql语句
    conn.commit()#提交数据库操作
    conn.close()#关闭数据库连接


#调用主函数
if __name__ == "__main__":
    main()
    print('爬取完毕!')

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值