亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

【Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)】3.4-抓取貓眼電影排行

系統(tǒng) 1767 0

【摘要】本節(jié)中,我們利用requests庫和正則表達(dá)式來抓取貓眼電影TOP100的相關(guān)內(nèi)容。requests比urllib使用更加方便,而且目前我們還沒有系統(tǒng)學(xué)習(xí)HTML解析庫,所以這里就選用正則表達(dá)式來作為解析工具。

1. 本節(jié)目標(biāo)

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

2. 準(zhǔn)備工作

在本節(jié)開始之前,請(qǐng)確保已經(jīng)正確安裝好了requests庫。如果沒有安裝,可以參考第1章的安裝說明。

3. 抓取分析

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

【Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)】3.4-抓取貓眼電影排行_第1張圖片

圖3-11 榜單信息

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

將網(wǎng)頁滾動(dòng)到最下方,可以發(fā)現(xiàn)有分頁的列表,直接點(diǎn)擊第2頁,觀察頁面的URL和內(nèi)容發(fā)生了怎樣的變化,如圖3-12所示。

【Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)】3.4-抓取貓眼電影排行_第2張圖片

圖3-12 頁面URL變化

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

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

4. 抓取首頁

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

            
              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()
            
          

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

5. 正則提取

接下來,回到網(wǎng)頁看一下頁面的真實(shí)源碼。在開發(fā)者模式下的Network監(jiān)聽組件中查看源代碼,如圖3-13所示。

【Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)】3.4-抓取貓眼電影排行_第3張圖片

圖3-13 源代碼

注意,這里不要在Elements選項(xiàng)卡中直接查看源碼,因?yàn)槟抢锏脑创a可能經(jīng)過JavaScript操作而與原始請(qǐng)求不同,而是需要從Network選項(xiàng)卡部分查看原始請(qǐng)求得到的源碼。

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

【Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)】3.4-抓取貓眼電影排行_第4張圖片

圖3-14 源代碼

可以看到,一部電影信息對(duì)應(yīng)的源代碼是一個(gè)dd節(jié)點(diǎn),我們用正則表達(dá)式來提取這里面的一些電影信息。首先,需要提取它的排名信息。而它的排名信息是在class為board-index的i節(jié)點(diǎn)內(nèi),這里利用非貪婪匹配來提取i節(jié)點(diǎn)內(nèi)的信息,正則表達(dá)式寫為:

            
              
.*?board-index.*?>(.*?)

隨后需要提取電影的圖片??梢钥吹?,后面有a節(jié)點(diǎn),其內(nèi)部有兩個(gè)img節(jié)點(diǎn)。經(jīng)過檢查后發(fā)現(xiàn),第二個(gè)img節(jié)點(diǎn)的data-src屬性是圖片的鏈接。這里提取第二個(gè)img節(jié)點(diǎn)的data-src屬性,正則表達(dá)式可以改寫如下:

                  
                    
.*?board-index.*?>(.*?).*?data-src="(.*?)"

再往后,需要提取電影的名稱,它在后面的p節(jié)點(diǎn)內(nèi),class為name。所以,可以用name做一個(gè)標(biāo)志位,然后進(jìn)一步提取到其內(nèi)a節(jié)點(diǎn)的正文內(nèi)容,此時(shí)正則表達(dá)式改寫如下:

                        
                          
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?)

再提取主演、發(fā)布時(shí)間、評(píng)分等內(nèi)容時(shí),都是同樣的原理。最后,正則表達(dá)式寫為:

                              
                                
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star.*?>(.*?)

.*?releasetime.*?>(.*?)

.*?integer.*?>(.*?).*?fraction.*?>(.*?).*?

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

