从网页抓取视频(:刷新网页-不难发现我们要获取的数据全在)

优采云 发布时间: 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()

  要查看完整的代码链接,请转到

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线