python爬虫--爬取某网站电影下载地址

前言:因为自己还是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来获取页面信息,可以认为这个信息的text就是页面源代码(几乎任何一款浏览器右键都有查看网页源代码的选项),再通过re.compile正则表达式匹配的方式来匹配到网页源代码中的网址部分,可以看下图

这部分怎么提取呢?通过正则表达式匹配。怎么写这个正则表达式呢?这里用到一个简单粗暴的方法:

<a href="ftp(.*?)">ftp

爬虫中经常用到.*?来做非贪婪匹配(专业名词请百度),你可以简单认为这个(.*?)就代表你想要爬取出来的东西,这样的东西在每个网页源码中都是夹在<a href="ftp和">ftp之间的。有人可能会问,那这个匹配出来的不是网址啊,比如上图中出来的就是://d:[email protected]:12311/[电影天堂www.dy2018.com]请以你的名字呼唤我BD中英双字.mp4,前面少了个ftp啊?

是的,不过这是故意为之,如果正则表达式写成<a href="(.*?)">ftp,可能夹在<a href="和">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是用来将你的脚本访问网址伪装成浏览器访问,以防有些网站进行了反爬虫的措施。这个headers在很多浏览器中也可以很容易得到,以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个电影链接,我这里用到一个list来存放这些网址,其实range(1,25)不包含25,也就是说我只存放了24个网址,原因是我的正则表达式写的不好,爬出来的第一个网址有问题,如果有兴趣可以研究下怎么完善。

需要一提的是这个正则表达式用到了两处.*?,所以匹配到的reslist是二维的。

三、changepage

#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...很容易拼接

四、main

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迅雷可以直接导入)

后记:有些可能会觉得这样一股脑的把电影都下载下来,可能有些电影太烂,下载下来就是浪费时间和资源,而手工筛选又太费事,后续会通过数据库的方式来存储影片的信息,从而筛选出需要的地址。

原文地址:https://www.cnblogs.com/tommy007/p/8505059.html

时间: 2024-10-10 07:56:32

python爬虫--爬取某网站电影下载地址的相关文章

python 爬虫爬取 证券之星网站

周末无聊,找点乐子... #coding:utf-8 import requests from bs4 import BeautifulSoup import random import time #抓取所需内容 user_agent = ["Mozilla/5.0 (Windows NT 10.0; WOW64)", 'Mozilla/5.0 (Windows NT 6.3; WOW64)',               'Mozilla/5.0 (Windows NT 6.1) A

python爬虫--爬取豆瓣top250电影名

关于模拟浏览器登录的header,可以在相应网站按F12调取出编辑器,点击netwook,如下: 以便于不会被网站反爬虫拒绝. 1 import requests 2 from bs4 import BeautifulSoup 5 def get_movies(): 6 headers = { 7 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom

Python爬虫爬取博客园并保存

Python爬虫爬取博客园并保存        爬取博客园指定用户的文章修饰后全部保存到本地 首先定义爬取的模块文件: crawlers_main.py 执行入口 url_manager.py url管理器 download_manager.py 下载模块 parser_manager.py html解析器(解析html需要利用的内容) output_manager.py 输出html网页全部内容文件(包括css,png,js等) crawlers_main.py 执行入口 1 # coding

用Python爬虫爬取广州大学教务系统的成绩(内网访问)

用Python爬虫爬取广州大学教务系统的成绩(内网访问) 在进行爬取前,首先要了解: 1.什么是CSS选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/code] 在{}之前的部分就是"选择器"."选择器"指明了{}中的"样式"的作用对象,也就是"样式"作用于网页中的哪些元素.可参考:http://www.w3school.com.cn/cssref/css_selectors.asph

python爬虫—爬取英文名以及正则表达式的介绍

python爬虫—爬取英文名以及正则表达式的介绍 爬取英文名: 一.  爬虫模块详细设计 (1)整体思路 对于本次爬取英文名数据的爬虫实现,我的思路是先将A-Z所有英文名的连接爬取出来,保存在一个csv文件中:再读取csv文件当中的每个英文名链接,采用循环的方法读取每一个英文名链接,根据每个英文名链接爬取每个链接中的数据,保存在新的csv文件当中. 需要写一个爬取英文名链接的函数.将爬取的内容保存在csv文件的函数以及读取csv文件内容的函数.爬取英文名详情页内容的函数. 表5.3.1 函数名

python爬虫爬取csdn博客专家所有博客内容

python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 结果如下: 版权声明:本文为博主原创文章,未经博主允许不得转载.

python爬虫爬取美女图片

python 爬虫爬取美女图片 #coding=utf-8 import urllib import re import os import time import threading def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImgUrl(html,src): srcre = re.compile(src) srclist = re.findall(srcre,html)

python爬虫爬取微博评论案例详解

这篇文章主要介绍了python爬虫爬取微博评论,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 数据格式:{"name":评论人姓名,"comment_time":评论时间,"comment_info":评论内容,"comment_url":评论人的主页} 以上就是我们需要的信息. 具体操作流程: 我们首相将主页获取完成以后,我们就会发现,其中 的内容带有相

Python爬虫爬取一篇韩寒新浪博客

网上看到大神对Python爬虫爬到非常多实用的信息,认为非常厉害.突然对想学Python爬虫,尽管自己没学过Python.但在网上找了一些资料看了一下,看到爬取韩寒新浪博客的视频.共三集,第一节讲爬取一篇博客,第二节讲爬取一页博客.第三集讲爬取所有博客. 看了视频.也留下了代码. 爬虫第一步:查看网页源码: 第一篇博客的代码为蓝底的部分<a title="" target="_blank" href="http://blog.sina.com.cn/