接下來,我們?cè)俣x解析頁面的方法parse_one_page(),主要是通過正則表達(dá)式來從結(jié)果中提取出我們想要的內(nèi)容,實(shí)現(xiàn)代碼如下:

                              
                                def parse_one_page(html):
    pattern = re.compile(
        '
                                
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star.*?>(.*?)

.*?releasetime.*?>(.*?)

.*?integer.*?>(.*?).*?fraction.*?>(.*?).*?
', re.S) items = re.findall(pattern, html) print(items)

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

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

但這樣還不夠,數(shù)據(jù)比較雜亂,我們?cè)賹⑵ヅ浣Y(jié)果處理一下,遍歷提取結(jié)果并生成字典,此時(shí)方法改寫如下:

                              
                                def parse_one_page(html):
    pattern = re.compile(
        '
                                
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star.*?>(.*?)

.*?releasetime.*?>(.*?)

.*?integer.*?>(.*?).*?fraction.*?>(.*?).*?
', 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() }

這樣就可以成功提取出電影的排名、圖片、標(biāo)題、演員、時(shí)間、評(píng)分等內(nèi)容了,并把它賦值為一個(gè)個(gè)的字典,形成結(jié)構(gòu)化數(shù)據(jù)。運(yùn)行結(jié)果如下:

                              
                                {'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': '這個(gè)殺手不太冷', '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': '泰坦尼克號(hào)', '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': '唐伯虎點(diǎn)秋香', '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. 寫入文件

隨后,我們將提取的結(jié)果寫入文件,這里直接寫入到一個(gè)文本文件中。這里通過JSON庫的dumps()方法實(shí)現(xiàn)字典的序列化,并指定ensure_ascii參數(shù)為False,這樣可以保證輸出結(jié)果是中文形式而不是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'))
                              
                            

通過調(diào)用write_to_json()方法即可實(shí)現(xiàn)將字典寫入到文本文件的過程,此處的content參數(shù)就是一部電影的提取結(jié)果,是一個(gè)字典。

7. 整合代碼

最后,實(shí)現(xiàn)main()方法來調(diào)用前面實(shí)現(xiàn)的方法,將單頁的電影結(jié)果寫入到文件。相關(guān)代碼如下:

                              
                                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. 分頁爬取

因?yàn)槲覀冃枰ト〉氖荰OP100的電影,所以還需要遍歷一下,給這個(gè)鏈接傳入offset參數(shù),實(shí)現(xiàn)其他90部電影的爬取,此時(shí)添加如下調(diào)用即可:

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

這里還需要將main()方法修改一下,接收一個(gè)offset值作為偏移量,然后構(gòu)造URL進(jìn)行爬取。實(shí)現(xià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)
                              
                            

到此為止,我們的貓眼電影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('
                                
.*?board-index.*?>(\d+).*?data-src="(.*?)".*?name"> (.*?) .*?star">(.*?)

.*?releasetime">(.*?)

' + '.*?integer">(.*?).*?fraction">(.*?).*?
', 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)

現(xiàn)在貓眼多了反爬蟲,如果速度過快,則會(huì)無響應(yīng),所以這里又增加了一個(gè)延時(shí)等待。

9. 運(yùn)行結(jié)果

最后,我們運(yùn)行一下代碼,輸出結(jié)果類似如下:

                              
                                {'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': '笠智眾,原節(jié)子,杉村春子', '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': ' 
 'title': '遷徙的鳥', 'actor': '雅克·貝漢,菲利普·拉波洛,Philippe Labro', 'time': '2001-12-12(法國)', 'score': '9.1'}
                              
                            

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

這時(shí)我們?cè)倏聪挛谋疚募?,結(jié)果如圖3-15所示。

【Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)】3.4-抓取貓眼電影排行_第5張圖片

圖3-15 運(yùn)行結(jié)果

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

10. 本節(jié)代碼

本節(jié)的代碼地址為https://github.com/Python3WebSpider/MaoYan。

本節(jié)中,我們通過爬取貓眼TOP100的電影信息練習(xí)了requests和正則表達(dá)式的用法。這是一個(gè)最基礎(chǔ)的實(shí)例,希望大家可以通過這個(gè)實(shí)例對(duì)爬蟲的實(shí)現(xiàn)有一個(gè)最基本的思路,也對(duì)這兩個(gè)庫的用法有更深一步的了解。

來源:華為云社區(qū) ?作者:崔慶才丨靜覓


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 日韩国产成人资源精品视频 | 中国欧美一级毛片免费 | 免费国产不卡午夜福在线观看 | 亚洲精品人成在线观看 | 日本一级在线观看 | 国产成人亚洲精品久久 | 成人美女网 | 天天操天天干天天爽 | 性欧美日韩 | 日本xxxxx18护士xxx| julia在线视频| 欧美精品色视频 | 一级黄网站 | 九九九精品视频免费 | 国产色吧 | 狠狠地日| 四虎永久免费观看紧急入口 | 黄色在线免费观看网站 | 精品一久久香蕉国产线看播放 | 波多野结衣久久精品免费播放 | 国产免费播放一区二区 | 国产黄毛片 | 日本高清有码 | 四虎在线观看 | 99r在线视频 | 亚洲乱码视频 | 在线成人精品国产区免费 | 九九热视频在线播放 | 欧美日韩黄色大片 | 亚洲综合视频网 | 精品91视频 | 欧美高清一区二区三 | 精品国产福利在线观看一区 | 91热在线观看精品 | 男女一级做片a性视频 | 久草在线在线视频 | 播放一级录像片 | 亚洲色啦啦狠狠网站 | 欧美一级aa免费毛片 | 69日本人xxxx16—18 | 欧美影院久久 |