[python爬虫]爬取boss直聘并且存到Mysql数据库里

导包

import chardet,re,json,pymysql
from urllib import request,parse

from piaot import *

Mysql

def sql(sql_z):

    # 打开数据库连接
    db = pymysql.connect("192.168.43.128", "root", "123456", "boss", charset='utf8')

    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()

    # 使用 execute()  方法执行 SQL 查询
    cursor.execute('')

    # 使用 fetchone() 方法获取单条数据.
    data = cursor.fetchone(sql_z)

    print("Database version : %s " % data)
    # print(x)
    # 关闭数据库连接
    db.close()

mysql查询

def sql_cx(sql_z):

    # 打开数据库连接
    db = pymysql.connect("192.168.43.128", "root", "123456", "boss", charset='utf8')

    # 使用 cursor() 方法创建一个游标对象 cursor
    cursor = db.cursor()

    # 使用 execute()  方法执行 SQL 查询
    data=cursor.execute(sql_z)

    # print("Database version : %s " % data)

    # 关闭数据库连接
    db.close()
    return data

查询城市编号

def chengshi(sheng,shi):
    if shi == None:
        shi=sheng

    url = 'http://www.zhipin.com/common/data/city.json'

    # 调用自定义包
    req = yc(url)
    ll = chardet.detect(req)
    html = req.decode(ll['encoding'])

    # 用json解码
    html=json.loads(html)

    b=[]
    for j in html['data']['cityList']:
        if j['name'] == sheng:
            for i in j['subLevelModelList']:
                if i['name'] == shi:
                    b.append((i['name'],i['code']))

    # 返回格式:['保定',101091100]
    return b

爬取要查询的名称列表页,参数:省/城市,区/县,查询内容,页数

def pq_xx(sheng,qu,nr,ye):

    # 将name值转成url编码
    name = parse.quote(nr)
    for i in range(1,ye+1):

        if qu == None:

            # 拼接url地址
            url = 'http://www.zhipin.com/job_detail/?query={}&scity={}&page={}'.format(name,sheng[0][1],ye)

        else:

            # 将城市值转成url编码
            qu = parse.quote(qu)
            # 拼接url地址
            url='http://www.zhipin.com/c{}/b_{}-h_{}/?query={}&page={}'.format(sheng[0][1],qu,sheng[0][1],name,ye)

        pq_lb_nr(url)

爬取列表里的内容

def pq_lb_nr(url):

    req=yc(url)
    ll=chardet.detect(req)
    html=req.decode(ll['encoding'])

    zz='<h3 class="name">\s*?<a href="(.*?)"'

    nr_str=re.compile(zz)

    html=nr_str.findall(html)

    for i in html:
        url_l='http://www.zhipin.com'+i
        pq_nr(url_l)

爬取内容信息

def pq_nr(url):
   try:
        # 提交申请,调用自定义包
        req = yc(url)

        # 自动检测编码格式
        ll = chardet.detect(req)

        # 转码
        html = req.decode(ll['encoding'])

        # 正则
        zz = 'ka="job-breadcrumb-top4">(.*?)</a>|<span class="time">(.*?)</span>|<span class="badge">(.*?)</span>|<p>(.*?)<em class="vline"></em>(.*?)<em class="vline"></em>(.*?)</p>'
        str_1 = re.compile(zz)
        html_1 = str_1.findall(html)

        # 将获得标题的信息进行去除空值
        x = []
        for i in html_1:
            for j in i:
                if j != '':

                    x.append((j.split(':')[-1]))

        x.pop(-2)
        # x值是清洗好的值
        # print(x)

        # 正则,获得内容里的岗位职责和任职要求和地址图片
        zz_1 = 'div class="text">\s*(.*?)\s*?</div>|data-content="(.*?)">\s*<img src="(.*?)" alt='

        ll_2 = re.compile(zz_1)
        html_2 = ll_2.findall(html)

        # 将匹配完的信息进行清洗,去除<br\>和去空
        x_1 = []
        for i in html_2:
            for j in i:
                if j != '':
                    b = j.replace('<br/>', '')
                    x_1.append((b,))

        # x_1清洗完的值
        # print(x_1)

     # 如果报错或代理失效
    except:
        # 重新调用
        pq_nr(url)

    # sql查询语句
    sql_cx_str="select uid from boss_cs WHERE uid='{}'".format(url)
    if sql_cx(sql_cx_str) == 0:

        # 进行存储sql语句
        sql_str="insert into boss_cs(uid,uname,shij,chengshi,jyan,xueli,tozi,gsrshu,yunx,yaoq,gsxx,gsweizhi,weizhitxiang) values('{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}','{}');".format(url,x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x_1[0][0],x_1[1][0]+x_1[2][0],x_1[-2][0],x_1[-1][0])
        print(sql_str)
        # 调用mysql
        sql(sql_str)
    else:
        pass

主函数

def boss():

    # 调用查询城市函数
    print('BOSS直聘')

    sheng=input('请输入你查询的省:')
    print('--'*20)
    shi=input('请输入查询寻城市(默认无):')
    print('--' * 20)
    qu=input('请输入区或县(默认:空)')
    print('--' * 20)
    nr=input('请输入查询内容:')
    print('--' * 20)
    ye=int(input('请输入页数:'))
    if len(shi) == 0:
        shi=None
    if len(qu) == 0:
        qu=None

    url=chengshi(sheng,shi)

    # # 值1是:遍历出的输入的城市编号,值2:输入的区或县名称,值3:输入查询的内容名称,值4:页数
    pq_xx(url,qu,nr,ye)

if name == ‘main‘:

调用函数

boss()

猜你喜欢

转载自blog.csdn.net/Black_God1/article/details/81952415