写入数据库:
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()