Python爬虫:爬取虎牙星秀主播图片
动态爬取思路讲解
1.简单的爬虫只需要访问网站搜索栏处的url,就可以在开发者工具(F12)处,利用正则表达式、Xpath、css等进行定位并抓取数据;
2.虎牙星秀页面不同于简单的网页,随时都在更新,但搜索栏处的url并未改变,所以它是一个动态加载(ajax)的页面;
3.需要在开发者工具界面处对network进行抓包,提取真正给网站页面提供图片链接的url;
4.通过抓包的url,会发现打开的是一个json格式的文本,在里面可以抓取到需要的数据以及链接;
5.最后我们就可以打开Pycharm,活动小手指,敲击小键盘啦!!!
(不要太忘情,打扰到身边的小伙伴哦~)
导入需要的python模块
通过pip install 模块名,本人使用的是Anaconda Prompt导入
import requests
import os
import json
import time
from random import randint
使用Python导入的话比较麻烦,所以强烈建议大家使用Anaconda导入模块。
通过爬虫获得的主播图片
链接: https://www.huya.com/g/xingxiu
在Pycharm中所敲的代码
# -*- coding: utf-8 -*-
# @Date: 2020/8/12 16:17
# @Author: Ricky Rau
import requests
import os
import json
import time
from random import randint
def main():
url = 'https://www.huya.com/cache.php'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
for i in range(5):
page_num = str(i)
params = {
'm': 'LiveList',
'do': 'getLiveListByPage',
'gameId': '1663',
'tagAll': '0',
'page': page_num
}
time.sleep(randint(1,5))
img_lists = getData(url, params, headers)
img_content = get_img_content(img_lists)
saveData(img_lists, img_content)
def getData(url, params, headers):
json_text = requests.get(url=url, params=params, headers=headers).text
jsonObj = json.loads(json_text) #解码的过程,把乱码变成了中文
datas = jsonObj['data']['datas']
#print(datas)
img_lists = []
for data in datas:
img = []
nick = data['nick']
screenshot = data['screenshot']
img.append(nick)
img.append(screenshot)
img_lists.append(img)
return img_lists
def get_img_content(img_lists):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
img_content = []
for i in range(len(img_lists)):
src = img_lists[i][1]
content = requests.get(url=src, headers=headers).content
print('解析完毕第{}张图片!'.format(i))
img_content.append(content)
return img_content
def saveData(img_lists, img_content):
if not os.path.exists('./xingxiu'):
os.mkdir('./xingxiu')
for i in range(len(img_lists)):
img_name = img_lists[i][0] + '.jpg'
img_path = './xingxiu/' + img_name
with open(img_path, 'wb') as fp:
fp.write(img_content[i])
if __name__ == '__main__':
main()
代码中涉及的模块详解
模块 | 用法 |
---|---|
requests | 用来获取网页源代码 |
json | 把json格式的文本变为python可以处理的文本 |
os | 创建一个存放图片的文件夹 |
time | 利用time.sleep()方法给程序设置延迟,防止被网站检测到 |
random.randint | 设置随机睡眠时间,单位为秒 |
Python 之禅
美比丑好,明比涩强。简胜于繁,繁强于难。
平言莫绕,宜疏莫密。行文如水,易懂为王。
勿提特例,皆循此规。实虽胜纯,识错必究。
若需留证,亦要言明。不明其理,追根问底。
必有一法,可解谜题。汝非龟叔,求之故难。
立足当下,行必有方。行难言喻,所思欠妥。
行易言表,所思可嘉。名正易识,善莫大焉!