信息"/>
python抓取调剂信息
#文章首发于公众号“如风起”。
原文链接:Python随笔|抓取研招网调剂信息mp.weixin.qq
前一段时间为了帮助同学更方便的获取研招网的调剂信息就写了一小段抓取研招网调剂信息的代码。
代码没有什么难度,不过蛮有意思的,所以分享一下编写代码的过程、思路和代码,如果刚好有正在学习python的小伙伴可以练练手,一起交流学习。
这里只写了抓取模糊查询的结果,精确查询的代码和模糊查询的类似,只是传入的post参数有些许的不同。Python版本:Python 3.8.0
操作平台:PyCharm
使用的库:requests、json
首先,我们进入研招网的调剂信息的页面。
研招网是需要先登录然后才能查看调剂信息,所以代码里可能需要用到模拟登陆。
我们进入调剂信息查询的页面。
看一下当前页面的源代码。通过查找,可以发现,我们要抓取的信息并不在网页的源代码里面,说明我们要抓取的信息是动态的。所以,下一步,我们打开开发者工具,进入"Network"。
通过全局搜索"Ctrl + F",我们用关键词"华南理工大学"查询一下,看一下调剂的数据放在了哪里。
通过查询发现,数据在"sytjqexxcx.action"里面。
点击去看一下,同样我们在这里通过"Ctrl + F"搜索一下"华南理工大学",看下具体是在哪里。
通过查询,我们可以看到数据都在json里面。
我们点开其中一个查看一下具体的信息
可以看到,我们所需要的数据都在里面。
我们再看下其他的信息,在"vo_list_des"中我们可以找到上述key的对应关系,这样就方便我们后面存入数据时的转换。
再然后,我们点击"Headers"看一下头部信息。
发现请求是post(内心有点不安)
没办法,post需要传入表单数据信息,我们得看一下他的表单数据。
在"Headers"的底部我们可以找到它的表单数据信息。
认真看一下,结果发现表单数据里面并不包含登录信息(开心),所以我们就不需要模拟登录了,复制页面的cookie传入到函数中应该可以直接访问了
一个页面有20条数据,我们点击第2页,发现网址并没有发生改变,不过表单数据里面的"start"值变为了20,说明有参数在变化。
关键词"金融"现在查询到的信息就2页,不太好找规律,我们换成"经济"查询一下,找一下参数变化的规律。
查看了三页的数据,我们已经可以初步看出规律了。
可以发现,切换页面,表单数据中只有"star"这个参数在变化,并且会以0,20,40的规律变化,其他参数均不变,不过如果更换搜索的关键词,那么"dwmc2"这个参数也就会发生相应的变化了。所以,我们只要改变表单数据中的"start"这个参数就可以抓取调剂信息界面的数据了。
下面我们开始编写抓取数据的代码
首先,模拟上面我们找到的"start"的变化规律,我们构造一个传递表单数据的函数,考虑到还要抓取其他专业的数据信息,所以我们在参数中多加一个专业名称(zy)。
def get_data(num,zy):
para = {
'pageSize': 20,
'start': num * 20,
'orderBy': '',
'mhcx': '1',
'ssdm2': '',
'xxfs2': '',
'dwmc2': '{major}'.format(major = zy),
'data_type': 'json',
'agent_from': 'web',
'pageid': 'tj_qe_list'
}
return para
然后,我们构造抓取调剂信息的函数,利用"requests.post"就可以实现数据的抓取了,但是我们还需要使用json库将json转化为list,并适当的对数据进行清洗。
def get_con(url, data):
response = requests.post(url, headers=headers, data=data)
response.raise_for_status()
response.encoding = response.apparent_encoding
text = json.loads(response.text)
content = text['data']['vo_list']['vos']
for item in content:
dir = str(item['yjfxmc']).replace('\n','').replace('\r','')
spe = str(item['bz']).replace('\n','').replace('\r','')
xinxi = {
'school': item['dwmc'],
'academic': item['yxsmc'],
'major': item['zymc'],
'majorID': item['zydm'],
'schoolID': item['dwdm'],
'direction': dir,
'specify': spe,
'type': item['xxfs'],
'yue': item['qers'],
'time': item['gxsj']
}
yield xinxi
接着,我们就可以构造一个将抓取的数据写入到本地的函数了,这里是将数据写入到了csv文件中,当然也可以写到SQL或者Excel中。
def get_tiaoji(url , zy_name):
with open('{zy}.csv'.format(zy = zy_name), 'a',encoding='utf-8-sig') as csvfile:
csvfile.write("单位代码"+','+ "单位名称"+','+"院系所名称"+','+"专业名称"+','+"专业代码"+','+"研究方向名称"+','+"学习方式(1为全日制,2为非全)"+','+"特殊说明"+','+"距离最后更新时间已过xx分钟"+','+"余额状态(0并不是没有,官网没有提供具体数据)"+'\n')
for i in range(100):
try:
content = get_con(url=url, data=get_data(i,'{zy}'.format(zy = zy_name)))
for item in content:
with open('{zy}.csv'.format(zy = zy_name), 'a', encoding='utf-8-sig') as csv:
csv.write(item['schoolID'] + ',' + item['school'] + ',' +
item['academic'] + ',' + item['major'] + ',' + '\'' + item['majorID'] + ',' +
item['direction'] + ',' + str(item['type']) + ',' + item['specify']+ ',' +str(item['time'])+ ',' + str(item['yue'])+ '\n')
except:
break
这样,我们就把主要的函数编写完成了,只要把"headers"写入,向函数中传入参数"url"和"zy_name"就可以实现数据的抓取了。
if __name__ == '__main__':
url = '.action'
get_tiaoji(url , '经济')
最终抓取结果是这样的:
更多推荐
python抓取调剂信息
发布评论