这是我们学院短学期的一个大作业了(嘿嘿希望能帮助到杭电通信的同学),其中使用json文本来爬取的,比较不常见,所以记录下来跟大家一起分享!
看一下杭电宣讲会的网站(http://career.hdu.edu.cn/module/careers)
- 先来说一下项目目标:
- 宣讲单位,宣讲时间,所在学校,宣讲地点,单位简介
- 项目需求:
- 实现两层网页的信息爬取,并将爬取的信息进行整合保存到 excel 文件中。
(1) 基础:爬取一个外层页中,所有内层页的信息
(2) 进阶:爬取多个外层页中,所有内层页的信息
每个题目中,至少爬取上述给定爬取内容中的五项。
自学数据可视化方法,将爬取结果以曲线图、柱状图等方式显示。
- 代码
import requests
import json
import parsel
import xlwt
def main():
wurl = 'http://career.hdu.edu.cn/module/getcareers?start_page=1&k=&panel_name=&type=inner&day=&count=15&start='
datalist = getdata(wurl)
savapath = r'F:\pycharm\project1\杭电宣讲会.xls'
saveData(datalist, savapath)
def askurl(wurl):
# headers = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.9 Safari/537.36'}
res = requests.get(wurl)
res = json.loads(res.text) #读取json文本
# print(res)
# print(res['data'][0]['company_name'])
return res
def gethtml(url):
res = requests.get(url)
html = res.text
return html
def getid(wurl):
id = []
for i in range(1,int(pages)+1):
sumurl = wurl + str(i) #所有页面的url
res = askurl(sumurl)
for company in res['data']:
id.append(company['career_talk_id'])#得到所有的id
return id
def getplace(wurl):
place = []
for i in range(1,int(pages)+1):
sumurl = wurl + str(i) #所有页面的url
res = askurl(sumurl)
for company in res['data']:
place.append(company['address'])#得到所有的name
# print(place)
return place
def getdata(wurl):
id = getid(wurl)
place = getplace(wurl)
datalist = []
for j in range(0,int(pages)*15):
datas = []
nurl = 'http://career.hdu.edu.cn/detail/online_career?id=' #内网页url
baseurl = nurl + id[j]
html = gethtml(baseurl)
data = parsel.Selector(html)
company = data.xpath('normalize-space(//h1[@class="dm-text"]/text())')[0].get()#宣讲单位
datas.append(company[5:])
# print(company[5:])
time = data.xpath('//p[@class="dm-text"]/text()')[0].extract() #宣讲时间
datas.append(time[5:])
# print(time[5:])
school = data.xpath('//p[@class="dm-text"]/text()')[1].extract() #所在学校
datas.append(school[5:])
# print(school[5:])
datas.append(place[j]) #宣讲地点
counts = data.xpath('//p[@class="dm-text"]/text()')[2].extract() #浏览量
datas.append(counts[4:])
info = data.xpath('normalize-space(//div[@class="tab-content"]//p/text())').extract()[0] #单位简介
if len(info) != 0:
# print(info)
datas.append(info)
else:
info = data.xpath('normalize-space(//div[@class="tab-content"]//div[@class="dm-cont"]/text())').extract()[0]
# print(info)
datas.append(info)
datalist.append(datas)
return datalist
def saveData(datalist, savapath):
workbook = xlwt.Workbook(encoding='utf-8', style_compression=0) # 创建对象
worksheet = workbook.add_sheet('TOP250', cell_overwrite_ok=True) # 创建工作表
col = ('宣讲单位', '宣讲时间', '所在学校', '宣讲地点', '浏览量', '单位简介')
for j in range(0, 6):
worksheet.write(0, j, col[j]) # 列名
for i in range(0, int(pages)*15):
data = datalist[i]
print("第%d条" % (i + 1))
for j in range(0, 6):
worksheet.write(i + 1, j, data[j]) # 数据
workbook.save(savapath)
if __name__ == '__main__':
pages = input("请输入需要查询的页码:")
main()
print("爬取完成")
- 数据可视化就留着你们自己做了