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