欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LOL峡谷之巅前500爬取

程序员文章站 2022-04-30 18:25:29
...

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

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

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

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

最终我们可以通过爬取我们寻找的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()


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