java爬虫抓取动态网页(soup()需要爬取的网站数据及分析方法)
优采云 发布时间: 2021-09-21 14:07java爬虫抓取动态网页(soup()需要爬取的网站数据及分析方法)
参考原文:
需要爬网的网站数据:共165页,可通过将page=1改为其他数字进行访问
获取所有URL:URL=(“{}”。范围(1)中的I的格式(I),166))
使用Firefox浏览器打开要爬网的网页,右键单击查看页面源代码,Ctrl+F查找并输入293。此值在源代码中不存在,表示它是动态加载的数据
对于动态加载的数据,我熟悉两种方法:一种是使用selenium,另一种是分析网页元素,找出原创网页中的数据,提交表单,并获取不同的数据以达到爬行的目的
方法1:
#coding=utf-8
from bs4 import BeautifulSoup
from selenium import webdriver
urls = ('http://gkcx.eol.cn/soudaxue/queryProvince.html?page={}'.format(i) for i in range(1,166))
driver=webdriver.Firefox()
driver.maximize_window()
for url in urls:
#print ("正在访问{}".format(url))
driver.get(url)
data = driver.page_source
soup = BeautifulSoup(data, 'lxml')
grades = soup.find_all('tr')
for grade in grades:
if '' in str(grade):
print(grade.get_text())
代码说明:
从BS4导入Beauty soup使用Beauty soup解析网页数据
从selenium导入webdriver使用selenium抓取动态数据
URL=('{}'。范围(1)中的i的格式(i),166))收录需要爬网的所有数据的网站*敏*感*词*
Driver=webdriver.Firefox()打开Firefox浏览器
Driver.maximize_window()最大化窗口
driver.get(URL)浏览器会自动跳转到URL链接
Data=driver.page\u source获取页面元素,其中收录要爬网的数据
soup=BeautifulSoup(数据'lxml')
等级=汤。查找所有('tr'))
按年级划分的年级:
如果str(年级)中有“”:
打印(grade.get_text())
通过分析数据并写出上述搜索方法,您可以获得所有数据
通过这种方法获取数据简单直观,但缺点是速度太慢
现在,第二种方法是获取数据
使用Firefox浏览器打开要爬网的网页,右键单击查看元素,然后选择“网络”。默认情况下,该功能正常
(一些旧版本的Firefox可能需要安装firebug插件)
单击第二页以查看加载了哪些页面和数据
分析如下:
分析表明,JSON类型的列就是我们需要的数据
在消息头网站中查看请求@
实际请求网站
参数mestype=jsonp&;callback=jquery3805365803&;luqutype3=&;province3=&;year3=&;luqupici3=&;page=2&;size=10&;03
也可以单击右侧的参数栏以查看参数
Page表示当前的页数
大小表示每页显示的项目数
编写代码
#coding=utf-8
import requests
import json
from prettytable import PrettyTable
if __name__=='__main__':
url = 'https://data-gkcx.eol.cn/soudaxue/queryProvince.html'
row = PrettyTable()
row.field_names = ["地区", "年份", "考生类别", "批次","分数线"]
for i in range(1,34):
data ={"messtype":"json",
"page":i,
"size":50,
"callback":
"jQuery1830426658582613074_1469201131959",
"_":"1469201133189",
}
school_datas = requests.post(url,data = data).json()
datas = school_datas["school"]
for data in datas:
row.add_row((data["province"] ,data["year"],data["bath"],data["type"], data["score"]))
print(row)
代码描述
对于范围(1,34):
共有1644个条目。每页上显示的最大条目数为50,1600/50=32,44个条目为33页,因此范围应为(1,34)
数据={“messtype”:“json”
“页面”:我
“尺寸”:50
“回调”:
“jQuery82613074_59”
":"89"
}
分析提交的数据并使用post方法