从网页抓取视频(:刷新网页-不难发现我们要获取的数据全在)
优采云 发布时间: 2022-01-01 03:19从网页抓取视频(:刷新网页-不难发现我们要获取的数据全在)
一:一一搜索+获取页数
要搜索的东西很多,所以我们把所有的选项放在一个列表中,然后一一抓取。以搜索'resume'为例,我们发现有不止一个页面,每个页面的url都有一定的规则,第一页后page=1,第二页后page=2...所以你知道。
我们可以先得到总页数,然后爬取每页的视频信息。
keywords = ['简历','简历模板','面试','实习','找工作','笔试','职场']
for keyword in keywords:
url_keyword = 'https://search.bilibili.com/all?keyword=%s'%keyword
#获取每一个问题的页数
text_keyword = requests.get(url_keyword,handers).content.decode('utf-8')
pages = re.findall(r'(.*?)',text_keyword,re.DOTALL)[0]
#去除没必要的东西
pages = re.sub(r'\n','',pages)
pages = int(re.sub(r' ', '', pages))
二:获取视频信息
我第一次做的时候,用和之前一样的方法,直接访问视频的链接。结果经过测试,什么也没发现。这时候就要注意了,视频网页是动态网页,不能使用过去的静态网页方式,所以我们必须抓包获取数据。
查看网页-网络-刷新网页-不难发现我们想要获取的数据都在view里面?cid=...这个包
该包的链接是标题中的通用请求 URL。这是我们获取数据的链接。我们很容易通过json找到数据
text = requests.get(url).content.decode('utf-8')
content = json.loads(text)
print('视频名字:',content['data']['title'])
print('作者:',content['data']['owner']['name'])
print('视频简介:',content['data']['desc'])
print('视频号:','av'+str(content['data']['stat']['aid']))
print('播放量:',content['data']['stat']['view'])
print('*敏*感*词*数:',content['data']['stat']['coin'])
print('分享数:',content['data']['stat']['share'])
print('点赞数:',content['data']['stat']['like'])
三:数据存储
这个不用解释了,用open就可以了。需要注意的是,根据不同的搜索创建不同的文件。我没有聪明的办法。我只能分两步完成。
第一步:创建文件并写入标题
#写入标题
with open('%s.csv'%keyword, 'w', encoding='utf-8', newline='')as fp:
write = csv.writer(fp)
write.writerow(title)
fp.close()
第 2 步:写入数据
#写入数据
with open('%s.csv'%self.keyword,'a',encoding='utf-8',newline='')as fp:
write = csv.writer(fp)
write.writerows(self.data_queue.get())#保存数据的queue队列
fp.close()
四:多线程使用
我自己使用生产和消费模型
生产者负责获取数据
消费者有责任保存数据
#生产者
class Producted(threading.Thread):
def __init__(self,url_queue,data_queue,*args,**kwargs):
super(Producted, self).__init__(*args, **kwargs)
self.url_queue = url_queue
self.data_queue = data_queue
def run(self):
while True:
if self.url_queue.empty():
break
url = self.url_queue.get()
self.get_data(url)
#获取所需要的数据
def get_data(self,url):
text = requests.get(url).content.decode('utf-8')
content = json.loads(text)
title = content['data']['title']
author = content['data']['owner']['name']
info = content['data']['desc']
info = re.sub(r'\n','',info)
aid = 'av'+str(content['data']['stat']['aid'])
view = content['data']['stat']['view']
coin = content['data']['stat']['coin']
share = content['data']['stat']['share']
like = content['data']['stat']['like']
self.data_queue.put((title,author,info,aid,view,coin,share,like))
#消费者
class Contident(threading.Thread):
def __init__(self,url_queue,data_queue,keyword,*args,**kwargs):
super(Contident, self).__init__(*args, **kwargs)
self.url_queue = url_queue
self.data_queue = data_queue
self.keyword = keyword
def run(self):
while True:
if self.url_queue.empty() and self.data_queue.empty():
break
print(self.data_queue.get())
title,author,info,aid,view,coin,share,like = self.data_queue.get()
with open('%s.csv'%self.keyword,'a', encoding='utf-8', newline='')as fp:
write = csv.writer(fp)
write.writerows(self.data_queue.get())
fp.close()
要查看完整的代码链接,请转到