日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

Python 网络爬虫实战:采集《电影天堂》上万部动作片电影

發(fā)布時(shí)間:2024/3/24 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 网络爬虫实战:采集《电影天堂》上万部动作片电影 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

不知不覺,玩爬蟲玩了一個多月了。

我愈發(fā)覺得,爬蟲其實(shí)并不是什么特別高深的技術(shù),它的價(jià)值不在于你使用了什么特別牛的框架,用了多么了不起的技術(shù),它不需要。它只是以一種自動化搜集數(shù)據(jù)的小工具,能夠獲取到想要的數(shù)據(jù),就是它最大的價(jià)值。

很多人學(xué)習(xí)python,不知道從何學(xué)起。
很多人學(xué)習(xí)python,掌握了基本語法過后,不知道在哪里尋找案例上手。
很多已經(jīng)做案例的人,卻不知道如何去學(xué)習(xí)更加高深的知識。
那么針對這三類人,我給大家提供一個好的學(xué)習(xí)平臺,免費(fèi)領(lǐng)取視頻教程,電子書籍,以及課程的源代碼!??¤
QQ群:623406465

我的爬蟲課老師也常跟我們強(qiáng)調(diào),學(xué)習(xí)爬蟲最重要的,不是學(xué)習(xí)里面的技術(shù),因?yàn)榍岸思夹g(shù)在不斷的發(fā)展,爬蟲的技術(shù)便會隨著改變。學(xué)習(xí)爬蟲最重要的是,學(xué)習(xí)它的原理,萬變不離其宗。

爬蟲說白了是為了解決需要,方便生活的。如果能夠在日常生活中,想到并應(yīng)用爬蟲去解決實(shí)際的問題,那么爬蟲的真正意義也久發(fā)揮出來了。

這是些閑話啦,有感而發(fā)而已。


最近有點(diǎn)片荒,不知道該看什么電影,而且有些電影在網(wǎng)上找好久也找不到資源。后來我了解到這個網(wǎng)站,發(fā)現(xiàn)最近好多不錯的電影上面都有資源(這里我就先不管它的來源正不正規(guī)啦,#掩面)。

所以這次我們要爬取的網(wǎng)站是:《電影天堂》,屯一些電影,等無聊的時(shí)候拿出來看看,消遣消遣也是不錯。

?

這次的網(wǎng)站,從爬蟲的技術(shù)角度上來講,難度不大,而且可以說是非常簡單了。但是,它實(shí)用啊!你想嘛,早上上班前跑一下爬蟲,晚上回家以后已經(jīng)有幾十部最新大片在你硬盤里等著你啦,累了一天躺床上看看電影,這種感覺是不是很爽啊。

而且正因?yàn)檫@個爬蟲比較簡單,所以我會寫的稍微細(xì)一點(diǎn),爭取讓 python 小白們也能盡可能看懂,并且能夠在這個爬蟲的基礎(chǔ)上修改,得到爬取這個網(wǎng)站其他板塊或者其他電影網(wǎng)站的爬蟲。

?

寫在前面的話


