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('爬取完毕!')
Python爬虫校园招聘信息网
最新推荐文章于 2024-04-11 23:28:46 发布