成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

requests+正則表達式+multiprocessing多線程抓取貓眼電影TOP100

jifei / 2656人閱讀

摘要:本文介紹利用庫庫和正則表達式爬取貓眼電影電影的相關(guān)信息,提取出電影名稱上映時間評分封面圖片等信息,將爬取的內(nèi)容寫入到文件中。獲取到不同的網(wǎng)頁后使用正則表達式提取出我們要的信息,就可以得到電影信息了,可以使用多線程加速爬取。

本文介紹利用Requests庫、multiprocessing庫和正則表達式爬取貓眼電影TOP100電影的相關(guān)信息,提取出電影名稱、上映時間、評分、封面圖片等信息,將爬取的內(nèi)容寫入到文件中。站點URL為 http://maoyan.com/board/4

準備

本文使用了Requests庫,使用pip安裝: pip install requests

分析

打開http://maoyan.com/board/4,可以看到榜單信息。如下圖所示

排名第一的電影是霸王別姬,可以提取的信息有電影名稱、主演、上映時間、評分、封面圖等。
點擊頁面下方的分頁列表翻頁到第二頁,會發(fā)現(xiàn)URL會變成https://maoyan.com/board/4?offset=10,比首頁多了個offset=10 參數(shù),而目前顯示的是排名11-20的電影,初步判斷這是偏移量參數(shù)。再點擊下一頁,URL變成了https://maoyan.com/board/4?offset=20,offset變成了20,顯示的是排名21-30的電影。
由此可見,offset代表偏移量,偏移量為n,則顯示的是排名n+1~n+10的電影,每頁顯示10個電影。所以,想要獲取TOP100電影信息,只要分開獲取10次,只需把10次請求的URL中offset參數(shù)分別設(shè)為 0,10,20,30...90即可(首頁的offset值為0)。獲取到不同的網(wǎng)頁后使用正則表達式提取出我們要的信息,就可以得到TOP100電影信息了,可以使用多線程加速爬取。

爬取實現(xiàn) 爬取首頁

