网页视频抓取工具 知乎(打开开发者工具,构造对构造url进行循环,和上次的爬取照片思路 )

优采云 发布时间: 2021-12-11 05:22

  网页视频抓取工具 知乎(打开开发者工具,构造对构造url进行循环,和上次的爬取照片思路

)

  ①打开知乎话题

  

  ②打开开发者工具,构造Request url,和上次爬取照片一样()

  

  '''

requests.get()返回的是json

对它进行字典化,好提取键值

'''

from urllib import request

from bs4 import BeautifulSoup

import requests

import re

import json

import math

def getVideo():

m = 0#计数字串个数

num = 0#回答者个数

kv = {'user-agent':'Mozillar/5.0'}

for i in range(math.ceil(783/20)):

url = "https://www.zhihu.com/api/v4/questions/21086211/answers?include=data%5B%2A%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%2A%5D.topics&limit=20&offset="+str(i*20)+"&platform=desktop&sort_by=default"

r = requests.get(url,headers = kv)

dicurl = json.loads(r.text)#转化成python的对象

  ③使用谷歌浏览器的开发者工具JSONview,可以看到打开的url中有一个内容,就是我们要找的答案内容,视频url也在里面

  

  ④ 将返回的json转换为python对象后,获取content中的内容

  content = dicurl["data"][k]["content"]

  ⑤打开获取的内容,找到href后面的url,打开看看

  

  (1)打开后,视频正是我们想要的,但是发现url不是我们得到的%3A//video/9785442,仔细观察发现这个url已经被重定向

  

  (2) 想知道怎么跳转到这里,我们再F12,打开开发者工具,发现请求了一个新的URL

  

  (3),这是视频播放地址,这个地址结构也很好。最后一串数字是不是很熟悉?data-lens-id中的一串数字

  

  (4) 构造这个地址

  ​

videoUrl = "https://lens.zhihu.com/api/v4/videos/"+str(data_lens[j])

  ⑥ 循环构建 URL,然后访问这些 URL,通过 urllib 库和 os 库进行存储,然后贴出所有代码

<p>from urllib import request

from bs4 import BeautifulSoup

import requests

import re

import json

import math

def getVideo():

m = 0#计数字串个数

num = 0#回答者个数

kv = {&#39;user-agent&#39;:&#39;Mozillar/5.0&#39;}

for i in range(math.ceil(783/20)):

try:

url = "https://www.zhihu.com/api/v4/questions/21086211/answers?include=data%5B%2A%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cbadge%5B%2A%5D.topics&limit=20&offset="+str(i*20)+"&platform=desktop&sort_by=default"

r = requests.get(url,headers = kv)

dicurl = json.loads(r.text)

for k in range(20):#每条dicurl里可以解析出20条content数据

name = dicurl["data"][k]["author"]["name"]

ID = dicurl["data"][k]["id"]

question = dicurl["data"][k]["question"]["title"]

content = dicurl["data"][k]["content"]

data_lens = re.findall(r&#39;data-lens-id="(.*?)"&#39;,content)

print("正在处理第" + str(num+1) + "个回答--回答者昵称:" + name + "--回答者ID:" + str(ID) + "--" + "问题:" + question)

num = num + 1 # 每次碰到一个content就增加1,代表回答者人数

for j in range(len(data_lens)):

try:

videoUrl = "https://lens.zhihu.com/api/v4/videos/"+str(data_lens[j])

R = requests.get(videoUrl,headers = kv)

Dicurl = json.loads(R.text)

playurl = Dicurl["playlist"]["LD"]["play_url"]

#print(playurl)#跳转后的视频url

videoread = request.urlopen(playurl).read()

print(">>>>>>>>>>>>>>>>>第---" + str(m+1) + "---个视频下载完成

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线