创新实训-python3 爬虫 爬取就业帮助信息(一)
注:相关信息仅用于学习交流
一、需求
为了搭建一个关于内推的网站,需要就业帮助信息,类似宣讲会、简历指导、备战策略等。因此需要爬取相关信息存入数据库中,并定时更新
二、数据库设计
在小组成员的讨论下,设计了如下表进行相关信息的存储
job_info表
属性名称 | 数据类型 | 是否为主键 | 能否为空 |
---|---|---|---|
info_ID | bigint | 是 | 不能 |
title | varchar | 否 | 不能 |
describe | text | 否 | 能 |
links | varchar | 否 | 不能 |
date | date | 否 | 不能 |
其中info_ID 为主键,设置为自动增长,title为标题,describe为详细介绍,links为原网站链接,date为发布日期
三、目标网站分析及关键代码实现
1.首页的爬取
(1)需要爬取的字段
爬取的网页url为https://www.job.sdu.edu.cn/xwgg/tzgg/jyzd.htm
如下所示:
第一个帮助信息的url为https://www.job.sdu.edu.cn/info/1019/29055.htm,第二个帮助信息的url为https://www.job.sdu.edu.cn/info/1019/29056.htm ,因此为了在之后的工作中能够构建详情页的链接,需要把编号也爬取下来。
首页的url为https://www.job.sdu.edu.cn/xwgg/tzgg/jyzd.htm,第二页的url为https://www.job.sdu.edu.cn/xwgg/tzgg/jyzd/24.htm,尾页的url为https://www.job.sdu.edu.cn/xwgg/tzgg/jyzd/1.htm,因此为了循环爬取,需要获得总页数
总之,要在该网页中需要获得标题、发布日期、每一项对应的编号与总页数。
(2)关键代码及分析:
通过右键查看网页源代码发现总页数在以下代码中:
总页数仅需要在爬取第一页时获取,并把它存入为job_list的第一项,在后续的工作中进行获取与删除。正则匹配后进行分割,最终获得总页数:25
if(isfirstPage==1):
total_num=re.findall('<TD nowrap align="left" width="1%" id="fanye190595">(.*?)</td>',html,re.S)
print(total_num)
total_num=str(total_num[0])
total_num=total_num.split(' ')
total_num=total_num[2]
total_num=total_num.split('/')[-1]#总页数
print(total_num)
job_list.append(total_num)#第一个项
标题、发布日期以及对应的编号都在’li’标签下 ,运用正则表达式就可获得相关信息
因为源代码中li标签下还有其他内容,所以用num进行过滤,具体的数值是通过测试得出的。正则匹配之后再将其中的无关字符进行取代。将每一个信息的日期、编号与名称放入job_list1中,然后将job_list1放入job_list中,这样job_list中信息形式为[总页数,[日期,编号,标题],[日期,标号,标题],[日期,标号,标题],……]
for link in soup.find_all('li'):#li标签
if (num > 46 and num < 68): # 跳过页首与页尾的无关信息
list=link.contents
datetime=str(list[0])
datetime = re.findall('<span>(.*?)</span>', datetime, re.S)
datetime=str(datetime[0])
datetime