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

資訊專欄INFORMATION COLUMN

Python3網絡爬蟲實戰---27、Requests與正則表達式抓取貓眼電影排行

SwordFly / 1952人閱讀

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

上一篇文章:Python3網絡爬蟲實戰---26、正則表達式
下一篇文章:Python3網絡爬蟲實戰---28、解析庫的使用:XPath

本節我們利用 Requests 和正則表達式來抓取貓眼電影 TOP100 的相關內容,Requests 相較于 Urllib 使用更加方便,而目前我們還沒有系統學習 HTML 解析庫,所以可能對 HTML 的解析庫不是很了解,所以本節我們選用正則表達式來作為解析工具。

1. 本節目標

本節我們要提取出貓眼電影 TOP100 榜的電影名稱、時間、評分、圖片等信息,提取的站點 URL 為:http://maoyan.com/board/4,提取的結果我們以文件形式保存下來。

2. 準備工作

在本節開始之前請確保已經正確安裝好了 Requests 庫,如果沒有安裝可以參考第一章的安裝說明。

3. 抓取分析

本節我們需要抓取的目標站點為:http://maoyan.com/board/4,打開之后便可以查看到榜單的信息,如圖 3-11 所示:

圖 3-11 榜單信息
排名第一的電影是霸王別姬,頁面中顯示的有效信息有影片名稱、主演、上映時間、上映地區、評分、圖片等信息。
網頁下滑到最下方可以發現有分頁的列表,我們點擊一下第二頁觀察一下頁面的URL和內容發生了怎樣的變化,如圖 3-12 所示:

圖 3-12 頁面 URL 變化
可以發現頁面的 URL 變成了:http://maoyan.com/board/4?off...,相比之前的URL多了一個參數,那就是 offset=10,而目前顯示的結果是排行 11-20 名的電影,初步推斷這是一個偏移量的參數,我們再點擊下一頁,發現頁面的 URL 變成了:http://maoyan.com/board/4?off...,參數 offset 變成了 20,而顯示的結果是排行 21-30 的電影。
由此我們可以總結出規律,offset 代表了一個偏移量值,如果偏移量為 n,則顯示的電影序號就是 n+1 到 n+10,每頁顯示 10 個。所以我們如果想獲取 TOP100 電影,只需要分開請求 10 次,而 10 次的 offset 參數設置為 0,10,20,...,90 即可,這樣我們獲取不同的頁面結果之后再用正則表達式提取出相關信息就可以得到 TOP100 的所有電影信息了。

4. 抓取首頁

接下來我們用代碼實現這個過程,首先抓取第一頁的內容,我們實現一個 get_one_page() 方法,傳入 url 參數,然后將抓取的頁面結果返回,然后再實現一個 main() 方法調用一下,初步代碼實現如下:
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()
這樣運行之后我們就可以成功獲取首頁的源代碼了,獲取源代碼之后我們就需要對頁面進行解析,提取出我們想要的信息。

5. 正則提取

接下來我們回到網頁看一下頁面的真實源碼,在開發者工具中 Network 監聽,然后查看一下源代碼,如圖 3-13 所示:

圖 3-13 源代碼
注意這里不要在 Elements 選項卡直接查看源碼,此處的源碼可能經過 JavaScript 的操作而和原始請求的不同,我們需要從Network選項卡部分查看原始請求得到的源碼。
查看其中的一個條目的源代碼如圖 3-14 所示:

圖 3-14 源代碼
可以看到一部電影信息對應的源代碼是一個 dd 節點,我們用正則表達式來提取這里面的一些電影信息,首先我們需要提取它的排名信息,而它的排名信息是在 class 為 board-index 的 i 節點內,所以所以這里利用非貪婪匹配來提取 i 節點內的信息,正則表達式寫為:

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

隨后我們需要提取電影的圖片,可以看到在后面有個 a 節點,其內部有兩個 img 節點,經過檢查后發現第二個 img 節點的 data-src屬性是圖片的鏈接,在這里我們提取第二個 img 節點的 data-src屬性,所以正則可以改寫如下:

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

再往后我們需要提取電影的名稱,它在后面的 p 節點內,class 為 name,所以我們可以用 name 做一個標志位,然后進一步提取到其內 a 節點的正文內容,正則改寫如下:

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

隨后如果需要再提取主演、發布時間、評分等內容的話都是同樣的原理,最后正則表達式寫為:

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

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

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

這樣我們一個正則表達式可以匹配一個電影的結果,里面匹配了 7 個信息,接下來我們通過調用 findall() 方法提取出所有的內容,實現一個 parse_one_page() 方法如下:

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 個電影信息都提取出來了,是一個列表形式,輸出結果如下:

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

但這樣還不夠,數據比較雜亂,我們再將匹配結果處理一下,遍歷提取結果并生成字典,方法改寫如下:

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

這樣我們就可以成功提取出電影的排名、圖片、標題、演員、時間、評分內容了,并把它賦值為一個個的字典,形成結構化數據,運行結果如下:

