当先锋百科网

首页 1 2 3 4 5 6 7

第一次爬取动态网页,晚上再来重新整理一下思路。

动态网页不同于静态网页,本次网页表面的url:http://lol.qq.com/act/a20170704super/ranking.shtml
但是在翻页时url并没有改变。可以说这是一个虚假的url。
而真正的url需要我们自己去寻找。
首先,我们要寻找真正的url

第一步先查看网页代码,点开network,选择JS
如图
在我们点击翻页时会发现这里会加载出一些文件,点开
如图
我们可以发现这里有一个Request URL,通过观察这几个包的Request URL,删除一些觉得不必要的东西,可以总结出真正的url=http://apps.game.qq.com/lol/a20150928lolRF/TopCanyonRank.php?module=UserRankList&e_num=25&Page=页数,

然后点击response查看点击换页时服务器的响应
如图
可以看到这里加载了一个json格式的数据。去掉前面的var J_TopCanyonRank = 我们将内容到https://www.json.cn/#解析可以看到
如图
这个就是我们另一个页面的内容。

最终我们可以通过爬取我们寻找的url来获取这个json格式的数据,解析并进行提取,就可以得到我们想要的内容了。

废话不多说,开代码:

import requests
import re
import json
import csv

fp = open('F:/峡谷之巅.csv','wt',newline='',encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(['排名','名称','段位','胜点','胜率'])

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36",
    "Referer": "http://lol.qq.com/act/a20170704super/ranking.shtml"
}

def explain_html(fins):
    for fin in fins:
        rank = fin.get('iRank')#排名
        name = fin.get('name')#玩家ID

        pan = fin.get('tier')#一个判断,获取的值是31是玩家的段位是最强王者,30是傲视宗师
        if pan == '31':
            location = '最强王者'
        else:
            location = '傲视宗师'

        point = fin.get('league_points')#胜点
        win = fin.get('total_wins')#赢得次数
        los = fin.get('total_losses')#输的次数
        pat = int(win) / (int(win) + int(los))
        #数据中没有直接给出胜率,只有输赢次数,我们需要自己来计算
        rate = str(int(pat * 100)) + "%"
        writer.writerow([rank, name, location, point, rate])
        #将以上获取的一组数据存储到Excel文档

if __name__ == '__main__':
    urls = ["http://apps.game.qq.com/lol/a20150928lolRF/TopCanyonRank.php?module=UserRankList&e_num=25&Page={}".format(i) for i in range(1,21)]
    #动态抓包获取页面滚动链接的规律,然后爬取链接
    for url in urls:
        r = requests.get(url,headers = headers)
        needs = re.findall('var J_TopCanyonRank = (.*)',r.text,re.S)
        #爬取的数据是json数据,以字典形式存储
        # 需要过滤掉这个var J_TopCanyonRank = ,这个会妨碍JSON数据的解析
        results = json.loads(needs[0])
        fins = results.get('UserRankList').get('list')
        #获取对应键的值,就是我们要爬的大体内容
        explain_html(fins)#调用函数获取关键信息

fp.close()


最终结果
在这里插入图片描述
最后在总结一下个人爬取这个网页的感想:
动态网页提取信息思路:
一般动态网页在翻页时,屏幕上的url是没有变化的,那可以说是假的url
而真正的url需要去抓包获取。
1.抓包,找到url变化规律。
2.遍历url,用requests.get提取页面信息。
3.用信息提取方法(re,xpath或BeautifulSoup)提取需要信息
4.用json.loads()解析信息
5.用get()逐步获取字典中键对应的值,因为json格式是一个很大的字典,可以说是字典
之中嵌套着字典,而我们要获取的数据可以说是最里面的一层(字典)数据,
所以要一步一步的得到值,一直到最后的值是一个有关提取信息的字典时就
可以get()其中的有用的关键值进行爬取和存储了。