杭电宣讲会信息爬取
爬取内容: 宣讲单位,宣讲时间,所在学校,宣讲地点,单位简介等
项目需求
- 实现两层网页的信息爬取,并将爬取的信息进行整合保存到 excel 文件中。
(1) 基础:爬取一个外层页中,所有内层页的信息
(2) 进阶:爬取多个外层页中, 所有内层页的信息 - 每个题目中, 至少爬取上述给定爬取内容中的五项。
- 自学数据可视化方法,将爬取结果以曲线图、 柱状图等方式显示。
- 自学 scrapy 库,尝试将以上题目用 scrapy 框架实现
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 2 20:29:39 2019
@author: 1
"""
import requests # 导入网页请求库
from bs4 import BeautifulSoup # 导入网页解析库
import pandas as pd
import json
import re
#http://career.hdu.edu.cn/module/getcareers?start_page=1&k=&panel_name=&type=inner&day=&count=15&start=1&_=1572698708166 第一页
#http://career.hdu.edu.cn/module/getcareers?start_page=1&k=&panel_name=&type=inner&day=&count=15&start=2&_=1572698708167 第二页
#http://career.hdu.edu.cn/module/getcareers?start_page=1&k=&panel_name=&type=inner&day=&count=15&start=3&_=1572698708168 第三页
#http://career.hdu.edu.cn/module/careers?menu_id=6438
#http://career.hdu.edu.cn/detail/career?id=career_talk_id 二级网页
# 发起请求
def start_requests(url):
#print(url) # 查看在抓取哪个链接
r = requests.get(url)
return r.text
# 解析一级网页,获取career_talk_id列表
def get_id(text):
#soup = BeautifulSoup(text, 'html.parser')
list_id=[]
content=json.loads(text)
for item in content['data']:
list_id.append(item['career_talk_id'])
return list_id#返回序列
# 解析二级网页,获取公司简介信息
def parse_page(text):
mydict={}
soup = BeautifulSoup(text, 'html.parser')
pattern=re.compile(r'[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b\u4e00-\u9fa5\d+]')
#data_name=soup.find('h1',class_="dm-text",style="font-weight:normal;").text.split('宣讲单位:')[1]
data_name=pattern.findall(soup.find('h1',class_="dm-text",style="font-weight:normal;").text.split('宣讲单位:')[1])
data_company=pattern.findall(str(soup.select('#data_details > div.main > div > div:nth-child(2) > div.dm-cont')))
#div class="dm-cont" style="font-size:14px;line-height:22px;"
data_time=soup.find_all('p',class_="dm-text")[0].text.split('宣讲时间:')[1]
data_school=soup.find_all('p',class_="dm-text")[1].text.split('所在学校:')[1]
data_place=soup.find_all('p',class_="dm-text")[2].text.split('宣讲地点:')[1]
str_data=''.join(data_company)
str_name=''.join(data_name)
mydict['宣讲地点']=data_place
mydict['公司简介']=str_data.replace('1422','')
mydict['宣讲学校']=data_school
mydict['宣讲单位']=str_name
mydict['宣讲时间']=data_time
return mydict#返回字典
#数据整理
def get_result():
for i in range(1572698708166, 1572698708168):
url = 'http://career.hdu.edu.cn/module/getcareers?start_page=1&k=&panel_name=&type=inner&day=&count=15&start={}&_={}'.format(i-1572698708165,i)
text = start_requests(url)
list_id= get_id(text) # 解析一级页面,获取二级页面的career_talk_id
for career_id in list_id: # 解析二级页面
url_2='http://career.hdu.edu.cn/detail/career?id={}'.format(career_id)
page = start_requests(url_2)
mydict= parse_page(page)#dict的信息
result_list.append(mydict)
return result_list#返回列表
#运行,可视化+写入excel
if __name__ == '__main__':
result_list=[]
result_list=get_result()
df=pd.DataFrame(result_list)
df['宣讲时间'].value_counts().plot(kind='bar')
df.to_excel('data.xlsx')
最终得到data.xlsx和一个宣讲时间数量统计图(属实无聊,但是作业要做hhhhh)