python3学习11--动态爬取图片、bilibili普通视频

#python3 爬虫 爬取网络图片
# 目标网站  百度图片 因为百度图片是动态加载的

'''
思路:
首先打开百度图片 搜索一个关键字
然后打开f12
network --》xhr
向下滚动 可以看到出现一个acjson开头的请求
查看其preview里的数据,data中放着30张图片的数据,说明每次加载30张
查看header 找到Query String Parameters 可以发现百度图片的请求参数
'''


import requests,os

user_agent ='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36'
headers = {'User_Agent': user_agent}
sessions=requests.session()
sessions.headers=headers

def getManyPages(keyword,pages):
    params=[] # 参数列表
    for i in range(30,30*pages+30,30):
        #每页30个
        #参数
        params.append({
            'tn': 'resultjson_com',
            'logid':8613610779869385243,
            'ipn': 'rj',
            'ct': 201326592,
            'is': '',
            'fp': 'result',
            'queryWord': keyword,
            'cl': 2,
            'lm': -1,
            'ie': 'utf-8',
            'oe': 'utf-8',
            'adpicid': '',
            'st': '',
            'z': '',
            'ic': '',
            'word': keyword,
            's': '',
            'se': '',
            'tab': '',
            'width': '',
            'height': '',
            'face': '',
            'istype': '',
            'qc': '',
            'nc': 1,
            'fr': '',
            'pn': i,
            'rn': 30,
            'gsm': '1e',
            '1613199601530': ''
        })
    # 请求连接
    url='https://image.baidu.com/search/acjson'
    urls=[]

    for i in params:
        #拼好url
        # 获取data数据 存入urls里
        urls.append(sessions.get(url,params=i,allow_redirects=True).json().get('data'))
    return urls

def getImg(urls,path):
    if not os.path.exists(path):
        os.mkdir(path)
    x=0
    for list in urls:
        #得到data中的每一条数据为i
        for i in list:
            # 得到每个图片的url
            if i.get('thumbURL')!=None:
                # 获取连接
                print('正在下载:%s' % i.get('thumbURL'))
                # 下载图片
                ir=sessions.get(i.get('thumbURL'),allow_redirects=True)
                #写入文件
                open(path+"\%d.jpg" % x ,'wb').write(ir.content)
                x+=1
            else:
                print("图片不存在")
if __name__=='__main__':
    dataList=getManyPages('动漫图片',1)
    getImg(dataList,r'C:\Users\zxy\Desktop\getnovel')

'''
之前用的是requests.get
但是会报错
requests.exceptions.TooManyRedirects: Exceeded 30 redirects.
百度搜是重定向过多,所以改用session请求
参考博客
https://blog.csdn.net/zhaofuqiangmycomm/article/details/83021944
https://my.oschina.net/u/4382492/blog/4559007
'''
import json
from random import random

import requests,os,re
'''
我来尝试爬取一下bilibili的视频
不知道能不能成功
'''

'''
首先,搜索要爬取的视频内容
我搜索原神
可以看到一个接口
type接口,每次翻页都会从这个type接口里返回数据
Request URL: https://api.bilibili.com/x/web-interface/search/type?context=&page=2&order=&keyword=%E5%8E%9F%E7%A5%9E&duration=&tids_1=&tids_2=&__refresh__=true&_extra=&search_type=video&highlight=1&single_column=0
Request URL: https://api.bilibili.com/x/web-interface/search/type?context=&page=3&order=&keyword=%E5%8E%9F%E7%A5%9E&duration=&tids_1=&tids_2=&__refresh__=true&_extra=&search_type=video&highlight=1&single_column=0
这个接口是get请求
这个是查询参数列表
{
context: 
page: 3
order: 
keyword: 原神
duration: 
tids_1: 
tids_2: 
__refresh__: true
_extra: 
search_type: video
highlight: 1
single_column: 0
}

这个接口的preview中
data数据部分
result里有一个list数组,里面包含20条数据
点开其中一条数据
可以得到一些信息 其中最主要的是
arcurl: "http://www.bilibili.com/video/av884933978"
这个应该就是我们的视频地址 这就是需要的
'''

