国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

jifei / 2648人閱讀

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

本文介紹利用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=20offset變成了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選項卡里查看原始請求得到的源碼。

查看此處代碼:


不難發現,要爬取的每部電影信息都在

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

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

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

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

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

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

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


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


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

最后正則表達式寫為:

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

.*?releasetime">(.*?)

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

上面的正則表達式可以匹配一個電影,匹配了7條信息,接下來可以通過findall()方法提取所有內容。可以定義一個用來解析頁面的方法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個電影的信息,這是一個列表,獲取到的結果如下:

[("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方法

實現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("
.*?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...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42829.html

相關文章

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

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

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

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

    xiaowugui666 評論0 收藏0
  • Python3網絡爬蟲實戰---27、Requests正則達式抓取貓眼電影排行

    摘要:所以我們如果想獲取電影,只需要分開請求次,而次的參數設置為,,,,即可,這樣我們獲取不同的頁面結果之后再用正則表達式提取出相關信息就可以得到的所有電影信息了。上一篇文章網絡爬蟲實戰正則表達式下一篇文章網絡爬蟲實戰解析庫的使用 上一篇文章:Python3網絡爬蟲實戰---26、正則表達式下一篇文章:Python3網絡爬蟲實戰---28、解析庫的使用:XPath 本節我們利用 Reque...

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

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

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

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

    Harriet666 評論0 收藏0

發表評論

0條評論

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