分析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条评论来说两句吧...