python爬了51job 选定python,java和北上广深四个城市 爬取对应地点 最高最低工资

写入数据库:

import urllib.request
import re
import sqlite3

#连接sqlite数据库
conn = sqlite3.connect(r'D:\\db51job.db')
cursor = conn.cursor()

#IF NOT EXISTS当表不存在的时候,新建
cursor.execute('create table IF NOT EXISTS result51job(id integer primary key,key varchar(20),addr varchar(40),momin float,momax float)')

key = input("请输入关键字:")
page = input("请输入想要查询的页数:")

#控制查询页数
for i in range(1,int(page)+1):
    
    #i必须是字符才能拼接
    i=str(i)

    #将关键字和页数添加进url
    url='https://search.51job.com/list/010000%252C020000%252C030200%252C040000,000000,0000,00,9,99,'+key+',2,'+i+'.html'
    
    res=urllib.request.urlopen(url)
    
    #读取urllib.request返回的数据
    html=res.read()
    
    #read()返回的是二进制序列,利用decode()转换成html
    html=html.decode('GBK')

    retur = re. findall('<span class="t3">(北京|上海|广州|深圳).*</span>\s*<span class="t4">(\d*\.?\d*)-(\d*\.?\d*)(\w)/(.*)</span>',html)
    
    for i in range(1,len(retur)):
         #数据处理:单位换算
         minm = float( retur[i][1])
         maxm = float(retur[i][2])

         #round(x,n)函数:浮点数x 保留n位的四舍五入值
         if retur[i][3] == '千':
                  minm =round(minm /10,2)
                  maxm =round(maxm /10,2)
         if retur[i][4] == '年':
                  minm = round(minm /12,2)
                  maxm  =round(maxm /12,2)
                  
         #插入数据
         cursor.execute("insert into result51job(key,addr,momin,momax) values ('%s','%s','%f','%f')" % (key,retur[i][0],minm,maxm))
         
#commit()作用:运行完commit()之后,才会将插入的数据写入数据库
conn.commit();

#查询数据库,显示result51job表中数据
cursor.execute("select * from result51job")
values=cursor.fetchall()
print(values)

#关闭游标,关闭数据库连接
cursor.close()
conn.close()

写入文件:

import urllib.request
import re

key = input("请输入关键字:")
page = input("请输入想要查询的页数:")
#每个关键字对应一个txt文件,w+会覆盖之前的内容

f = open(r'D:\\'+key+'.txt', 'w+')
f.write('关键字'+'          '+'工作地点'+'       '+'薪资min'+'     '+' 薪资max'+'\r\n')

#for循环控制读取哪几页,i表示页数
for i in range(1,int(page)+1):
    
    #i必须是字符才能拼接
    i=str(i)
    
    url='https://search.51job.com/list/010000%252C020000%252C030200%252C040000,000000,0000,00,9,99,'+key+',2,'+i+'.html'
    
    res=urllib.request.urlopen(url)
    
    #读取urllib.request返回的数据
    html=res.read()
    
    #read()返回的是二进制序列,利用decode()转换成html
    html=html.decode('GBK')

  #正则表达式的应用
        #每一个子表达式后都加了?,目的在于当薪资为空的情况出现时,也会显示。
        #[\u4e00-\u9fa5]表示汉字
        #正则表达式中用几个括号,返回的元组是几个元素
        #.可以匹配任何字符。但是不能匹配换行,改进:1,但是re.S可以让</span>.*<span中的.匹配任意字符,包括换行符
               #1.
                #retur = re. findall('<span class="t3">(北京|上海|广州|深圳).*</span>.*<span class="t4">(\d*\.?\d*)?-?(\d*\.?\d*)?(\w)?/?(.*)?</span>',html,re.S)
                    #这种改进方式的缺点:会开启贪婪模式,即.*后面的所有字符都将被匹配掉,直到最后一行数据
                    #关闭贪婪模式的方法:在.*后面加上问号?:retur = re. findall('<span class="t3">(北京|上海|广州|深圳).*</span>.*?<span class="t4">(\d*\.?\d*)?-?(\d*\.?\d*)?(\w)?/?(.*)?</span>',html,re.S)

  #findall方法注意参数是两个
        #第一个参数是想要返回的格式
        #第二个参数是搜索范围
    retur = re. findall('<span class="t3">(北京|上海|广州|深圳).*</span>\s*<span class="t4">(\d*\.?\d*)-(\d*\.?\d*)(\w)/(.*)</span>',html)
    
    #每一个子表达式后都加了?,目的在于当薪资为空的情况出现时,也会显示。
         #爬取数据时面对特殊情况,可以直接舍去,因为总体数据量很大,并不会对最后结果造成太大影响
    #retur = re. findall('<span class="t3">(北京|上海|广州|深圳).*</span>\s*<span class="t4">(\d*\.?\d*)?-?(\d*\.?\d*)?(\w)?/?(.*)?</span>',html)
    #retur = re. findall('<span class="t3">([\u4e00-\u9fa5]*)?-?(.*)?</span>\s*<span class="t4">(\d*\.?\d*)?-?(\d*\.?\d*)?(\w)?/?(.*)?</span>',html)
    #address = re. findall('<span class="t3">([\u4e00-\u9fa5]*)?-?(.*)?</span>',html)
    #money = re.findall('<span class="t4">(\d+\.*\d*)?-?(\d+\.*\d*)?(.*)</span>',html)
    #money = re.findall('<span class="t4">(\d*\.?\d*)?-?(\d*\.?\d*)?万?(.*)?</span>',html)
    #money = re.findall('<span class="t4">(\d*\.?\d*)?-?(\d*\.?\d*)?(\w)?/?(.*)?</span>',html)
    print(len(retur))
    
    for i in range(1,len(retur)):
        minm = float( retur[i][1])
        maxm = float(retur[i][2])
        #print(key+'   '+address[i][0]+'   '+money[i][0],'    ',money[i][1])
        if retur[i][3] == '千':
            #round(x,n)函数:浮点数x 保留n位的四舍五入值
            minm = round(minm /10,1)
            maxm  = round(maxm /10,1)
        if retur[i][4] == '年':
            minm = round(minm /12,1)
            maxm  =round(maxm /12,1)
        result = key+'             '+retur[i][0]+'           '+str(minm)+'           '+str(maxm) +'      '+retur[i][3]+'     '+retur[i][4]+'\r\n'
        
        print(str(result))
        
        f.write(str( key+'             '+retur[i][0]+'           '+str(minm)+'           '+str(maxm) +'\r\n'))

#注意要关掉打开的文件,否则就会写不进去
f.close()

        

猜你喜欢

转载自blog.csdn.net/qq_39065788/article/details/84095484
今日推荐