解决requests.get()方法返回代码与浏览器Elements选项卡不一致的问题。

解决requests.get()方法返回代码与浏览器Elements选项卡不一致的问题

疫情期间无聊,玩起了Python爬虫,正好舍友让我帮忙下载一个知乎视频。这里附上链接。
美版《黄金单身汉》拟音

网站本身的源码很简单。我们查看一下网页源代码。
Alt
可以看到代码很简单,而且可以看到里面的一些js链接,网站可能使用js渲染过的。
接下来开始爬取。

爬取的时候问题来了,用requests.get()方法返回的代码和上述图片的代码一摸一样。< body>体里面没有我们需要的图片链接。

这时候我们打开浏览器的开发者工具(F12),我们查看Elements选项如图:

Alt

可以看到< body>体里面有一个< player>块,里面有我们需要的链接。如果单纯的想爬取这个视频的话直接用这个url就可以爬取了。但是因为我想让代码对这一类知乎视频实现通用,所以不打算这么简单的解决他。
这个时候我们我们继续使用开发者工具,单击NetWork选项卡,再F5刷新一下:
Alt

可以看到,XHR选项地下出现一个项目,这个项目就是客户端与服务器交互的一些请求,可以从Headers中看到,我们实际请求的网页是:(https://lens.zhihu.com/api/v4/videos/1021147135768739840)
我们打开这个网页,可以看到以下内容:

Alt

这也与Preview吻合:
Alt
这里面包含了我们想要的url。这时候事情就好办了,就需要我们构造一个新的URL即可。
下面附上源代码:

import requests
import re
from pyquery import PyQuery as pq
import json
def get_one_page(url):
	headers = {
		'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
		'Cookie':'_zap=94e62f81-9dff-41c8-b789-8e7da03b8310; d_c0="AHBXdsNr8hCPTphuCGvxCc2tiruyyDqN-zk=|1583926501"; _ga=GA1.2.1112418091.1583926507; _xsrf=2aX6SRa8ojST45sW1VfvaoxDWfMQIIZQ; _gid=GA1.2.1773600815.1584534784; capsion_ticket="2|1:0|10:1584534831|14:capsion_ticket|44:MmNlZDc0NDExMmNlNGQ4ZWE2MjUxMTNjMjU4YTYxY2I=|c3657196344c2fc4f99cc6f71fc66cb46023bc3f31259ccf46d36976a8ce41f0"; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1583927052,1584534783,1584536697; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1584536697; KLBRSID=031b5396d5ab406499e2ac6fe1bb1a43|1584537979|1584535704'
		
			}
	response = requests.get(url,headers=headers,verify=False)
	
	if response.status_code == 200:
		return response
	return None
	
	
def main():
	base_url = 'https://lens.zhihu.com/api/v4/videos/'#这个网址是通过分析得到,这一类视频的url都有一样的前缀。
	url='https://video.zhihu.com/video/1021147135768739840' #要爬取的《黄金单身汉》的网址
	appurl = re.match('^https://.*?(\d+)',url).group(1)  #提取出最后的数字1021147135768739840
	realurl = base_url+appurl  #拼接成真实的请求网址:https://lens.zhihu.com/api/v4/videos/1021147135768739840
	html = get_one_page(realurl)#获取到真实网址的源代码,里面包含我们想要下载的视频的目的url
	url1 = json.loads(html.text) 
	player_url = url1['playlist']['LD']['play_url'] #得到视频的url
	
	vidio = get_one_page(player_url)#爬取视频
	
	with open('vidio.mp4','wb') as file:
		file.write(vidio.content)
	
	print('OK')
	
	
main()

这里我用正则表达式提取出了通用的网址,最后构造成了我们最终想要的网址。
appurl提取的就是网址最后的一串数字,url就是最开始的网址,最后构造出了一个通用的新的url。返回的内容我们把他构造成一个序列化对象,最后提取出想要的最终的视频网址。然后再爬取。最后用open()方法保存到本地。
附上另一个需要爬取的网址:
(https://video.zhihu.com/video/1214248893854486528)
以上代码对这样的知乎视频链接通用。

最后总结一下,当爬取的网页代码和你想象的不一样时,要去分析浏览器对服务器的请求过程,最后再用爬虫模拟,这样就能得到你想要的代码了。

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值