python之 正则+pyquery 爬取飞碟说所有视频并下载

版权声明:为NH4L所有,转载请注明 https://blog.csdn.net/LeeGe666/article/details/81608810

获取网页源代码

我们设置的关键字 为‘人’,第一步获取源代码函数里面有一些捕获异常的操作和用户代理,主要是为了顺利获取。

import requests
from requests.exceptions import RequestException
def get_html(url):
    headers = {"user-agent": "Mizilla/5.0"}
    response = requests.get(url,headers=headers)
    try:
        if response.status_code == 200:
            return response.text
        else:
            return None
            print('访问有误')
    except RequestException:
        return None
 def main():
    keyword = '人'
    keyword = urllib.parse.quote(keyword)       # 中文转码为url格式
    url = 'http://www.feidieshuo.com/search/query?searchStr='+keyword
    html = get_html(url)
if __name__ == '__main__':
    main()

获取视频的基本信息

名字,路径,播放数,回复数,使用pyquery实现的

def get_video_url(html):
    doc = pq(html)
    items = doc('#pbody .list-video .clearfix .infi_scroll').items()
    for item in items:
        video = {
            'name':item.find('.outer .cnt .t').text(),
            'url' :item.find('.outer').attr('href'),
            'view':item.find('.outer .cnt .fun span').eq(0).text(),
            'comments':item.find('.outer .cnt .fun span').eq(1).text()
        }
        video = eval(re.sub(r'\\n','',str(video))) #把其中的\n去除掉,因为他有很多换行符也保留下来了
        print(video)

这仅仅是获取的第一页的内容,但是还有很多页,怎么办呢
翻页!!!!我们就用上面写好的第一个get_html()方法,发现没用,报错,怎么回事呢,看图这里写图片描述这里写图片描述

第一张是在控制台审查元素找到的代码,第二张是右键查看源代码的代码,怎么回事呢,ul标签以及他的字标签li怎么都不见了,原来是他们是由js生成的,这就是为什么获取源代码后看不到了,所以我们新建一个方法:调用phantomjs,这是一个很有用解析js的工具,利用它和selenuim就可以把它的源代码解析出来,拥有li标签,我们直接获取他有多少页,这里直接用正则就可以了,用compile方法匹配一下就行了。方法返回的是一个总页数。

def get_total_page(keyword):
    url = 'http://www.feidieshuo.com/search/query?searchStr=' + keyword
    driver = webdriver.PhantomJS(executable_path='D:\\Program Files\\phantomjs-2.1.1-windows\\bin\\phantomjs')  # phantomjs的绝对路径
    driver.get(url)  # 获取网页
    html = driver.page_source
    request = re.compile('">(\d+)</a></li></ul>')
    playerurl = int(re.findall(request, html)[0])
    return playerurl

下面在main方法中用循环就可以把你搜索的所有视频信息获取到了,

total_page = get_total_page(keyword)
    for page in range(1,total_page + 1):
        next_page_url = 'http://www.feidieshuo.com/search/query?searchStr='+keyword + '&page={}'.format(page)
        get_video_url(get_html(next_page_url))

拼接视频

光获取视频信息是不够的,我们还要将视频下载下来,当然视频是可以自己手动下载的,自己手动下载肯定累啊,那要怎么下载呢,他 的关键步骤就是获取他的播放地址,我们在刚刚的视频信息中,知道了这个地址是这个视频的网址,但是得到的只是像**“/media/play/5209”这种路径不全,我们用把它拼接起来**:parse_url 就是视频播放网页的路径

basic_url = 'http://www.feidieshuo.com'
video = eval(re.sub(r'\\n','',str(video)))
parse_url = basic_url + video['url']

找到视频播放地址

获取了视频播放网址的地址后,我们审查元素找到视频框播放的原地址:src中的就是视频的播放地址,发现又出现了刚刚一样的情况,源代码里面没有这段代码,这一段是由js加载出来
这里写图片描述这里写图片描述
这次我们使用另一种方法,既然他不给我html的代码,那js的不也在源代码里吗,上面的videourl不也有视频的播放地址吗,我们就用正则把它解析出来,只不过,他不是完全给出来的,上面有些引号什么的,不是很完整,那也没事,我们创建一个方法来解析他

def get_parse_vedio(html):
    request = re.compile('videourl:"(.*?)",')
    playerurl = re.findall(request, html)[0]
    playerurl = re.sub(r'"','',playerurl)
    playerurl = re.sub(r'\+', '',playerurl)
    return playerurl 

在刚刚的get_video_url的循环中调用这个方法,可以看到播放地址就齐刷刷的出来了:
这里写图片描述
我做到这的时候,看到地址已经出来了,心里想着还完了吧,其实做到后面的下载工作的时候,一直给我报错,我才反应过来,含有中文路径,输入到浏览器可以识别,但是用代码下载的时候,用的可是python.exe,他可没有浏览器那么厉害,必须将所有中文转化为可识别的才行,行动吧:利用urllib中的parse.quote方法,能把中文改成基本的url标准格式,这样才是真正的播放地址,才能下载:

