亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python爬蟲中爬取貓眼電影排行的方法

發布時間:2020-08-05 17:35:00 來源:億速云 閱讀:200 作者:小新 欄目:編程語言

這篇文章主要介紹Python爬蟲中爬取貓眼電影排行的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

我們利用requests庫和正則表達式來抓取貓眼電影TOP100的相關內容。requests比urllib使用更加方便,而且目前我們還沒有系統學習HTML解析庫,所以這里就選用正則表達式來作為解析工具。

1. 本節目標

本節中,我們要提取出貓眼電影TOP100的電影名稱、時間、評分、圖片等信息,提取的站點URL為http://maoyan.com/board/4,提取的結果會以文件形式保存下來。

2. 準備工作

在本節開始之前,請確保已經正確安裝好了requests庫。如果沒有安裝,可以參考第1章的安裝說明。

3. 抓取分析

我們需要抓取的目標站點為http://maoyan.com/board/4,打開之后便可以查看到榜單信息,如圖3-11所示。

Python爬蟲中爬取貓眼電影排行的方法

排名第一的電影是霸王別姬,頁面中顯示的有效信息有影片名稱、主演、上映時間、上映地區、評分、圖片等信息。

將網頁滾動到最下方,可以發現有分頁的列表,直接點擊第2頁,觀察頁面的URL和內容發生了怎樣的變化,如圖3-12所示。

Python爬蟲中爬取貓眼電影排行的方法

可以發現頁面的URL變成http://maoyan.com/board/4?offset=10,比之前的URL多了一個參數,那就是offset=10,而目前顯示的結果是排行11~20名的電影,初步推斷這是一個偏移量的參數。再點擊下一頁,發現頁面的URL變成了http://maoyan.com/board/4?offset=20,參數offset變成了20,而顯示的結果是排行21~30的電影。

由此可以總結出規律,offset代表偏移量值,如果偏移量為n,則顯示的電影序號就是n+1到n+10,每頁顯示10個。所以,如果想獲取TOP100電影,只需要分開請求10次,而10次的offset參數分別設置為0、10、20、…90即可,這樣獲取不同的頁面之后,再用正則表達式提取出相關信息,就可以得到TOP100的所有電影信息了。

4. 抓取首頁

接下來用代碼實現這個過程。首先抓取第一頁的內容。我們實現了get_one_page()方法,并給它傳入url參數。然后將抓取的頁面結果返回,再通過main()方法調用。初步代碼實現如下:

