第一次爬取动态网页,晚上再来重新整理一下思路。
动态网页不同于静态网页,本次网页表面的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()其中的有用的关键值进行爬取和存储了。