本文主要通过一个实例,实现Ajax动态加载和翻页时url不变的网页。实例网址如下,在选择不同的页码时,网址未发生变化。传统的request,get语句无法实现翻页爬取,因此采用requests.post获取。以下为操作流程。
实例网址:https://souky.eol.cn/web/special/schoolrecom?specialid=2768
一、找到动态位置
一般是通过页码①寻找Network②中XHR③中的元素④,查看对应的headers⑤,看Form Data中的page⑥,是否与页码①对应。
注意!注意!注意!不要再第一页找,要翻到第2页,才容易找到带post属性的json.
二、确定post的url
在同一位置处,找到Post属性的URL,通过上传参数的方式获取该Json文件。
三、 爬取网页
1. 获取网页
使用字典,对formdata传入需要改动的值
import requests
import json
# 找到网页的动态部分
post_url = "https://souky.eol.cn/web/special/ajaxschoollist?format=json" # 如图二所示
formdata={
"page":4} # 可以传入的数据(翻页数据) 图一中的7所示
2. 解析网页
# 通过post获取动态的json文件
resp = requests.post(post_url,data=formdata,headers={
'User-Agent':'Mozilla/5.0'})
resp.raise_for_status() # 返回爬取状态
resp.encoding = resp.apparent_encoding # 编码
3. 数据打开
用json打开爬取到的json文件,是一个字典
college = json.loads(resp.text) # json格式用json打开后是字典
print(college)
输出结果如下展示
# 一个大字典包含网页信息
## 一个小字典data包含所有学校
### 一个小小字典data包含一个学校(字典是无序的)
{
'status': 1, 'code': '', 'message': '成功!', 'url': '/',
'data': {
'data': [
{
'school_id': '174', 'name': '北京师范大学', 'flag_985': '1', 'flag_yjxk': '0', 'first_rate': '1', 'flag_211': '1', 'flag_score': '1', 'province': '北京', 'pro_school_type': '师范类', 'is_recommend': '0'}
,{
'school_id': '242', 'name': '天津大学', 'flag_985': '1', 'flag_yjxk': '0', 'first_rate': '1', 'flag_211': '1', 'flag_score': '1', 'province': '天津', 'pro_school_type': '理工类', 'is_recommend': '0'}
,{
'school_id': '137', 'name': '扬州大学', 'flag_985': '0', 'flag_yjxk': '0', 'first_rate': '0', 'flag_211': '0', 'flag_score': '0', 'province': '江苏', 'pro_school_type': '综合类', 'is_recommend': '0'}
,...
,{
'school_id': '151', 'name': '西北大学', 'flag_985': '0', 'flag_yjxk': '1', 'first_rate': '0', 'flag_211': '1', 'flag_score': '0', 'province': '陕西', 'pro_school_type': '综合类', 'is_recommend': '0'}
]}
}
4.文件保存
将文件写入colleges.txt
f = open('colleges.txt','w')
for college in college["data"]["data"]:f.write(college+'\n')
f.close()
附录:完整的python代码
'''爬取金融专业的开设院校'''
# -*- coding:utf-8 -*-
import requests
import json
import time
# 找到网页的动态部分
def colleges_list(page):
post_url = "https://souky.eol.cn/web/special/ajaxschoollist?format=json"
formdata={
"page":page} # 可以传入的数据(翻页数据)
resp = requests.post(post_url,data=formdata,headers={
'User-Agent':'Mozilla/5.0'})
resp.raise_for_status() # 返回爬取状态
resp.encoding = resp.apparent_encoding
colleges = []
college = json.loads(resp.text) # json格式用json打开后是字典
colleges = [i['name'] for i in college["data"]["data"]]
return colleges
if __name__ == '__main__':
total_colleges = []
for page in range(21): # 设置一下总页数
time.sleep(1);print("正在下载第%d页"% (page+1)) # 慢点下,给服务器点温暖
total_colleges.extend(colleges_list(page))
# 文件写入
f = open('colleges.txt','w')
for college in total_colleges:f.write(college+'\n')
f.close()