2种方法简单爬取JS加载的动态数据

举报
悦来客栈的老板 发表于 2020/12/28 22:52:43 2020/12/28
【摘要】 参考原文:http://www.cnblogs.com/buzhizhitong/p/5697683.html 需要爬取的网站数据: http://gkcx.eol.cn/soudaxue/queryProvince.html?page=1 一共是165页,将page=1 变成其他的数字即可访问。 获取所有的url:  urls = ('http://gk...















方法一:


  
  1. #coding=utf-8
  2. from bs4 import BeautifulSoup
  3. from selenium import webdriver
  4. urls = ('http://gkcx.eol.cn/soudaxue/queryProvince.html?page={}'.format(i) for i in range(1,166))
  5. driver=webdriver.Firefox()
  6. driver.maximize_window()
  7. for url in urls:
  8. #print ("正在访问{}".format(url))
  9. driver.get(url)
  10. data = driver.page_source
  11. soup = BeautifulSoup(data, 'lxml')
  12. grades = soup.find_all('tr')
  13. for grade in grades:
  14. if '<td>' in str(grade):
  15. print(grade.get_text())

代码说明:

 from bs4 import BeautifulSoup   使用BeautifulSoup  解析网页数据

from selenium import webdriver 使用selenium爬取动态数据

urls = ('http://gkcx.eol.cn/soudaxue/queryProvince.html?page={}'.format(i) for i in range(1,166))   一个包含所有需要爬取的网站生成器

driver=webdriver.Firefox()  打开Firefox浏览器

driver.maximize_window()  窗口最大化

driver.get(url)  浏览器自动跳转到该url链接

data = driver.page_source   获取页面元素,里面就包含了需要爬取的数据

soup = BeautifulSoup(data, 'lxml')
    grades = soup.find_all('tr')
    for grade in grades:
        if '<td>' in str(grade):
            print(grade.get_text())

通过对数据的分析,写出上面的查找方法,即可获取所有数据。


通过这种方法获取数据,简单,也比较直观,缺点是太慢了。


现在通过方法二是获取数据。


用火狐浏览器打开需要爬取的网页,右键  查看元素,选择网络,默认就好。


(有些老版本的火狐浏览器可能需要安装firebug插件)


点击第二页,看看都加载了哪些网页和数据。


分析如下图:



分析得知类型为json的那一栏即是我们需要的数据


查看消息头里面的请求网站

https://data-gkcx.eol.cn/soudaxue/queryProvince.html?messtype=jsonp&callback=jQuery183005011523805365803_1512185796058&luqutype3=&province3=&year3=&luqupici3=&page=2&size=10&_=1512185798203


真正的请求网站 https://data-gkcx.eol.cn/soudaxue/queryProvince.html

参数 messtype=jsonp&callback=jQuery183005011523805365803_1512185796058&luqutype3=&province3=&year3=&luqupici3=&page=2&size=10&_=1512185798203


也可以点击右侧的参数栏参看参数




page 表示当前页数

size表示每页显示的条目数


写出代码


  
  1. #coding=utf-8
  2. import requests
  3. import json
  4. from prettytable import PrettyTable
  5. if __name__=='__main__':
  6. url = 'https://data-gkcx.eol.cn/soudaxue/queryProvince.html'
  7. row = PrettyTable()
  8. row.field_names = ["地区", "年份", "考生类别", "批次","分数线"]
  9. for i in range(1,34):
  10. data ={"messtype":"json",
  11. "page":i,
  12. "size":50,
  13. "callback":
  14. "jQuery1830426658582613074_1469201131959",
  15. "_":"1469201133189",
  16. }
  17. school_datas = requests.post(url,data = data).json()
  18. datas = school_datas["school"]
  19. for data in datas:
  20. row.add_row((data["province"] ,data["year"],data["bath"],data["type"], data["score"]))
  21. print(row)


代码说明

for i in range(1,34): 

一共是 1644条,每页显示的最大条数是50条,1600/50 = 32,还有44条就是33页,所以范围就应该是(1,34)


        data ={"messtype":"json",
              "page":i,
              "size":50,
              "callback":
              "jQuery1830426658582613074_1469201131959",
              "_":"1469201133189",
              }

分析得出的提交数据,使用post方式。


文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/78693900

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。