import requests
def get_one_page(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.text
    return None
def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    print(html)
main()

這樣運行之后,就可以成功獲取首頁的源代碼了。獲取源代碼后,就需要解析頁面,提取出我們想要的信息。

5. 正則提取

接下來,回到網頁看一下頁面的真實源碼。在開發者模式下的Network監聽組件中查看源代碼,如圖3-13所示。

Python爬蟲中爬取貓眼電影排行的方法

注意,這里不要在Elements選項卡中直接查看源碼,因為那里的源碼可能經過JavaScript操作而與原始請求不同,而是需要從Network選項卡部分查看原始請求得到的源碼。

查看其中一個條目的源代碼,如圖3-14所示。

Python爬蟲中爬取貓眼電影排行的方法

可以看到,一部電影信息對應的源代碼是一個dd節點,我們用正則表達式來提取這里面的一些電影信息。首先,需要提取它的排名信息。而它的排名信息是在class為board-index的i節點內,這里利用非貪婪匹配來提取i節點內的信息,正則表達式寫為:

<dd>.*?board-index.*?>(.*?)</i>

隨后需要提取電影的圖片。可以看到,后面有a節點,其內部有兩個img節點。經過檢查后發現,第二個img節點的data-src屬性是圖片的鏈接。這里提取第二個img節點的data-src屬性,正則表達式可以改寫如下:

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"

再往后,需要提取電影的名稱,它在后面的p節點內,class為name。所以,可以用name做一個標志位,然后進一步提取到其內a節點的正文內容,此時正則表達式改寫如下:

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>

再提取主演、發布時間、評分等內容時,都是同樣的原理。最后,正則表達式寫為:

<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>
(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>

這樣一個正則表達式可以匹配一個電影的結果,里面匹配了7個信息。接下來,通過調用findall()方法提取出所有的內容。

接下來,我們再定義解析頁面的方法parse_one_page(),主要是通過正則表達式來從結果中提取出我們想要的內容,實現代碼如下:

def parse_one_page(html):
    pattern = re.compile(
        '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.
        *?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)
    items = re.findall(pattern, html)
    print(items)

這樣就可以成功地將一頁的10個電影信息都提取出來,這是一個列表形式,輸出結果如下:

[('1', 'http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', '霸王別姬', '\n
主演:張國榮,張豐毅,鞏俐\n
', '上映時間:1993-01-01(中國香港)', '9.', '6'),
('2', 'http://p0.meituan.net/movie/__40191813__4767047.jpg@160w_220h_1e_1c', '肖申克的救贖', '\n
主演:蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓\n
', '上映時間:1994-10-14(美國)', '9.', '5'),
('3', 'http://p0.meituan.net/movie/fc9d78dd2ce84d20e53b6d1ae2eea4fb1515304.jpg@160w_220h_1e_1c', '這個殺手不太冷', '\n
主演:讓·雷諾,加里·奧德曼,娜塔莉·波特曼\n
', '上映時間:1994-09-14(法國)', '9.', '5'), 
('4', 'http://p0.meituan.net/movie/23/6009725.jpg@160w_220h_1e_1c', '羅馬假日', '\n
主演:格利高利·派克,奧黛麗·赫本,埃迪·艾伯特\n
', '上映時間:1953-09-02(美國)', '9.', '1'), 
('5', 'http://p0.meituan.net/movie/53/1541925.jpg@160w_220h_1e_1c', '阿甘正傳', '\n
主演:湯姆·漢克斯,羅賓·懷特,加里·西尼斯\n
', '上映時間:1994-07-06(美國)', '9.', '4'), 
('6', 'http://p0.meituan.net/movie/11/324629.jpg@160w_220h_1e_1c', '泰坦尼克號', '\n
主演:萊昂納多·迪卡普里奧,凱特·溫絲萊特,比利·贊恩\n
', '上映時間:1998-04-03', '9.', '5'), 
('7', 'http://p0.meituan.net/movie/99/678407.jpg@160w_220h_1e_1c', '龍貓', '\n
主演:日高法子,坂本千夏,糸井重里\n
', '上映時間:1988-04-16(日本)', '9.', '2'), 
('8', 'http://p0.meituan.net/movie/92/8212889.jpg@160w_220h_1e_1c', '教父', '\n
主演:馬龍·白蘭度,阿爾·帕西諾,詹姆斯·凱恩\n
', '上映時間:1972-03-24(美國)', '9.', '3'), 
('9', 'http://p0.meituan.net/movie/62/109878.jpg@160w_220h_1e_1c', '唐伯虎點秋香', '\n
主演:周星馳,鞏俐,鄭佩佩\n
', '上映時間:1993-07-01(中國香港)', '9.', '2'), 
('10', 'http://p0.meituan.net/movie/9bf7d7b81001a9cf8adbac5a7cf7d766132425.jpg@160w_220h_1e_1c', '千與千尋', '\n
主演:柊瑠美,入野自由,夏木真理\n
', '上映時間:2001-07-20(日本)', '9.', '3')]

但這樣還不夠,數據比較雜亂,我們再將匹配結果處理一下,遍歷提取結果并生成字典,此時方法改寫如下:

def parse_one_page(html):
    pattern = re.compile(
        '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>
        .*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield {
            'index': item[0],
            'image': item[1],
            'title': item[2].strip(),
            'actor': item[3].strip()[3:] if len(item[3]) > 3 else '',
            'time': item[4].strip()[5:] if len(item[4]) > 5 else '',
            'score': item[5].strip() + item[6].strip()
        }

這樣就可以成功提取出電影的排名、圖片、標題、演員、時間、評分等內容了,并把它賦值為一個個的字典,形成結構化數據。運行結果如下:

{'image': 'http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', 'actor': 
'張國榮,張豐毅,鞏俐', 'score': '9.6', 'index': '1', 'title': '霸王別姬', 'time': '1993-01-01(中國香港)'}
{'image': 'http://p0.meituan.net/movie/__40191813__4767047.jpg@160w_220h_1e_1c', 'actor': 
'蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓', 'score': '9.5', 'index': '2', 'title': 
'肖申克的救贖', 'time': '1994-10-14(美國)'}
{'image': 'http://p0.meituan.net/movie/fc9d78dd2ce84d20e53b6d1ae2eea4fb1515304.jpg@160w_220h_1e_1c', 'actor': 
'讓·雷諾,加里·奧德曼,娜塔莉·波特曼', 'score': '9.5', 'index': '3', 'title': '這個殺手不太冷', 'time': 
'1994-09-14(法國)'}
{'image': 'http://p0.meituan.net/movie/23/6009725.jpg@160w_220h_1e_1c', 'actor': 
'格利高利·派克,奧黛麗·赫本,埃迪·艾伯特', 'score': '9.1', 'index': '4', 'title': '羅馬假日', 'time': 
'1953-09-02(美國)'}
{'image': 'http://p0.meituan.net/movie/53/1541925.jpg@160w_220h_1e_1c', 'actor': 
'湯姆·漢克斯,羅賓·懷特,加里·西尼斯', 'score': '9.4', 'index': '5', 'title': '阿甘正傳', 'time': 
'1994-07-06(美國)'}
{'image': 'http://p0.meituan.net/movie/11/324629.jpg@160w_220h_1e_1c', 'actor': 
'萊昂納多·迪卡普里奧,凱特·溫絲萊特,比利·贊恩', 'score': '9.5', 'index': '6', 'title': '泰坦尼克號', 'time': 
'1998-04-03'}
{'image': 'http://p0.meituan.net/movie/99/678407.jpg@160w_220h_1e_1c', 'actor': 
'日高法子,坂本千夏,糸井重里', 'score': '9.2', 'index': '7', 'title': '龍貓', 'time': '1988-04-16(日本)'}
{'image': 'http://p0.meituan.net/movie/92/8212889.jpg@160w_220h_1e_1c', 'actor': 
'馬龍·白蘭度,阿爾·帕西諾,詹姆斯·凱恩', 'score': '9.3', 'index': '8', 'title': '教父', 'time': '1972-03-24(美國)'}
{'image': 'http://p0.meituan.net/movie/62/109878.jpg@160w_220h_1e_1c', 'actor': 
'周星馳,鞏俐,鄭佩佩', 'score': '9.2', 'index': '9', 'title': '唐伯虎點秋香', 'time': '1993-07-01(中國香港)'}
{'image': 'http://p0.meituan.net/movie/9bf7d7b81001a9cf8adbac5a7cf7d766132425.jpg@160w_220h_1e_1c', 
'actor': '柊瑠美,入野自由,夏木真理', 'score': '9.3', 'index': '10', 'title': '千與千尋', 'time': '2001-07-20(日本)'}

到此為止,我們就成功提取了單頁的電影信息。

6. 寫入文件

隨后,我們將提取的結果寫入文件,這里直接寫入到一個文本文件中。這里通過JSON庫的dumps()方法實現字典的序列化,并指定ensure_ascii參數為False,這樣可以保證輸出結果是中文形式而不是Unicode編碼。代碼如下:

def write_to_json(content):
    with open('result.txt', 'a') as f:
        print(type(json.dumps(content)))
        f.write(json.dumps(content, ensure_ascii=False,).encode('utf-8'))

通過調用write_to_json()方法即可實現將字典寫入到文本文件的過程,此處的content參數就是一部電影的提取結果,是一個字典。

7. 整合代碼

最后,實現main()方法來調用前面實現的方法,將單頁的電影結果寫入到文件。相關代碼如下:

def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    for item in parse_one_page(html):
        write_to_json(item)

到此為止,我們就完成了單頁電影的提取,也就是首頁的10部電影可以成功提取并保存到文本文件中了。

8. 分頁爬取

因為我們需要抓取的是TOP100的電影,所以還需要遍歷一下,給這個鏈接傳入offset參數,實現其他90部電影的爬取,此時添加如下調用即可:

if __name__ == '__main__':
    for i in range(10):
        main(offset=i * 10)

這里還需要將main()方法修改一下,接收一個offset值作為偏移量,然后構造URL進行爬取。實現代碼如下:

def main(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

到此為止,我們的貓眼電影TOP100的爬蟲就全部完成了,再稍微整理一下,完整的代碼如下:

import json
import requests
from requests.exceptions import RequestException
import re
import time
def get_one_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None
def parse_one_page(html):
    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
                         + '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield {
            'index': item[0],
            'image': item[1],
            'title': item[2],
            'actor': item[3].strip()[3:],
            'time': item[4].strip()[5:],
            'score': item[5] + item[6]
        }
def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
def main(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)
if __name__ == '__main__':
    for i in range(10):
        main(offset=i * 10)
        time.sleep(1)

現在貓眼多了反爬蟲,如果速度過快,則會無響應,所以這里又增加了一個延時等待。

9. 運行結果

最后,我們運行一下代碼,輸出結果類似如下:

{'index': '1', 'image': 'http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c', 
'title': '霸王別姬', 'actor': '張國榮,張豐毅,鞏俐', 'time': '1993-01-01(中國香港)', 'score': '9.6'}
{'index': '2', 'image': 'http://p0.meituan.net/movie/__40191813__4767047.jpg@160w_220h_1e_1c', 'title': 
'肖申克的救贖', 'actor': '蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓', 'time': '1994-10-14(美國)', 'score': '9.5'}
...
{'index': '98', 'image': 'http://p0.meituan.net/movie/76/7073389.jpg@160w_220h_1e_1c', 'title': '東京物語', 
'actor': '笠智眾,原節子,杉村春子', 'time': '1953-11-03(日本)', 'score': '9.1'}
{'index': '99', 'image': 'http://p0.meituan.net/movie/52/3420293.jpg@160w_220h_1e_1c', 'title': '我愛你', 
'actor': '宋在河,李彩恩,吉海延', 'time': '2011-02-17(韓國)', 'score': '9.0'}
{'index': '100', 'image': 'http://p1.meituan.net/movie/__44335138__8470779.jpg@160w_220h_1e_1c', 'title': 
'遷徙的鳥', 'actor': '雅克·貝漢,菲利普·拉波洛,Philippe Labro', 'time': '2001-12-12(法國)', 'score': '9.1'}

這里省略了中間的部分輸出結果。可以看到,這樣就成功地把TOP100的電影信息爬取下來了。

這時我們再看下文本文件,結果如圖3-15所示。

Python爬蟲中爬取貓眼電影排行的方法

可以看到,電影信息也已全部保存到了文本文件中了,大功告成!

以上是Python爬蟲中爬取貓眼電影排行的方法的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹巴县| 册亨县| 阳山县| 宁国市| 合水县| 尖扎县| 延津县| 钟山县| 新泰市| 广西| 平果县| 仲巴县| 松滋市| 赤峰市| 晋宁县| 河东区| 太湖县| 新密市| 古蔺县| 涪陵区| 双桥区| 南岸区| 湘乡市| 广东省| 鱼台县| 博白县| 新建县| 昆山市| 安新县| 高台县| 中牟县| 公主岭市| 石家庄市| 罗甸县| 霍邱县| 青海省| 余姚市| 萝北县| 灌阳县| 蒙自县| 永嘉县|