在編寫爬蟲程序之前,我先捋一捋我們的思路。

  • 爬蟲的原理,是通過給定的一個?URL(就是類似于 http://www.baidu.com 這樣的,俗稱網(wǎng)址的東東) 請求,去訪問一個網(wǎng)頁,獲取那個網(wǎng)頁上的源代碼(不知道源代碼的,隨便打開一個網(wǎng)頁,右鍵,查看網(wǎng)頁源代碼,出來的一大堆像亂碼一樣的東西就是網(wǎng)頁源代碼,我們需要的數(shù)據(jù)就藏在這些源代碼里面)并返回來。
  • 然后,通過一些手段(比如說json庫,BeautifulSoup庫,正則表達(dá)式等)從網(wǎng)頁源代碼中篩選出我們想要的數(shù)據(jù)(當(dāng)然,前提是我們需要分析網(wǎng)頁結(jié)構(gòu),知道自己想要什么數(shù)據(jù),以及這些數(shù)據(jù)存放在網(wǎng)頁的哪兒,存放的位置有什么特征等)。
  • 最后,將我們獲取到的數(shù)據(jù)按照一定的格式,存儲到本地或者數(shù)據(jù)庫中,這樣就完成了爬蟲的全部工作。
  • 當(dāng)然,也有一些 「騷操作」,如果你嫌爬蟲效率低,可以開多線程(就是相當(dāng)于幾十只爬蟲同時(shí)給你爬,效率直接翻了幾十倍);如果擔(dān)心爬取頻率過高被網(wǎng)站封 IP,可以掛 IP 代理(相當(dāng)于打幾槍換個地方,對方網(wǎng)站就不知道你究竟是爬蟲還是正常訪問的用戶了);如果對方網(wǎng)站有反爬機(jī)制,那么也有一些騷操作可以繞過反爬機(jī)制(有點(diǎn)黑客攻防的感覺,有木有!)。這些都是后話了。

    ?

    爬蟲部分


    一、分析網(wǎng)站結(jié)構(gòu)(以動作片電影為例)

    1. 分析網(wǎng)頁的 URL 的組成結(jié)構(gòu)

    首先,我們需要分析網(wǎng)頁的 URL 的組成結(jié)構(gòu),主要關(guān)注兩方面,一是如何切換選擇的電影類型,二是網(wǎng)頁如何翻頁的。

    • 點(diǎn)擊網(wǎng)頁上的電影類型的按鈕,觀察地址欄中的 URL ,發(fā)現(xiàn)網(wǎng)址和電影類型的關(guān)系如下:
    電影類型網(wǎng)址
    劇情片https://www.dy2018.com/0/
    喜劇片https://www.dy2018.com/1/
    動作片https://www.dy2018.com/2/
    愛情片https://www.dy2018.com/3/
    科幻片https://www.dy2018.com/4/
    動畫片https://www.dy2018.com/5/
    懸疑片https://www.dy2018.com/6/
    驚悚片https://www.dy2018.com/7/
    恐怖片https://www.dy2018.com/8/
    記錄片https://www.dy2018.com/9/
    ............
    災(zāi)難片https://www.dy2018.com/18/
    武俠片https://www.dy2018.com/19/
    古裝片https://www.dy2018.com/20/

    發(fā)現(xiàn)規(guī)律了吧,以后如果想爬其他類型的電影,只要改變 url 中的數(shù)字即可,甚至你可以寫一個循環(huán),把所有板塊中的電影全部爬取下來。

    • 隨便打開一個分類,我們滾動到頁面的最下面,發(fā)現(xiàn)這里有翻頁的按鈕,點(diǎn)擊按鈕翻頁的同時(shí),觀察 url 的變化。
    頁碼URL
    第一頁https://www.dy2018.com/2/index.html
    第二頁https://www.dy2018.com/2/index_2.html
    第三頁https://www.dy2018.com/2/index_3.html
    第四頁https://www.dy2018.com/2/index_4.html

    除了第一頁是 「index」外,其余頁碼均是 「index_頁碼」的形式。

    所以我們基本掌握了網(wǎng)站的 url 的構(gòu)成形式,這樣我們就可以通過自己構(gòu)造 url 來訪問任意類型電影的任意一頁了,是不是很酷。

    ?

    2. 分析網(wǎng)站的頁面結(jié)構(gòu)

    其次,我們分析一下網(wǎng)站的頁面結(jié)構(gòu),看一看我們需要的信息都藏在網(wǎng)頁的什么地方(在這之前我們先要明確一下我們需要哪些數(shù)據(jù)),由于我們這個目的是下載電影,所以對我有用的數(shù)據(jù)只有兩個,電影名稱和下載電影的磁力鏈接

    按 F12 召喚出開發(fā)者工具(這個工具可以幫助你快速定位網(wǎng)頁中的元素在 html 源代碼中位置)。

    然后,我們可以發(fā)現(xiàn),電影列表中,每一部電影的信息存放在一個 <table> 標(biāo)簽里,而電影的名字,就藏在里面的一個 <a> 標(biāo)簽中。電影下載的磁力鏈接在電影的詳情頁面,而電影詳情頁面的網(wǎng)址也在這個?<a> 標(biāo)簽中( href 屬性的值)。

    而下載的磁力鏈接,存放在 <tbody> 標(biāo)簽下的 <a> 標(biāo)簽中,是不是很好找啊!

    最后我們來縷一縷思路,一會兒我們準(zhǔn)備這樣操作:通過前面的網(wǎng)址的構(gòu)造規(guī)則,訪問到網(wǎng)站的某一頁,然后獲取到這個頁面里的所有 table 標(biāo)簽(這里存放著電影的數(shù)據(jù)),然后從每一個 table 標(biāo)簽中找到存有電影名稱的 a 標(biāo)簽(這里可以拿到電影名稱以及詳情頁面的網(wǎng)址),然后通過這里獲取的網(wǎng)址訪問電影的詳情頁面,在詳情頁面挑選出 <tbody> 標(biāo)簽下的 <a> 標(biāo)簽(這里存放著電影的下載鏈接),這樣我們就找到了我們所需要的全部數(shù)據(jù)了,是不是很簡單啊。

    ?

    二、爬蟲編碼階段?

    爬蟲的程序,我一般習(xí)慣把它分成五個部分, 一是主函數(shù),作為程序的入口,二是爬蟲調(diào)度器,三是網(wǎng)絡(luò)請求函數(shù),四是網(wǎng)頁解析函數(shù),五是數(shù)據(jù)存儲函數(shù)。

    • get_data :其參數(shù)是目標(biāo)網(wǎng)頁 url,這個函數(shù)可以模擬瀏覽器訪問 url,獲取并將網(wǎng)頁的內(nèi)容返回。
    • parse_data :其參數(shù)是網(wǎng)頁的內(nèi)容,這個函數(shù)主要是用來解析網(wǎng)頁內(nèi)容,篩選提取出關(guān)鍵的信息,并打包成列表返回。
    • save_data :其參數(shù)是數(shù)據(jù)的列表,這個函數(shù)用來將列表中的數(shù)據(jù)寫入本地的文件中。
    • main :這個函數(shù)是爬蟲程序的調(diào)度器,可以根據(jù)事先分析好的 url 的規(guī)則,不斷的構(gòu)造新的請求 url,并調(diào)用其他三個函數(shù),獲取數(shù)據(jù)并保存到本地,直到結(jié)束。
    • if __name__ == '__main__' :這是主程序的入口,在這里調(diào)用 main 函數(shù),啟動爬蟲調(diào)度器即可。
    # 我們用到的庫import requestsimport bs4import reimport pandas as pd

    ?1.?網(wǎng)絡(luò)請求函數(shù) :get_data (url)

    負(fù)責(zé)訪問指定的 url 網(wǎng)頁,并將網(wǎng)頁的內(nèi)容返回,此部分功能比較簡單固定,一般不需要做修改(除非你要掛代理,或者自定義請求頭等,可以做一些相應(yīng)的調(diào)整)。

    def get_data(url):'''功能:訪問 url 的網(wǎng)頁,獲取網(wǎng)頁內(nèi)容并返回參數(shù):url :目標(biāo)網(wǎng)頁的 url返回:目標(biāo)網(wǎng)頁的 html 內(nèi)容'''headers = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',}try:r = requests.get(url, headers=headers)r.raise_for_status()return r.textexcept requests.HTTPError as e:print(e)print("HTTPError")except requests.RequestException as e:print(e)except:print("Unknown Error !")

    2.?網(wǎng)頁解析函數(shù):parse_data(html)

    ?這個函數(shù)是整個爬蟲程序的核心所在,整體思路在上一部分已經(jīng)講過了。我這里使用的庫是?BeautifulSoup。

    這部分的寫法多種多樣,有很多發(fā)揮的空間,也沒有什么太多固定的模式,因?yàn)檫@部分的寫法是要隨著不同網(wǎng)站的頁面結(jié)構(gòu)來做調(diào)整的,比如說有的網(wǎng)站提供了數(shù)據(jù)的 api 接口,那么返回的數(shù)據(jù)就是 json 格式,我們只需要調(diào)用 json 庫就可以完成數(shù)據(jù)解析,而大部分的網(wǎng)站只能通過從網(wǎng)頁源代碼中一層層篩選(篩選手段也多種多樣,什么正則表達(dá)式,beautifulsoup等等)。

    這里需要根據(jù)數(shù)據(jù)的形式來選擇不同的篩選策略,所以,知道原理就可以了,習(xí)慣什么方法就用什么方法,反正最后能拿到數(shù)據(jù)就好了。

    def parse_data(html):'''功能:提取 html 頁面信息中的關(guān)鍵信息,并整合一個數(shù)組并返回參數(shù):html 根據(jù) url 獲取到的網(wǎng)頁內(nèi)容返回:存儲有 html 中提取出的關(guān)鍵信息的數(shù)組'''bsobj = bs4.BeautifulSoup(html,'html.parser')info = []# 獲取電影列表tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})# 對電影列表中的每一部電影單獨(dú)處理for item in tbList:movie = []link = item.b.find_all('a')[1]# 獲取電影的名稱name = link["title"]# 獲取詳情頁面的 urlurl = 'https://www.dy2018.com' + link["href"]# 將數(shù)據(jù)存放到電影信息列表里movie.append(name)movie.append(url)try:# 訪問電影的詳情頁面,查找電影下載的磁力鏈接temp = bs4.BeautifulSoup(get_data(url),'html.parser')tbody = temp.find_all('tbody')# 下載鏈接有多個(也可能沒有),這里將所有鏈接都放進(jìn)來for i in tbody:download = i.a.textmovie.append(download)#print(movie)# 將此電影的信息加入到電影列表中info.append(movie)except Exception as e:print(e)return info

    3. 數(shù)據(jù)存儲函數(shù):save_data(data)

    ?這個函數(shù)目的是將數(shù)據(jù)存儲到本地文件或數(shù)據(jù)庫中,具體的寫法要根據(jù)實(shí)際需要的存儲形式來定,我這里是將數(shù)據(jù)存放在本地的 csv 文件中。

    當(dāng)然這個函數(shù)也并不只能做這些事兒,比如你可以在這里寫一些簡單的數(shù)據(jù)處理的操作,比如說:數(shù)據(jù)清洗,數(shù)據(jù)去重等操作。

    def save_data(data):'''功能:將 data 中的信息輸出到文件中/或數(shù)據(jù)庫中。參數(shù):data 將要保存的數(shù)據(jù)'''filename = 'Data/電影天堂/動作片.csv'dataframe = pd.DataFrame(data)dataframe.to_csv(filename, mode='a', index=False, sep=',', header=False)

    4. 爬蟲調(diào)度器:main()

    這個函數(shù)負(fù)責(zé)根據(jù) url 生成規(guī)則,構(gòu)造新的 url 請求,然后依次調(diào)用網(wǎng)絡(luò)請求函數(shù),網(wǎng)頁解析函數(shù),數(shù)據(jù)存儲函數(shù),爬取并保存該頁數(shù)據(jù)。

    所謂爬蟲調(diào)度器,就是控制爬蟲什么時(shí)候開始爬,多少只爬蟲一起爬,爬哪個網(wǎng)頁,爬多久休息一次,等等這些事兒。

    def main():# 循環(huán)爬取多頁數(shù)據(jù)for page in range(1, 114):print('正在爬取:第' + str(page) + '頁......')# 根據(jù)之前分析的 URL 的組成結(jié)構(gòu),構(gòu)造新的 urlif page == 1:index = 'index'else:index = 'index_' + str(page)url = 'https://www.dy2018.com/2/'+ index +'.html'# 依次調(diào)用網(wǎng)絡(luò)請求函數(shù),網(wǎng)頁解析函數(shù),數(shù)據(jù)存儲函數(shù),爬取并保存該頁數(shù)據(jù)html = get_data(url)movies = parse_data(html)save_data(movies)print('第' + str(page) + '頁完成!')

    5. 主函數(shù):程序入口

    主函數(shù)作為程序的入口,只負(fù)責(zé)啟動爬蟲調(diào)度器。

    這里我一般習(xí)慣在 main() 函數(shù)前后輸出一條語句,以此判斷爬蟲程序是否正常啟動和結(jié)束。

    if __name__ == '__main__':print('爬蟲啟動成功!')main()print('爬蟲執(zhí)行完畢!')

    三、程序運(yùn)行結(jié)果

    ?運(yùn)行了兩個小時(shí)左右吧,終于爬完了 113 頁,共 3346 部動作片電影的數(shù)據(jù)(本來不止這些的,但是有一些電影沒有提供下載鏈接,我在 excel 中排序后直接手動剔除了)。

    然后想看什么電影的話,直接復(fù)制這些電影下載的磁力鏈接,到迅雷里面下載就好啦。?

    ?

    四、爬蟲程序的一些小優(yōu)化

    1. 在網(wǎng)站提供的下載鏈接中,我試了一下,發(fā)現(xiàn)?magnet 開頭的這類鏈接放在迅雷中可以直接下載,而 ftp 開頭的鏈接在迅雷中總顯示資源獲取失敗(我不知道是不是我打開的方式不對,反正就是下載不來),于是我對程序做了一些小的調(diào)整,使其只獲取?magnet 這類的鏈接。

    修改的方式也很簡單,只需要調(diào)整 網(wǎng)頁解析函數(shù) 即可(爬蟲的五個部分是相對獨(dú)立的,修改時(shí)只需調(diào)整相應(yīng)的模塊即可,其余部分無需修改)。

    def parse_data(html):'''功能:提取 html 頁面信息中的關(guān)鍵信息,并整合一個數(shù)組并返回參數(shù):html 根據(jù) url 獲取到的網(wǎng)頁內(nèi)容返回:存儲有 html 中提取出的關(guān)鍵信息的數(shù)組'''bsobj = bs4.BeautifulSoup(html,'html.parser')info = []# 獲取表頭信息tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})for item in tbList:movie = []link = item.b.find_all('a')[1]name = link["title"]url = 'https://www.dy2018.com' + link["href"]try:# 查找電影下載的磁力鏈接temp = bs4.BeautifulSoup(get_data(url),'html.parser')tbody = temp.find_all('tbody')for i in tbody:download = i.a.textif 'magnet:?xt=urn:btih' in download:movie.append(name)movie.append(url)movie.append(download)#print(movie)info.append(movie)breakexcept Exception as e:print(e)return info

    ?注意代碼 26 行處,我加了一個 if 語句的判斷,如果下載鏈接中包含?magnet:?xt=urn:btih 字符串,則視為有效鏈接,下載下來,否則跳過。

    ?

    2. 我一直在想能不能有個辦法讓迅雷一鍵批量下載我們爬到的電影。使用 python 操縱第三方的軟件,這其實(shí)挺難的。不過后來找到了一種方法,也算是解決了這個問題。

    就是我們發(fā)現(xiàn)迅雷軟件啟動后,會自動檢測我們的剪切板,只要我們復(fù)制了下載鏈接,它便會自動彈出下載的提示框。借助這個思路,我們可以使用代碼,將下載的鏈接復(fù)制進(jìn)入剪切板,等下載框自動出現(xiàn)后,手動確認(rèn)開始下載(這是我目前想到的最好的辦法了,不知道各位大佬有沒有更好的思路,歡迎指導(dǎo)交流)。

    import pyperclipimport osimport pandas as pdimageData = pd.read_csv("Data/電影天堂/動作片2.csv",names=['name','link','download'],encoding = 'gbk')# 獲取電影的下載鏈接,并用換行符分隔a_link = imageData['download']links = '\n'.join(a_link)# 復(fù)制到剪切板pyperclip.copy(links);print('已粘貼');# 打開迅雷thunder_path = r'D:\Program Files (x86)\Thunder Network\Thunder9\Program\Thunder.exe'os.startfile(thunder_path)

    親測可以實(shí)現(xiàn),但是。。。不建議嘗試(你能想象迅雷打開的一瞬間創(chuàng)建幾百個下載任務(wù)的場景嗎?反正我的電腦是緩了好久好久才反應(yīng)過來)。大家還是老老實(shí)實(shí)的,手動復(fù)制鏈接下載吧(csv文件可以用 excel 打開,豎著選中一列,然后復(fù)制,也能達(dá)到相同的效果)?,這種騷操作太蠢了還是不要試了。

    ?

    寫在后面的話


    ?啰啰嗦嗦的寫了好多,也不知道關(guān)鍵的問題講清楚了沒有。有哪里沒講清楚,或者哪里講的不合適的話,歡迎騷擾。

    ?

    其實(shí)吧,寫文章,寫博客,寫教程,都是一個知識重新熔煉內(nèi)化的過程,在寫這篇博客的時(shí)候,我也一直在反復(fù)審視我學(xué)習(xí)爬蟲的過程,以及我爬蟲代碼一步步的變化,從一開始的所有代碼全部揉在主函數(shù)中,到后來把一些變動較少的功能提取出來,寫成單獨(dú)的函數(shù),再到后來形成基本穩(wěn)定的五大部分。

    以至于在我后來學(xué)習(xí)使用 scrapy 框架時(shí)候,驚人的發(fā)現(xiàn) scrapy 框架的結(jié)構(gòu)跟我的爬蟲結(jié)構(gòu)有著異曲同工之妙,我的這個相當(dāng)于是一個簡易版的爬蟲框架了,純靠自己摸索達(dá)到這個效果,我感覺還是挺有成就感的。

    總結(jié)

    以上是生活随笔為你收集整理的Python 网络爬虫实战:采集《电影天堂》上万部动作片电影的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。