摘要:本文介紹利用庫(kù)庫(kù)和正則表達(dá)式爬取貓眼電影電影的相關(guān)信息,提取出電影名稱上映時(shí)間評(píng)分封面圖片等信息,將爬取的內(nèi)容寫(xiě)入到文件中。獲取到不同的網(wǎng)頁(yè)后使用正則表達(dá)式提取出我們要的信息,就可以得到電影信息了,可以使用多線程加速爬取。
本文介紹利用Requests庫(kù)、multiprocessing庫(kù)和正則表達(dá)式爬取貓眼電影TOP100電影的相關(guān)信息,提取出電影名稱、上映時(shí)間、評(píng)分、封面圖片等信息,將爬取的內(nèi)容寫(xiě)入到文件中。站點(diǎn)URL為 http://maoyan.com/board/4
準(zhǔn)備本文使用了Requests庫(kù),使用pip安裝: pip install requests
分析打開(kāi)http://maoyan.com/board/4,可以看到榜單信息。如下圖所示
排名第一的電影是霸王別姬,可以提取的信息有電影名稱、主演、上映時(shí)間、評(píng)分、封面圖等。
點(diǎn)擊頁(yè)面下方的分頁(yè)列表翻頁(yè)到第二頁(yè),會(huì)發(fā)現(xiàn)URL會(huì)變成https://maoyan.com/board/4?offset=10,比首頁(yè)多了個(gè)offset=10 參數(shù),而目前顯示的是排名11-20的電影,初步判斷這是偏移量參數(shù)。再點(diǎn)擊下一頁(yè),URL變成了https://maoyan.com/board/4?offset=20,offset變成了20,顯示的是排名21-30的電影。
由此可見(jiàn),offset代表偏移量,偏移量為n,則顯示的是排名n+1~n+10的電影,每頁(yè)顯示10個(gè)電影。所以,想要獲取TOP100電影信息,只要分開(kāi)獲取10次,只需把10次請(qǐng)求的URL中offset參數(shù)分別設(shè)為 0,10,20,30...90即可(首頁(yè)的offset值為0)。獲取到不同的網(wǎng)頁(yè)后使用正則表達(dá)式提取出我們要的信息,就可以得到TOP100電影信息了,可以使用多線程加速爬取。
實(shí)現(xiàn)get_page()方法,傳入url參數(shù)可以將抓取的頁(yè)面結(jié)果返回。以下代碼獲取首頁(yè)內(nèi)容:
import requests from requests.exceptions import RequestException def get_page(url): headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" } response = requests.get(url,headers = headers) try: if response.status_code == 200: return response.text return None except RequestException: print("request error") return None def main(): html = get_page("https://maoyan.com/board/4") print(html) main()
運(yùn)行之后就成功獲取到了首頁(yè)的源代碼,接下來(lái)使用正則表達(dá)式進(jìn)行解析,提取出我們想要的信息。
正則提取回到瀏覽器頁(yè)面,在開(kāi)發(fā)者工具Network監(jiān)聽(tīng)組件中查看源代碼。如圖:
值得注意的是這里不是從Elements選項(xiàng)卡里查看的源代碼,因?yàn)镋lements里看到的源代碼很有可能經(jīng)過(guò)Javascript處理過(guò)從而和原始請(qǐng)求不同,所以要從Network選項(xiàng)卡里查看原始請(qǐng)求得到的源碼。
查看此處代碼:
不難發(fā)現(xiàn),要爬取的每部電影信息都在標(biāo)簽里,接下來(lái)使用正則表達(dá)式提取信息。
首先,提取它的排名信息,它的排名信息在class為board-index的i標(biāo)簽里,使用非貪婪匹配來(lái)提取i內(nèi)的信息,正則表達(dá)式可以寫(xiě)為:
接下來(lái)提取電影的封面圖片。在排名后面的a便簽里有兩個(gè)img便簽,經(jīng)過(guò)檢查,第二個(gè)img是電影的封面圖片,正則:.*?data-src="(.*?)"
然后提取電影的名稱,它在class為name的
便簽內(nèi),可以使用name作為標(biāo)志位進(jìn)一步提取到其內(nèi)a的文本內(nèi)容,正則寫(xiě)為:.*?name.*?a.*?>(.*?)
提取主演:.*?star">(.*?)
最后正則表達(dá)式寫(xiě)為:
上面的正則表達(dá)式可以匹配一個(gè)電影,匹配了7條信息,接下來(lái)可以通過(guò)findall()方法提取所有內(nèi)容。可以定義一個(gè)用來(lái)解析頁(yè)面的方法parse_page(),代碼如下:
def parse_page(html): pattern = re.compile("
這樣就成功得拿到了一頁(yè)10個(gè)電影的信息,這是一個(gè)列表,獲取到的結(jié)果如下:
[("1", "https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c", "霸王別姬", " 主演:張國(guó)榮,張豐毅,鞏俐 ", "上映時(shí)間:1993-01-01", "9.", "6"), ("2", "https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c", "肖申克的救贖", " 主演:蒂姆·羅賓斯,摩 根·弗里曼,鮑勃·岡頓 ", "上映時(shí)間:1994-10-14(美國(guó))", "9.", "5"), ("3", "https://p0.meituan.net/movie/54617769d96807e4d81804284ffe2a27239007.jpg@160w_220h_1e_1c", "羅 馬假日", " 主演:格利高里·派克,奧黛麗·赫本,埃迪·艾伯特 ", "上映時(shí)間:1953-09-02(美國(guó))", "9.", "1"), ("4", "https://p0.meituan.net/movie/e55ec5d18ccc 83ba7db68caae54f165f95924.jpg@160w_220h_1e_1c", "這個(gè)殺手不太冷", " 主演:讓·雷諾,加里·奧德曼,娜塔莉·波特曼 ", "上映時(shí)間:1994-09-14(法國(guó))", "9.", " 5"), ("5", "https://p1.meituan.net/movie/f5a924f362f050881f2b8f82e852747c118515.jpg@160w_220h_1e_1c", "教父", " 主演:馬龍·白蘭度,阿爾·帕西諾,詹姆斯·肯恩 ", "上映時(shí)間:1972-03-24(美國(guó))", "9.", "3"), ("6", "https://p1.meituan.net/movie/0699ac97c82cf01638aa5023562d6134351277.jpg@160w_220h_1e_1c", "泰坦尼克號(hào)", " 主演:萊昂納多·迪卡普里奧,凱特·溫絲萊特,比利·贊恩 ", "上映時(shí)間:1998-04-03", "9.", "5"), ("7", "https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e04110 8.jpg@160w_220h_1e_1c", "唐伯虎點(diǎn)秋香", " 主演:周星馳,鞏俐,鄭佩佩 ", "上映時(shí)間:1993-07-01(中國(guó)香港)", "9.", "2"), ("8", "https://p0.meituan.net/movie/b076ce63e9860ecf1ee9839badee5228329384.jpg@160w_220h_1e_1c", "千與千尋", " 主演:柊瑠美,入野自由,夏木真理 ", "上映時(shí)間:2001-07-20(日本)", "9.", "3"), ("9", "https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c", "魂斷藍(lán)橋", " 主演:費(fèi)雯·麗,羅伯特·泰勒,露塞爾·沃特森 ", "上映時(shí)間:1940-05-17(美國(guó))", "9.", "2"), ("10", "https://p0.meituan.net/movie/230e71d398e0c54730d58dc4bb6e4cca51662.jpg@160w_220h_1e_1c", "亂世佳人", " 主演:費(fèi)雯·麗,克拉克·蓋博,奧利維婭·德哈維蘭 ", "上映時(shí)間:1939-12-15(美國(guó))", "9.", "1")]
這樣的數(shù)據(jù)看上去很雜亂,使用字典將數(shù)據(jù)格式化:
for item in items: yield { "top":item[0], "image_src":item[1], "name":item[2], "actor":item[3].strip()[3:] if len(item[3]) > 3 else "", "releasetime":item[4].strip()[5:], "score":item[5] + item[6] }
這樣就可以獲得電影信息的結(jié)構(gòu)化數(shù)據(jù)了,每個(gè)電影的信息都包含在一個(gè)字典里。獲得的結(jié)果如下:
{"top": "1", "image_src": "https://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c", "name": "霸王別姬", "actor": "張國(guó)榮,張豐毅,鞏俐", "releasetime": "1993-01-01", "score": "9.6"} {"top": "2", "image_src": "https://p0.meituan.net/movie/283292171619cdfd5b240c8fd093f1eb255670.jpg@160w_220h_1e_1c", "name": "肖申克的救贖", "actor": "蒂姆·羅賓斯,摩根·弗里曼,鮑勃·岡頓", "releasetime": "1994-10-14(美國(guó))", "score": "9.5"} {"top": "3", "image_src": "https://p0.meituan.net/movie/54617769d96807e4d81804284ffe2a27239007.jpg@160w_220h_1e_1c","name": "羅馬假日", "actor": "格利高里·派克,奧黛麗·赫本,埃迪·艾伯特", "releasetime": "1953-09-02(美國(guó))", "score": "9.1"} {"top": "4", "image_src": "https://p0.meituan.net/movie/e55ec5d18ccc83ba7db68caae54f165f95924.jpg@160w_220h_1e_1c", "name": "這個(gè)殺手不太冷", "actor": "讓·雷諾,加里·奧德曼,娜塔莉·波特曼", "releasetime": "1994-09-14(法國(guó))", "score": "9.5"} {"top": "5", "image_src": "https://p1.meituan.net/movie/f5a924f362f050881f2b8f82e852747c118515.jpg@160w_220h_1e_1c", "name": "教父", "actor": "馬龍·白蘭度,阿爾·帕西諾,詹姆斯·肯恩", "releasetime": "1972-03-24(美國(guó))", "score": "9.3"} {"top": "6", "image_src": "https://p1.meituan.net/movie/0699ac97c82cf01638aa5023562d6134351277.jpg@160w_220h_1e_1c", "name": "泰坦尼克號(hào)", "actor": "萊昂納多·迪卡普里奧,凱特·溫絲萊特,比利·贊恩", "releasetime": "1998-04-03", "score": "9.5"} {"top": "7", "image_src": "https://p0.meituan.net/movie/da64660f82b98cdc1b8a3804e69609e041108.jpg@160w_220h_1e_1c", "name": "唐伯虎點(diǎn)秋香", "actor": "周星馳,鞏俐,鄭佩佩", "releasetime": "1993-07-01(中國(guó)香港)", "score": "9.2"} {"top": "8", "image_src": "https://p0.meituan.net/movie/b076ce63e9860ecf1ee9839badee5228329384.jpg@160w_220h_1e_1c", "name": "千與千尋", "actor": "柊瑠美,入野自由,夏木真理", "releasetime": "2001-07-20(日本)", "score": "9.3"} {"top": "9", "image_src": "https://p0.meituan.net/movie/46c29a8b8d8424bdda7715e6fd779c66235684.jpg@160w_220h_1e_1c", "name": "魂斷藍(lán)橋", "actor": "費(fèi)雯·麗,羅伯特·泰勒,露塞爾·沃特森", "releasetime": "1940-05-17(美國(guó))", "score": "9.2"} {"top": "10", "image_src": "https://p0.meituan.net/movie/230e71d398e0c54730d58dc4bb6e4cca51662.jpg@160w_220h_1e_1c", "name": "亂世佳人", "actor": "費(fèi)雯·麗,克拉克·蓋博,奧利維婭·德哈維蘭", "releasetime": "1939-12-15(美國(guó))", "score": "9.1"}寫(xiě)入文件
得到數(shù)據(jù)后最后將數(shù)據(jù)保存到文件,通過(guò)JOSN庫(kù)的dumps()方法可以實(shí)現(xiàn)字典的序列化。因?yàn)檫@里要處理中文,將ensure_ascii參數(shù)設(shè)為False就可以保證輸出結(jié)果是中文形式而不是Unicode編碼。代碼如下:
def write_to_file(content): with open("result.txt","a",encoding="utf-8") as f: f.write(json.dumps(content,ensure_ascii = False) + " ") f.close()
其中open()指定寫(xiě)入方式為a尾部寫(xiě)入,這是因?yàn)榇藭r(shí)是for循環(huán)寫(xiě)入數(shù)據(jù),如果用w寫(xiě)入只會(huì)保留最后一組的數(shù)據(jù)。或者在這之前打開(kāi)文件,等寫(xiě)入完數(shù)據(jù)后再關(guān)閉也可以。
通過(guò)調(diào)用write_to_file()方法即可實(shí)現(xiàn)將字典寫(xiě)入到文本文件的過(guò)程。
實(shí)現(xiàn)main()方法接收一個(gè)offset值作為偏移量,然后構(gòu)造URL進(jìn)行爬取。代碼如下:
def main(offset): url = "http://maoyan.com/board/4?offset=" + str(offset) html = get_page(url) for item in parse_page(html): print(item) write_of_file(item)多線程分頁(yè)爬取
上面實(shí)現(xiàn)了給main()傳入一個(gè)offset值爬取單頁(yè)10個(gè)電影的數(shù)據(jù),接下來(lái)使用多線程來(lái)抓取整個(gè)TOP100的電影數(shù)據(jù)。
from multiprocessing import Pool # 引入多線程模塊 if __name__ == "__main__": #創(chuàng)建線程池 pool = Pool() # pool.map第一個(gè)參數(shù)是函數(shù),第二個(gè)參數(shù)是傳遞給函數(shù)的參數(shù) pool.map(main,[i*10 for i in range(10)])
Pool.map()函數(shù)第一個(gè)參數(shù)是函數(shù),第二個(gè)參數(shù)是傳遞給函數(shù)的參數(shù),在上面代碼中是一個(gè)迭代器,將迭代器中的數(shù)字作為參數(shù)依次傳入函數(shù)中。
注意:使用多線程爬取會(huì)導(dǎo)致最后寫(xiě)入到文件內(nèi)的電影數(shù)據(jù)(top值)是亂序的,如需保證爬取到的電影信息寫(xiě)入到文件是按照top值排序的,放棄多線程將代碼改為:
import time #引入時(shí)間模塊 if __name__ == "__main__": for i in range(10): main(offset=i * 10) time.sleep(1)
為突破貓眼反爬蟲(chóng)機(jī)制(速度過(guò)快會(huì)無(wú)響應(yīng)),上面代碼增加了一個(gè)延時(shí)等待。
大功告成!完整代碼如下:
import requests import re import time import json from requests.exceptions import RequestException from multiprocessing import Pool def get_page(url): headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36" } response = requests.get(url,headers = headers) try: if response.status_code == 200: return response.text return None except RequestException: print("request error") return None def parse_page(html): pattern = re.compile("
本文中的代碼地址:https://github.com/grisse/Cra...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/42829.html
摘要:目標(biāo)通過(guò)正則表達(dá)式爬取貓眼電影電影的排名名字電影封面圖片主演上映時(shí)間貓眼評(píng)分,將爬取的內(nèi)容寫(xiě)入文件中。為了加快爬取網(wǎng)頁(yè)的速度,可以開(kāi)啟循環(huán)和多線程當(dāng)需要爬取的信息很大時(shí),這是一個(gè)不錯(cuò)的技巧。 目標(biāo) 通過(guò)Request+正則表達(dá)式爬取貓眼電影TOP100電影的排名、名字、電影封面圖片、主演、上映時(shí)間、貓眼評(píng)分,將爬取的內(nèi)容寫(xiě)入文件中。 流程框架 進(jìn)入到貓眼電影TOP100的頁(yè)面,此時(shí)的U...
摘要:用迭代進(jìn)行異步操作保存寫(xiě)入文件配置啟動(dòng)函數(shù)使用多進(jìn)程加速一秒完成 用正則表達(dá)式實(shí)現(xiàn)一個(gè)簡(jiǎn)單的小爬蟲(chóng) 常用方法介紹 1、導(dǎo)入工具包 import requests #導(dǎo)入請(qǐng)求模塊 from flask import json #導(dǎo)入json模塊 from requests.exceptions import RequestException #異常捕捉模塊 import re #導(dǎo)入正則...
摘要:所以我們?nèi)绻氆@取電影,只需要分開(kāi)請(qǐng)求次,而次的參數(shù)設(shè)置為,,,,即可,這樣我們獲取不同的頁(yè)面結(jié)果之后再用正則表達(dá)式提取出相關(guān)信息就可以得到的所有電影信息了。上一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)正則表達(dá)式下一篇文章網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)解析庫(kù)的使用 上一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---26、正則表達(dá)式下一篇文章:Python3網(wǎng)絡(luò)爬蟲(chóng)實(shí)戰(zhàn)---28、解析庫(kù)的使用:XPath 本節(jié)我們利用 Reque...
摘要:今年的流浪地球這么火,通過(guò)爬取貓眼電影上網(wǎng)友對(duì)該片的評(píng)價(jià)如何。也許很多人在這天通過(guò)看流浪地球過(guò)節(jié)吧。 背景 最近幾年貓眼電影越來(lái)越熱門了,都差不多和豆瓣并駕齊驅(qū)了。今年的《流浪地球》這么火,通過(guò)爬取貓眼電影上網(wǎng)友對(duì)該片的評(píng)價(jià)如何。 爬取貓眼評(píng)論 找到評(píng)論網(wǎng)頁(yè)地址 先打開(kāi)貓眼官網(wǎng)找到《流浪地球》的介紹頁(yè)面:https://maoyan.com/films/248906 showImg(h...
摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...
閱讀 3209·2021-11-25 09:43
閱讀 3418·2021-11-11 16:54
閱讀 844·2021-11-02 14:42
閱讀 3773·2021-09-30 09:58
閱讀 3677·2021-09-29 09:44
閱讀 1291·2019-08-30 15:56
閱讀 2109·2019-08-30 15:54
閱讀 2996·2019-08-30 15:43