實現(xiàn)get_page()方法,傳入url參數(shù)可以將抓取的頁面結(jié)果返回。以下代碼獲取首頁內(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()

運行之后就成功獲取到了首頁的源代碼,接下來使用正則表達式進行解析,提取出我們想要的信息。

正則提取

回到瀏覽器頁面,在開發(fā)者工具Network監(jiān)聽組件中查看源代碼。如圖:

值得注意的是這里不是從Elements選項卡里查看的源代碼,因為Elements里看到的源代碼很有可能經(jīng)過Javascript處理過從而和原始請求不同,所以要從Network選項卡里查看原始請求得到的源碼。

查看此處代碼:


不難發(fā)現(xiàn),要爬取的每部電影信息都在

標簽里,接下來使用正則表達式提取信息。

首先,提取它的排名信息,它的排名信息在classboard-indexi標簽里,使用非貪婪匹配來提取i內(nèi)的信息,正則表達式可以寫為:

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

接下來提取電影的封面圖片。在排名后面的a便簽里有兩個img便簽,經(jīng)過檢查,第二個img是電影的封面圖片,正則:.*?data-src="(.*?)"

然后提取電影的名稱,它在classname

便簽內(nèi),可以使用name作為標志位進一步提取到其內(nèi)a的文本內(nèi)容,正則寫為:.*?name.*?a.*?>(.*?)

提取主演:.*?star">(.*?)


提取上映時間:.*?releasetime">(.*?)


提取評分:.*?integer">(.*?).*?fraction">(.*?).*?

最后正則表達式寫為:

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

.*?releasetime">(.*?)

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

上面的正則表達式可以匹配一個電影,匹配了7條信息,接下來可以通過findall()方法提取所有內(nèi)容??梢远x一個用來解析頁面的方法parse_page(),代碼如下:

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

" + ".*?releasetime">(.*?)

.*?integer">(.*?).*?fraction">(.*?).*?
",r.S) #re.S使.能匹配任意字符 items = pattern.findall(str(html))

這樣就成功得拿到了一頁10個電影的信息,這是一個列表,獲取到的結(jié)果如下:

[("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")]

這樣的數(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ù)了,每個電影的信息都包含在一個字典里。獲得的結(jié)果如下:

{"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"}
寫入文件

得到數(shù)據(jù)后最后將數(shù)據(jù)保存到文件,通過JOSN庫的dumps()方法可以實現(xià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()指定寫入方式為a尾部寫入,這是因為此時是for循環(huán)寫入數(shù)據(jù),如果用w寫入只會保留最后一組的數(shù)據(jù)?;蛘咴谶@之前打開文件,等寫入完數(shù)據(jù)后再關(guān)閉也可以。
通過調(diào)用write_to_file()方法即可實現(xiàn)將字典寫入到文本文件的過程。

main方法

實現(xiàn)main()方法接收一個offset值作為偏移量,然后構(gòu)造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)
多線程分頁爬取

上面實現(xiàn)了給main()傳入一個offset值爬取單頁10個電影的數(shù)據(jù),接下來使用多線程來抓取整個TOP100的電影數(shù)據(jù)。

from multiprocessing import Pool  # 引入多線程模塊

if __name__ == "__main__":
    #創(chuàng)建線程池
    pool = Pool()
    # pool.map第一個參數(shù)是函數(shù),第二個參數(shù)是傳遞給函數(shù)的參數(shù)
    pool.map(main,[i*10 for i in range(10)])

Pool.map()函數(shù)第一個參數(shù)是函數(shù),第二個參數(shù)是傳遞給函數(shù)的參數(shù),在上面代碼中是一個迭代器,將迭代器中的數(shù)字作為參數(shù)依次傳入函數(shù)中。
注意:使用多線程爬取會導(dǎo)致最后寫入到文件內(nèi)的電影數(shù)據(jù)(top值)是亂序的,如需保證爬取到的電影信息寫入到文件是按照top值排序的,放棄多線程將代碼改為:

import time #引入時間模塊
if __name__ == "__main__":
    for i in range(10):
        main(offset=i * 10)
        time.sleep(1)

為突破貓眼反爬蟲機制(速度過快會無響應(yīng)),上面代碼增加了一個延時等待。

大功告成!完整代碼如下:

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("
.*?board-index.*?>(d+).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star">(.*?)

" + ".*?releasetime">(.*?)

.*?integer">(.*?).*?fraction">(.*?).*?
",re.S) #re.S使.能匹配任意字符 items = pattern.findall(str(html)) 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] } 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() 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_to_file(item) # 如需保證電影順序,則放棄使用多線程 # if __name__ == "__main__": # for i in range(10): # main(offset=i * 10) # time.sleep(1) if __name__ == "__main__": pool = Pool() pool.map(main,[i*10 for i in range(10)])

本文中的代碼地址:https://github.com/grisse/Cra...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/42829.html

相關(guān)文章

  • Requests+正則達式爬取貓眼電影

    摘要:目標通過正則表達式爬取貓眼電影電影的排名名字電影封面圖片主演上映時間貓眼評分,將爬取的內(nèi)容寫入文件中。為了加快爬取網(wǎng)頁的速度,可以開啟循環(huán)和多線程當需要爬取的信息很大時,這是一個不錯的技巧。 目標 通過Request+正則表達式爬取貓眼電影TOP100電影的排名、名字、電影封面圖片、主演、上映時間、貓眼評分,將爬取的內(nèi)容寫入文件中。 流程框架 進入到貓眼電影TOP100的頁面,此時的U...

    30e8336b8229 評論0 收藏0
  • python正則達式簡單爬蟲入門+案例(爬取貓眼電影TOP榜)

    摘要:用迭代進行異步操作保存寫入文件配置啟動函數(shù)使用多進程加速一秒完成 用正則表達式實現(xiàn)一個簡單的小爬蟲 常用方法介紹 1、導(dǎo)入工具包 import requests #導(dǎo)入請求模塊 from flask import json #導(dǎo)入json模塊 from requests.exceptions import RequestException #異常捕捉模塊 import re #導(dǎo)入正則...

    xiaowugui666 評論0 收藏0
  • Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---27、Requests正則達式抓取貓眼電影排行

    摘要:所以我們?nèi)绻氆@取電影,只需要分開請求次,而次的參數(shù)設(shè)置為,,,,即可,這樣我們獲取不同的頁面結(jié)果之后再用正則表達式提取出相關(guān)信息就可以得到的所有電影信息了。上一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)正則表達式下一篇文章網(wǎng)絡(luò)爬蟲實戰(zhàn)解析庫的使用 上一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---26、正則表達式下一篇文章:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)---28、解析庫的使用:XPath 本節(jié)我們利用 Reque...

    SwordFly 評論0 收藏0
  • 從13萬貓眼評論看看《流浪地球》到底怎么樣

    摘要:今年的流浪地球這么火,通過爬取貓眼電影上網(wǎng)友對該片的評價如何。也許很多人在這天通過看流浪地球過節(jié)吧。 背景 最近幾年貓眼電影越來越熱門了,都差不多和豆瓣并駕齊驅(qū)了。今年的《流浪地球》這么火,通過爬取貓眼電影上網(wǎng)友對該片的評價如何。 爬取貓眼評論 找到評論網(wǎng)頁地址 先打開貓眼官網(wǎng)找到《流浪地球》的介紹頁面:https://maoyan.com/films/248906 showImg(h...

    lemanli 評論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<