获取网页源代码
我们设置的关键字 为‘人’,第一步获取源代码函数里面有一些捕获异常的操作和用户代理,主要是为了顺利获取。
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()
大功告成