网页视频抓取脚本(【干货】以免误人子弟的网址仅供交流学习使用,请联系删除)
优采云 发布时间: 2021-11-17 19:15网页视频抓取脚本(【干货】以免误人子弟的网址仅供交流学习使用,请联系删除)
前言:因为我在python世界还是个小学生,还有很多路要走,所以本文以目的为指导,以达到目的。对于那些我不明白的原理,我不想做太多的解释。以免误导他人,可以上网搜索。
友情提示:本代码中使用的网址仅供交流学习使用。如有不对请联系删除。
背景:我有一台电脑供我父亲使用。爸爸喜欢看一些大片,但是家里的网络环境不好,所以想批量下载一些,保存到电脑里。不过现在的网站大多是这样的,
需要到一处才能看到下载地址
如果我想下载100部电影,我的手肯定是断了,所以我想把这些地址拿出来,让迅雷批量下载。
工具:python(版本3.x)
爬虫原理:网页源代码中收录下载地址。将这些分散的地址批量保存在文件中,方便使用。
干货:先上传代码,等不及的可以先运行一下,再看详细介绍。
import requests
import re
#changepage用来产生不同页数的链接
def changepage(url,total_page):
page_group = ['https://www.dygod.net/html/gndy/jddy/index.html']
for i in range(2,total_page+1):
link = re.sub('jddy/index','jddy/index_'+str(i),url,re.S)
page_group.append(link)
return page_group
#pagelink用来产生页面内的视频链接页面
def pagelink(url):
base_url = 'https://www.dygod.net/html/gndy/jddy/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
req = requests.get(url , headers = headers)
req.encoding = 'gbk'#指定编码,否则会乱码
pat = re.compile('<a href="/html/gndy/jddy/(.*?)" class="ulink" title=(.*?)/a>',re.S)#获取电影列表网址
reslist = re.findall(pat, req.text)
finalurl = []
for i in range(1,25):
xurl = reslist[i][0]
finalurl.append(base_url + xurl)
return finalurl #返回该页面内所有的视频网页地址
#getdownurl获取页面的视频地址
def getdownurl(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
req = requests.get(url , headers = headers)
req.encoding = 'gbk'#指定编码,否则会乱码
pat = re.compile('<a href="ftp(.*?)">ftp',re.S)#获取下载地址
reslist = re.findall(pat, req.text)
furl = 'ftp'+reslist[0]
return furl
if __name__ == "__main__" :
html = "https://www.dygod.net/html/gndy/jddy/index.html"
print('你即将爬取的网站是:https://www.dygod.net/html/gndy/jddy/index.html')
pages = input('请输入需要爬取的页数:')
p1 = changepage(html,int(pages))
with open ('电影天堂下载地址.lst','w') as f :
j = 0
for p1i in p1 :
j = j + 1
print('正在爬取第%d页,网址是 %s ...'%(j,p1i))
p2 = pagelink(p1i)
for p2i in p2 :
p3 = getdownurl(p2i)
if len(p3) == 0 :
pass
else :
finalurl = p3
f.write(finalurl + '\n')
print('所有页面地址爬取完毕!')
核心模块getdownurl功能:通过requests获取页面信息,可以认为这个信息的正文就是页面源代码(几乎任何浏览器右键都有查看页面源代码的选项),然后通过堆规则表达式匹配方法匹配到网页源代码的URL部分,可以看下图
如何提取这部分?通过正则表达式匹配。这个正则表达式怎么写?这里使用了一个简单粗暴的方法:
FTP
爬虫经常使用 .*? 做非贪婪匹配(专业术语请百度),你可以简单的认为这个(.*?)代表的是你要爬出来的东西,而这样的东西在每个网页的源代码里都是夹在">ftp 和">ftp 之间。可能有人会问,那这个匹配不是URL。比如上图中的那个是://d::12311/[电影天堂]请用你的名字叫我BD中英文双字.mp4,前面少了一个ftp?
是的,但这是故意的。如果正则表达式写成ftp,可能夹在和">ftp之间的东西太多了,二次处理的成本还不如你认为的最快最直接的方式提取有用信息,然后拼接起来很快。
详细代码:
一、getdownurl
#getdownurl获取页面的视频地址
def getdownurl(url):
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
req = requests.get(url , headers = headers)
req.encoding = 'gbk'#指定编码,否则会乱码
pat = re.compile('<a href="ftp(.*?)">ftp',re.S)#获取下载地址
reslist = re.findall(pat, req.text)
furl = 'ftp'+reslist[0]
return furl
headers 用于将您的脚本访问 URL 伪装成浏览器访问,以防某些 网站 采取了反爬虫措施。在许多浏览器中也可以轻松获取此标头。以Firefox为例,直接F12或者查看元素,在网络标签右侧的消息头右下角可以看到。
requests模块:requests.get(url , headers = headers)是用伪装成firefox的形式获取该网页的信息。
re模块:可以参考python正则表达式的一些东西,这里用re.complile来写出匹配的模式,re.findall根据模式在网页源代码中找到相应的东西。
二、pagelink
#pagelink用来产生页面内的视频链接页面
def pagelink(url):
base_url = 'https://www.dygod.net/html/gndy/jddy/'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36'}
req = requests.get(url , headers = headers)
req.encoding = 'gbk'#指定编码,否则会乱码
pat = re.compile('<a href="/html/gndy/jddy/(.*?)" class="ulink" title=(.*?)/a>',re.S)#获取电影列表网址
reslist = re.findall(pat, req.text)
finalurl = []
for i in range(1,25):
xurl = reslist[i][0]
finalurl.append(base_url + xurl)
return finalurl #返回该页面内所有的视频网页地址
第一步getdownurl用于抓取一个网页的网址,这一步用于获取同一页面内所有网页的网址,比如下面的网页收录很多电影链接
源代码是这样的:
聪明,你一眼就知道需要什么信息。此页面的正文中有 25 个电影链接。我在这里使用一个列表来存储这些 URL。其实range(1,25)不收录25,也就是说我只存了24个url。原因是我的正则表达式写得不好,爬出来的第一个url有问题。如果你有兴趣,你可以研究如何改进它。
需要说明的是,这个正则表达式用到了两个地方。*?,所以匹配的 reslist 是二维的。
三、更改页面
#changepage用来产生不同页数的链接
def changepage(url,total_page):
page_group = ['https://www.dygod.net/html/gndy/jddy/index.html']
for i in range(2,total_page+1):
link = re.sub('jddy/index','jddy/index_'+str(i),url,re.S)
page_group.append(link)
return page_group
这里也比较简单。点击下一页,查看网址栏的网址是什么。这里是index/index_2/index_3...拼接起来很容易。
四、主要
if __name__ == "__main__" :
html = "https://www.dygod.net/html/gndy/jddy/index.html"
print('你即将爬取的网站是:https://www.dygod.net/html/gndy/jddy/index.html')
pages = input('请输入需要爬取的页数:')
p1 = changepage(html,int(pages))
with open ('电影天堂下载地址.lst','w') as f :
j = 0
for p1i in p1 :
j = j + 1
print('正在爬取第%d页,网址是 %s ...'%(j,p1i))
p2 = pagelink(p1i)
for p2i in p2 :
p3 = getdownurl(p2i)
if len(p3) == 0 :
pass
else :
finalurl = p3
f.write(finalurl + '\n')
print('所有页面地址爬取完毕!')
main里面几乎没什么可说的,反正就是循环读取,然后写入文件。
五、运行和结果
然后迅雷就可以直接导入了。(后缀是downlist或者lst迅雷可以直接导入)
后记:可能有人觉得这样集思广益下载所有电影,可能有些电影太烂,下载浪费时间和资源,人工筛选太麻烦,然后电影的信息会存入数据库筛选出所需的地址。