今天做的一个是爬取斗鱼的排行榜。
因为一开始看F12的时候我没能找到如何获取所需要内容的办法,一开始我是想用BeautifulSoup库的Select方法的,但是使用这个方法查找标签的方法只能查到一个空集,我感到很奇怪,因为我使用的标签是一定存在的啊,就算找不到我真正想要的那部分内容也不应该是空集啊。后来我使用了re库的findall方法,但是找到之后并不能正常的以‘utf-8’的编码显示出来,然后我看别人写的内容是经过了一次json.loads()方法后就能正常的显示中文,返回的是一个字典,最后通过字典的键名就能找到想要的内容。所以唯一的收获就是如果最后想获得的可以是一个字典格式的变量的话,一开始如果不能得到能够显示中文内容的结果,那么一个好方法是使用json.loads()操作一下。
另一个收获吧,是记住了re.S他的任务是把‘.’的表示范围扩展到了‘\n’这样即使我们想要的字符串之间存在换行符,我们也一样能匹配到,如果不加的话默认这个。是只能在同一行里面匹配的。
import re
import requests
import json
url = 'https://www.douyu.com/directory/rank_list/game'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:57.0) Gecko/20100101 Firefox/55.0'}
page = requests.get(url, headers=header)
page.encoding = page.apparent_encoding
print(page.apparent_encoding)
rs = page.text
mt = re.findall('rankListData\s+?=(.*?);', rs, re.S)
#print(mt)
#fp = open('1.txt', 'w', encoding='utf-8')
#for mtnum in mt:
#fp.write(mtnum)
#result = json.dump(mt, fp)
#print(result)
#print(mt)
mtdict = json.loads(mt[0])
print(type(mt))
print(type(mtdict))
#print
#print(mtdict)
for listData in ['dayListData','weekListData','monthListData']:
mtdictdict = mtdict['anchorListData'][listData]
print("这是%s"%listData)
for mtdictnum in mtdictdict:
#print(mtdictnum)
print('第%d名是%s,他的直播间id是%s,他的直播类别是%s,他%s'%(mtdictnum['id'],mtdictnum['nickname'],mtdictnum['room_id'],mtdictnum['catagory'],mtdictnum['title']))