B 站真是个神奇的网站。找不到资料了,去 B 站逛一逛,保准有你满意的东西。html
前几天写了个爬虫,用 path、re、BeautifulSoup 爬取的 B 站 python 视频,可是这个爬虫有有个缺陷,没能获取视频的图片信息,若是你去尝试你会发现它根本就不在返回的结果里面。今天就用分析 Ajax 的方法获取到。python
一般咱们在分析页面的时候,都要切换到 Network 分析url 从中找到咱们想要的 url 。可是找不到 url 你怎么分析?B 站就是这么神奇的存在,咱们最后分析肯定的 url 是这个:web
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 你能够去找找,还真是没有。
至于怎么找到的呢,我也是摸索了好长时间才发现正则表达式
图片json
点一下搜索,这个 url 才会出现,或者点一下下一页
api
详情curl
而后就构造这个请求就能够了。
须要注意的是最后一个参数不能添加。ide
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工具
时间戳转换成标准格式的时间
第一种方法
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
综上就是此次的所有内容,多加练习继续加油!