分析Ajax爬取B站python视频
B 站真是个神奇的网站。找不到资料了,去 B 站逛一逛,保准有你满意的东西。
前几天写了个爬虫,用 path、re、BeautifulSoup 爬取的 B 站 python 视频,但是这个爬虫有有个缺陷,没能获取视频的图片信息,如果你去尝试你会发现它根本就不在返回的结果里面。今天就用分析 Ajax 的方法获取到。
分析页面
通常我们在分析页面的时候,都要切换到 Network 分析url 从中找到我们想要的 url 。但是找不到 url 你怎么分析?B 站就是这么神奇的存在,我们最后分析确定的 url 是这个:
url = 'https://api.bilibili.com/x/web-interface/search/type?jsonp=jsonp&&search_type=video&highlight=1&keyword=python&page={}'.format(page)
打开 B 站,搜索 python ,打开开发者工具,切换到 Network 你可以去找找,还真是没有。
至于怎么找到的呢,我也是摸索了好长时间才发现
点一下搜索,这个 url 才会出现,或者点一下下一页
然后就构造这个请求就可以了。
需要注意的是最后一个参数不能添加。
代码实战
import requests
import json,re,time
import pandas as pd
from requests.exceptions import RequestException
class Spider():
def get_page(self,page):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'
' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
}
url = 'https://api.bilibili.com/x/web-interface/search/type?jsonp=jsonp&&search_type=video&highlight=1&keyword=python&page={}'.format(page)
r = requests.get(url,headers)
if r.status_code == 200:
return r.text
else:
print(r.status_code)
except RequestException:
print('请求失败')
return None
def parse_page(self,html):
#转换成JSON对象,好操作
data = json.loads(html)
results = data.get('data').get('result')
for result in results:
#获取图片地址
image_url = result['pic']
#获取视频地址
video_url = result['arcurl']
#获取作者
video_author = result['author']
#获取视频标题,中间有额外的字符,用re替换一下
video_title = result['title']
video_title = re.sub('<em class="keyword">[Pp]ython</em>','Python',video_title)
#获取播放量
video_play = result['play']
#获取上传时间,这里将时间戳转换成标准格式
video_date = result['pubdate']
timestr = time.localtime(video_date)
video_date = time.strftime('%Y-%m-%d %H-%M-%S',timestr)
print(image_url,video_url,video_title,video_play,video_date)
def run(self):
for i in range(1,3):
html = self.get_page(i)
self.parse_page(html)
def main():
spider = Spider()
spider.run()
if __name__ == '__main__':
main()
代码里面有些解释已经很清楚了,在这里再次复习一下
re.sub()
这个函数传入五个参数,前三个是必须传入的 pattern,、repl、 string
- 第一个是表示的是正则表达式中模式字符串
- 第二个是要被替换的字符串
- 第三个是文本字符串
剩下两个可选参数,一个是 count 一个是 flag 。
时间戳转换成标准格式的时间
第一种方法
import time
timeStamp = 1581418600
timeArray = time.localtime(timeStamp)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
print otherStyleTime
第二种方法
import time
import datetime
timeStamp = 1381419600
dateArray = datetime.datetime.utcfromtimestamp(timeStamp)
otherStyleTime = dateArray.strftime("%Y-%m-%d %H:%M:%S")
print otherStyleTime
综上就是这次的全部内容,多加练习继续加油!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Python 系统编程 (全)
进程 1.进程 简单的说就是实现唱歌跳舞同时进行,那么就需要一个新的方法,叫做:多任务 2.多任务的概念 ①简单地说,就是操作系统可以同时运行多个任务 ②并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行 ③就是说当cpu核心数量大于任务数量就是并行,反过来,就是并发 ④依照的规则有时间片轮转,优先级调度 3.进程的创建-fork ①程序:编写完毕的代码,在没有运行的时候,称之为程序 ②进程:正在运行着的代码,还有需要运行的环境等 ③fork( ): Python的os模块封装了常见的系统调用,其中就包括fork importos #注意,fork函数,只在Unix/Linux/Mac上运行,windows不可以 pid=os.fork() ifpid==0: print('哈哈1') else: print('哈哈2') #程序执行到os.fork()时,操作系统会创建一个新的进程(子进程),然后复制父进程的所有信息到子进程中 #然后父进程和子进程都会从fork()函数中得到一个返回值,在子进程...
-
下一篇
Python 网络编程 (全)
计算机网络 1.网络分层 ①(DoD模型):链路层(网络接口层),网络层(网际层),传输层,应用层 ②(OSI开放互联模型):物理层,数据链路层,网络层,传输层,会话层,表示层,应用层 2. OSI参考模型 ①应用层:提供用户接口,特指网络应用程序,能产生网络流量的应用程序 ②表示层:表示数据,如采用二进制或ASCII等,处理数据,如数据加密,数据压缩等 ③会话层:会话层的作用主要是建立,维护,管理应用程序之间的会话 ④传输层:提供可靠或不可靠的传输,能够错误纠正,纠正失败能够重传 ⑤网络层:为网络设备提供逻辑地址,根据数据包的逻辑地址选择最佳网络路径 ⑥数据链路层:常被称为MAC层,它管理网络设备的物理地址,所以物理地址也称为MAC地址 ⑦物理层:主要负责二进制数据比特流在设备之间的传输 3. 数据封装 数据在传输层添加源端口和目标端口,我们称之为数据段或消息,可靠传输称为数据段,不可靠传输称为消息.在网络层会为数据段或消息添加目标地址和源地址,称为数据包.数据包在数据链路层添加了目标MAC地址,源MAC地址和帧校验序列(FCS)数据帧. 注意:数据包包括数据,端口,IP地址.数据...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题