'''
思路:
首先打开百度图片 搜索一个关键字
然后打开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):
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:
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:
for i in list:
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:
urls.append(sessions.get(url,params=i,allow_redirects=True).json().get('data'))
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:
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')
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'
}
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
'''