爬取动态网页,Ajax动态加载和翻页时url不变的网页


本文主要通过一个实例,实现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文件。
图二:获取Post的url

三、 爬取网页

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()

猜你喜欢

转载自blog.csdn.net/weixin_43899514/article/details/114369201
今日推荐