您现在的位置是:首页 > 文章详情

分析Ajax爬取B站python视频

日期:2018-08-21点击:632

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 你可以去找找,还真是没有。
至于怎么找到的呢,我也是摸索了好长时间才发现


img_099aef64506c4395b4653874ac0aa308.png
图片

点一下搜索,这个 url 才会出现,或者点一下下一页


img_4468de5488e8a7f5ca21dfd8c7eefd68.png
详情

然后就构造这个请求就可以了。
需要注意的是最后一个参数不能添加。

代码实战

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 

综上就是这次的全部内容,多加练习继续加油!

原文链接:https://yq.aliyun.com/articles/647997
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章