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:d@dygodj8.com: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迅雷可以直接導入)

后記:有些可能會覺得這樣一股腦的把電影都下載下來,可能有些電影太爛,下載下來就是浪費時間和資源,而手工篩選又太費事,后續會通過數據庫的方式來存儲影片的信息,從而篩選出需要的地址。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM