获取动态渲染网页内容

网页地址如https://www.phsciencedata.cn/Share/frameset?__report=ReportZoneYear.rptdesign&years=2018&diseaseId=322
如何使用urllib.request或Selenium等等工具得到其中表格内容,求解决思路
注:我用request和Selenium获取到的都是页面源代码,没有成功获取到表格数据

img


如图,数据都在这个包里,

主要有的大多数是你抓取的页面上是JS动态加载出来的数据,比如有的需要下拉拖一下才能加载出来更多的数据,这时你需要借助对浏览器的辅助:

import selenium
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time

browser = webdriver.Firefox() # Get local session of firefox
browser.get("http://news.sina.com.cn/c/2013-07-11/175827642839.shtml ") # Load page
time.sleep(5) # Let the page load
try:
    element = browser.find_element_by_xpath("//span[contains(@class,'f_red')]") # get element on page
    print element.text # get element text
except NoSuchElementException:
    assert 0, "can't find f_red"
browser.close()

真正请求的url是这里

img


既然方式是GET所以比较简单直接访问就行了

import requests
import pandas as pd

def API_getData(url,body,selector={'type':'player','order_type':'KDA'}):
    """
    Players Data--->selector={'type':'player','order_type':'KDA'} default,
    Heros Data--->selector={'type':'hero','order_type':'APPEAR'}
    Teams Data--->selector={'type':'team','order_type':'KDA'}
    """
    ## selector
    body['type'],body['order_type']=selector['type'],selector['order_type']
    ##count rows
    req=requests.post(url=url,data=body).json()
    count=int(req['data']['data']['count'])
    onePageCount=len(req['data']['data']['list'])
    lis=[]
    for i in range(1,count//onePageCount+1):
        body['page']=i
        req=requests.post(url=url,data=body).json()
        if req['data']['data']['list']!=[]:
            lis+=req['data']['data']['list']
        else:break
    ##
    cols=lis[0].keys()
    ansData=pd.DataFrame(lis,columns=cols)
    if selector['type']=='hero':
        ansData=ansData[ansData['position_name']!='']
    return ansData

url='你的网址.php'
body={
    'api_path': '你的储存路径.php',
'method': 'post',
'platform': 'web',
'api_version': '9.9.9',
'language_id': '1',
'tournament_id': '191',
'type': 'hero',
'order_type': 'APPEAR',
'order_value': 'DESC',
'team_name': '',
'player_name': '',
'positionID': '',
'page': '1',
}
#
API_getData(url,body,selector={'type':'player','order_type':'KDA'})

seleuim可以载入网页后等待几秒,让他加载数据。

表格可视化工具 可以用 matplotlib试试

抓的时候网页这个请求还没执行完

requests可以请求成功的