网页视频抓取脚本(【干货】以免误人子弟的网址仅供交流学习使用,请联系删除)

优采云 发布时间: 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

  爬虫经常使用 .*? 做非贪婪匹配(专业术语请百度),你可以简单的认为这个(.*?)代表的是你要爬出来的东西,而这样的东西在每个网页的源代码里都是夹在"&gt;ftp 和"&gt;ftp 之间。可能有人会问,那这个匹配不是URL。比如上图中的那个是://d::12311/[电影天堂]请用你的名字叫我BD中英文双字.mp4,前面少了一个ftp?

  是的,但这是故意的。如果正则表达式写成ftp,可能夹在和"&gt;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迅雷可以直接导入)

  后记:可能有人觉得这样集思广益下载所有电影,可能有些电影太烂,下载浪费时间和资源,人工筛选太麻烦,然后电影的信息会存入数据库筛选出所需的地址。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线