def get_parse_vedio(html):
    request = re.compile('videourl:"(.*?)",')
    playerurl = re.findall(request, html)[0]
    playerurl = re.sub(r'"','',playerurl)
    playerurl = re.sub(r'\+', '',playerurl)

    reg1 = urllib.parse.quote(re.search('mp4/(.*?)/.*?mp4',playerurl).group(1))
    reg2 = urllib.parse.quote(re.search('mp4/.*?/(.*?).mp4',playerurl).group(1))
    true_url = 'http://video.feidieshuo.com/mp4/' + reg1 + '/' + reg2 + '.mp4'
    return true_url

下载视频

利用一个简单的urlretrieve就可以完成下载了,名字是上面信息中获取过来的,这个一定要把路径修改好,改成你自己的设置的一个,路径不对的话,就只能下载出错了,当然要在获取get_video_url()方法中的循环中调用,

#省略·······································
      download_vedio(playurl,video['name'])
def download_vedio(url,name):
    file_path = r'D:\python Projects\pyDownloadPictrues\18-8-12\{}.mp4'.format(name)
    if not os.path.exists(file_path):
        print('正在下载:',name,url)
        urllib.request.urlretrieve(url,file_path)
        print('ok!!!!!!!!!')
    else:
        print('下载出错')

现在我提出所有代码,就可以获取你搜索字段的视频了,所有的视频–搜索飞碟说就可以了,有127页,一键该网站上的所有视频就都到手了。

完整代码

import requests
from requests.exceptions import RequestException
import urllib
from pyquery import PyQuery as pq
import re
from selenium import webdriver
import os

basic_url = 'http://www.feidieshuo.com'

def get_html(url):
    headers = {"user-agent": "Mizilla/5.0"}
    response = requests.get(url,headers=headers)
    try:
        if response.status_code == 200:
            return response.text
        else:
            return None
            print('访问有误')
    except RequestException:
        return None

def get_video_url(html):
    doc = pq(html)
    items = doc('#pbody .list-video .clearfix .infi_scroll').items()
    for item in items:
        video = {
            'name':item.find('.outer .cnt .t').text(),
            'url' :item.find('.outer').attr('href'),
            'view':item.find('.outer .cnt .fun span').eq(0).text(),
            'comments':item.find('.outer .cnt .fun span').eq(1).text()
        }
        video = eval(re.sub(r'\\n','',str(video)))
        parse_url = basic_url + video['url']
        html = get_html(parse_url)
        playurl = get_parse_vedio(html)
        print(playurl)
        download_vedio(playurl,video['name'])

def get_parse_vedio(html):
    request = re.compile('videourl:"(.*?)",')
    playerurl = re.findall(request, html)[0]
    playerurl = re.sub(r'"','',playerurl)
    playerurl = re.sub(r'\+', '',playerurl)

    reg1 = urllib.parse.quote(re.search('mp4/(.*?)/.*?mp4',playerurl).group(1))
    reg2 = urllib.parse.quote(re.search('mp4/.*?/(.*?).mp4',playerurl).group(1))
    true_url = 'http://video.feidieshuo.com/mp4/' + reg1 + '/' + reg2 + '.mp4'
    return true_url

def get_total_page(keyword):
    url = 'http://www.feidieshuo.com/search/query?searchStr=' + keyword
    driver = webdriver.PhantomJS(executable_path='D:\\Program Files\\phantomjs-2.1.1-windows\\bin\\phantomjs')  # phantomjs的绝对路径
    driver.get(url)  # 获取网页
    html = driver.page_source
    request = re.compile('">(\d+)</a></li></ul>')
    playerurl = int(re.findall(request, html)[0])
    return playerurl

def download_vedio(url,name):
    file_path = r'D:\python Projects\pyDownloadPictrues\18-8-12\{}.mp4'.format(name)
    if not os.path.exists(file_path):
        print('正在下载:',name,url)
        urllib.request.urlretrieve(url,file_path)
        print('ok!!!!!!!!!')
    else:
        print('下载出错')

def main():
    keyword = '人'
    keyword = urllib.parse.quote(keyword)       # 中文转码为url格式
    total_page = get_total_page(keyword)
    for page in range(1,total_page + 1):
        next_page_url = 'http://www.feidieshuo.com/search/query?searchStr='+keyword + '&page={}'.format(page)
        get_video_url(get_html(next_page_url))

if __name__ == '__main__':
    main()

大功告成

猜你喜欢

转载自blog.csdn.net/LeeGe666/article/details/81608810
今日推荐