user_agent ='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36 SE 2.X MetaSr 1.0'
headers = {'User_Agent': user_agent}
sessions=requests.session()
sessions.headers=headers

def getVideosUrl(keyword,page):
    params=[]
    for i in range(1,page+1,1):
        params.append({
            'context': '',
            'page':2,
            'order': '',
            'keyword': keyword,
            'duration': '',
            'tids_1': '',
            'tids_2': '',
            '__refresh__': True,
            '_extra': '',
            'search_type': 'video',
            'highlight': 1,
            'single_column': 0,
        })
    url = 'https://api.bilibili.com/x/web-interface/search/type'
    urls=[]
    for i in params:
        #拼好url
        # 获取data数据 存入urls里
        # urls.append(sessions.get(url,params=i,allow_redirects=True).json().get('data').get('result'))
        urls.append(sessions.get(url,params=i,allow_redirects=True).json().get('data')) #因为要取seid,所以不把result遍历出来了

    return urls
'''
[{'type': 'video', 'id': 287555128, 'author': '云喵喵嗷', 'mid': 52914908, 'typeid': '172', 'typename': '手机游戏', 'arcurl': 'http://www.bilibili.com/video/av287555128', 'aid': 287555128, 'bvid': 'BV1Tf4y1z76D', 'title': '【<em class="keyword">原神</em>】点赞吸欧!欧的不真实~',
这个函数已经达到了我预期的效果
改进后
应该是[{seid:'',result:[{...}]}]
'''

# 接下来我们来看看具体视频中的情况
'''
https://www.bilibili.com/video/BV1Zf4y1q7dU?from=search&seid=9880159543105761967
每个视频都是如此 bv号 加一个seid 
所以我们第一步取的东西可能有点问题 
我们不是要取arcurl 而是 bvid和data中的seid

'''
def getVideo(datas,path):
    if not os.path.exists(path):
        os.mkdir(path)
    for data in datas:
        #得到data中的每一条数据为i
        seid=data.get('seid')
        for i in data.get('result'):
            downlaod(i,seid,path)

def downlaod(i,seid,path):
        # 视频标题
        title = i.get('title').replace('<em class="keyword">','').replace('</em>','')
        # 作者
        author = i.get('author')
        # bv号
        bvid = i.get('bvid')
        url=f'https://www.bilibili.com/video/{bvid}?from=search&seid={seid}'
    # 构建请求头
        headers = {
            'origin': 'https://www.bilibili.com/',
            'range': 'bytes=0-1198620',
            'referer': url,
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36 Edg/85.0.564.63'
        }
    # 麻烦的问题来了,请求的url去哪弄?
        #翻了好多博客 得到讲解
        # bilibili的视频请求都是由很多带有m4s的接口返回的,而且有内容长度,区分音频和视频
        #查看网页源代码  可以得到视频和音频的url
        # bilibili视频是视频和音频拆开组合的
        html = sessions.get(url, headers=headers).text
        json_data = re.findall('window.__playinfo__=(.*?)</script>', html)[0]
        video = json.loads(json_data)['data']['dash']['video'][0]['baseUrl'] #视频地址
        audio = json.loads(json_data)['data']['dash']['audio'][0]['baseUrl'] #音频地址
        print('正在下载:%s' % title)
        # 下载图片
        ir_video = sessions.get(video, headers=headers)
        ir_audio = sessions.get(audio, headers=headers)

        # 写入文件
        open(path + "\%s【%s】.flv" % (title,author), 'wb').write(ir_video.content)
        open(path + "\%s【%s】.mp3" % (title,author), 'wb').write(ir_audio.content)
        print('下载完成:%s' % title)

if __name__=='__main__':
    dataList=getVideosUrl('原神',1)
    getVideo(dataList,r'C:\Users\zxy\Desktop\video')

    '''
    参考博客:https://blog.csdn.net/qq_44700693/article/details/108828909?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-16.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-16.control
    '''
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值