{"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": "這個殺手不太冷", "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": "泰坦尼克號", "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": "唐伯虎點秋香", "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. 寫入文件

隨后我們將提取的結果寫入文件,在這里直接寫入到一個文本文件中,通過 json 庫的 dumps() 方法實現字典的序列化,并指定 ensure_ascii 參數為 False,這樣可以保證輸出的結果是中文形式而不是 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,)+"
")

通過調用 write_to_json() 方法即可實現將字典寫入到文本文件的過程,此處的 content 參數就是一部電影的提取結果,是一個字典。

7. 整合代碼

最后實現一個 main() 方法負責調用以上實現的方法,將單頁的電影結果寫入到文件,實現如下:

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

但我們需要抓取的是 TOP100 的電影,所以我們還需要遍歷一下給這個鏈接傳入一個 offset 參數,實現其他 90 部電影的爬取,添加如下調用即可:

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

這里還需要將 main() 方法修改一下,接收一個 offset 值作為偏移量,然后構造 URL 進行爬取,實現如下:

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) + " ") 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)

現在貓眼多了反爬蟲,如果速度過快則會無響應,所以這里又增加了一個延時等待。

運行結果

最后我們運行一下代碼,類似的輸出結果如下:

{"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": "笠智眾,原節子,杉村春子", "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": "http://p1.meituan.net/movie/__44335138__8470779.jpg@160w_220h_1e_1c", "title": "遷徙的鳥", "actor": "雅克·貝漢,菲利普·拉波洛,Philippe Labro", "time": "2001-12-12(法國)", "score": "9.1"}

中間的部分輸出結果已省略,可以看到這樣就成功把 TOP100 的電影信息爬取下來了。
這時我們再看下文本文件,結果如圖 3-15 所示:

圖 3-15 運行結果
可以看到電影信息也已全部保存到了文本文件中,大功告成!

10. 本節代碼

本節的代碼地址為:
https://github.com/oldmarkfac...

11. 結語

本節我們通過爬取貓眼 TOP100 的電影信息練習了 Requests 和正則表達式的用法,這是最基礎的實例,希望大家可以通過這個實例對爬蟲的實現有一個最基本的思路,也對這兩個庫的用法有更深一步的體會。

上一篇文章:Python3網絡爬蟲實戰---26、正則表達式
下一篇文章:Python3網絡爬蟲實戰---28、解析庫的使用:XPath

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

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

相關文章

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

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

    Harriet666 評論0 收藏0
  • Python3網絡爬蟲實戰---26、正則達式

    摘要:上一篇文章網絡爬蟲實戰高級用法下一篇文章網絡爬蟲實戰與正則表達式抓取貓眼電影排行本節我們看一下正則表達式的相關用法,正則表達式是處理字符串的強大的工具,它有自己特定的語法結構,有了它,實現字符串的檢索替換匹配驗證都不在話下。 上一篇文章:Python3網絡爬蟲實戰---25、requests:高級用法下一篇文章:Python3網絡爬蟲實戰---27、Requests與正則表達式抓取貓眼...

    Pocher 評論0 收藏0
  • Python3網絡爬蟲實戰---28、解析庫的使用:XPath

    摘要:上一篇文章網絡爬蟲實戰與正則表達式抓取貓眼電影排行下一篇文章網絡爬蟲實戰解析庫的使用上一節我們實現了一個最基本的爬蟲,但提取頁面信息時我們使用的是正則表達式,用過之后我們會發現構造一個正則表達式還是比較的繁瑣的,而且萬一有一點地 上一篇文章:Python3網絡爬蟲實戰---27、Requests與正則表達式抓取貓眼電影排行下一篇文章:Python3網絡爬蟲實戰---29、解析庫的使用:...

    abson 評論0 收藏0
  • node網絡爬蟲實例了解下?

    摘要:今天給大家分享的是爬蟲,寫得不好的大家多關照,指出背景交代,以下寫的都是參照網絡爬蟲開發實戰用實現的,所以的具體思路什么的,大家可以去看書上的介紹,感興趣的,可以去了解一波。 今天給大家分享的是node爬蟲,寫得不好的大家多關照,指出 背景交代,以下寫的demo都是參照《python3網絡爬蟲開發實戰》用node實現的,所以demo的具體思路什么的,大家可以去看書上的介紹,感興趣的,可...

    陸斌 評論0 收藏0
  • 零基礎如何學爬蟲技術

    摘要:楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,。本文來源知乎作者路人甲鏈接楚江數據提供網站數據采集和爬蟲軟件定制開發服務,服務范圍涵蓋社交網絡電子商務分類信息學術研究等。 楚江數據是專業的互聯網數據技術服務,現整理出零基礎如何學爬蟲技術以供學習,http://www.chujiangdata.com。 第一:Python爬蟲學習系列教程(來源于某博主:htt...

    KunMinX 評論0 收藏0

發表評論

0條評論

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