B站爬虫之-----梨视频

前言:

      今天开始正式写博客,因为在自学的时候经常碰到以前解决的bug和疑难,时间一长又会碰到,反复去解决以前遇到的坑,太浪费时间了;写自己自学总结的东西和感悟,这样也知道自己学到了什么,还有什么东西没有去解决,相信对自己的技术能有一个比较大的提升。                                                                                                                                                             2020.8.16                                   

 

                                            B站爬虫之-----梨视频

今天在B站上看的一个老师讲的Xpath神器,并且做了个小实例,了解到了Xpath的强大!

首先,要想使用xpath,就得导入进来: from lxml import etree 

B站爬虫之-----梨视频

出现不能识别的:加上/text()就可以了

  B站爬虫之-----梨视频   完美显示!

       如果用:res_xpath.xpath('//*[@id="listvideoListUl"]/li'),因为是 *,所有从解析的网页全部中去寻找,效率比较慢,可以找到所属的上级:ul    res_xpath.xpath('//ul[@id="listvideoListUl"]/li')

因为我要下载的是属于《科技》类目的四个视频,它们属于<li class="categoryem ">,一共有四个,用xpath提取出来的就是这样的:

B站爬虫之-----梨视频
 但是用/text()解析出来的是这样的!

B站爬虫之-----梨视频这其实是有内容的,只不过需要再一次的提取(二级提取)  @+属性,精准定位

B站爬虫之-----梨视频

完美提取!哈哈哈

B站爬虫之-----梨视频

其中 urls得到拼接的网址,是视频所在网页的链接;

pattern是用正则表达式来提取视频的链接,可以把链接写入文件,下载视频srcUrl="https://video.pearvideo.com/mp4/third/20200814/cont-1691796-10008579-134355-hd.mp4"

用‘srcUrl=“(.*?)”’来精准匹配

用List.append(src)把得到的网址写入List=[]列表

B站爬虫之-----梨视频

把视频的名字写入list_name=[]列表

B站爬虫之-----梨视频

if not os.path.exists(dir_name):就是查看是否存在dir_name命名的文件,如果没有的话就os.mkdir(dir_name)来创建一个以dir_name命名的文件

B站爬虫之-----梨视频

因为我想把下载的视频命名相应的名字,想了个办法就是嵌套循环,但是是错的,本来是四个视频但结果是16个,是把四个一样的视频下载-->覆盖,重复执行,想了很久终于查到了解决方法!

在一个for循环中遍历两个列表

B站爬虫之-----梨视频

Python3中的zip函数可以把两个或者两个以上的迭代器封装成生成器,这种zip生成器会从每个迭代器中获取该迭代器的下一个值,然后把这些值组装成元组(tuple)。这样,zip函数就实现了平行地遍历多个迭代器。

我用zip能成功是因为两个列表一样的!但是

如果输入的迭代器长度不同,那么,只要有一个迭代器遍历完,zip就不再产生元组了,zip会提前终止,这可能导致意外的结果,不可不察。如果不能确定zip所封装的列表是否等长,可以改用 itertools 内置模块中的zip_longest 函数,这个函数不在乎它们的长度是否相等。

在一个for循环中遍历两个列表用zip,真香!

with open(dir_name+"/"+video_name,'wb') as f: 其中dir_name 是文件名,+/ 是可以在这个文件下写入数据,video_name是我们的视频名称,wb是以二进制的方式写入。

如果取文本,可以通过.text。

如果取图片和文件,则可以通过.content

这个是成果截图:

B站爬虫之-----梨视频
       

 

以下是整个项目的源码

import requests
import re
from lxml import etree 
import time
import os
url="https://www.pearvideo.com/category_8"
response=requests.get(url)
html=response.text
res_xpath=etree.HTML(html)
list=res_xpath.xpath('//ul[@id="listvideoListUl"]/li')

List=[]
List_name=[]
for li in list:
    
    #print("https://www.pearvideo.com/"+li.xpath('.//a[@class="vervideo-lilink actplay"]/@href')[0])
    urls="https://www.pearvideo.com/"+li.xpath('.//a[@class="vervideo-lilink actplay"]/@href')[0]
    res_new=requests.get(urls)
    res_new.encoding="utf-8"
    html_data=res_new.text
    #print(html_data)
    pattern='srcUrl="(.*?)"' 
    src=re.findall(pattern,html_data,re.S)
    List.append(src)
    #print(List[0][0])

#获取下载视频的名字
pattern_name=res_xpath.xpath('//*[@id="listvideoListUl"]/li/div/a/div[2]/text()')
list_name=[]
for name in pattern_name:  
    list_name.append(name)
#print(list_name)
for i in list_name:
    print(i)

dir_name="梨视频"
if not os.path.exists(dir_name):
    os.mkdir(dir_name)
    
for i ,j in zip(List,list_name) :
    print(j)
    print(i)
        
    video_name=j+".mp4"
    print(i[0])

    vedio_url=requests.get(i[0])
    with open(dir_name+"/"+video_name,'wb') as f:
        time.sleep(2)
        f.write(vedio_url.content)