导包
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()