天天看點

python爬取貓眼電影排名前100資訊python爬取貓眼電影排名前100介紹請求頭的構造爬取貓眼電影資訊寫入檔案列印資訊分頁爬蟲

python爬取貓眼電影排名前100

學習python有一段時間了,最近,發現python爬蟲挺有趣的,也很好玩,是以學習學習下,這裡我介紹的是爬蟲的入門吧,算是爬蟲裡面最簡單的,其方法主要是使用正則的爬取資訊,可能現在爬蟲技術流行用啥啥架構的,但我覺得打好基礎,明白爬蟲的意義,其實更為重要。

介紹請求頭的構造

學好爬蟲,才發現對于網絡的知識方面的貯備也是要需要的,我這邊主要介紹的是當你去通路網站的時候,有一東西重要的,叫請求頭,用來說明伺服器要使用的附加資訊。

python爬取貓眼電影排名前100資訊python爬取貓眼電影排名前100介紹請求頭的構造爬取貓眼電影資訊寫入檔案列印資訊分頁爬蟲

Accept

請求報頭域,用于指定用戶端可接受哪些類型的資訊

Accept-Language

這是指定用戶端可接受的語言類型

Cookie

也常用cookies,這是網站為了辨識使用者進行會話跟蹤而存儲在使用者本地的資料,作用是為了維持目前的通路會話。

Referer

這是辨識這個請求是從哪個頁面發過去的,伺服器可以拿到這一資訊并做相應的處理,如做源統計、防盜鍊處理等

User-Agent

這是一個特殊的字元串頭,可以使伺服器辨識客戶使用的作業系統及版本,在爬蟲時最好加上,不然很容易被辨認出是爬蟲的行為。

這裡我就介紹常用的幾個參數吧,因為在以後的爬蟲中會經常使用這些參數的

爬取貓眼電影資訊

分析

在爬蟲網頁時,其實也是分情況的,因為有些網站設了反爬蟲的機制,是以在練習初期,我們還是先爬取一些簡單的網站資訊吧,這裡我們爬取的網站為https://maoyan.com/board/4,排行前100名的電影資訊

python爬取貓眼電影排名前100資訊python爬取貓眼電影排名前100介紹請求頭的構造爬取貓眼電影資訊寫入檔案列印資訊分頁爬蟲
python爬取貓眼電影排名前100資訊python爬取貓眼電影排名前100介紹請求頭的構造爬取貓眼電影資訊寫入檔案列印資訊分頁爬蟲

以上二張是分别為第一頁和第二頁,注意觀察他們的url的變化,後面有一個參數offset,這是一個偏移量的參數,當你點選第三頁時,唯一變的就是offset,是以可以猜測這個參數如果為30的話就是代表31-40的電影的資訊情況,以此類推,隻要我們請求十次,而把offset設為0,10,…一直到90,我們再通過正則去比對,這樣我們就爬到了前100頁的電影的資訊。

抓取首頁

在寫代碼前,還需要爬蟲的幾個庫:requests,還有一些json庫time庫,後續完善需用到,這裡我們先要抓取第一頁的網頁資訊,我們寫一個get_one_page的函數,并給他傳入url的參數

def get_one_page(url):
    try:
        headers = {
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
        }
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.text
    except RequestException:
        return None
           

這個我用try函數,能夠捕捉到異常處理,當它請求的狀态碼為200的時候,就會傳回html的整個頁面,異常則傳回none

正則提取資訊

接下來就是打開f12,在開發者模式下的Network監聽元件下檢視源代碼,注意不要去看Elements下的源代碼,因為那裡可能是經過js操作而原始的請求不同

python爬取貓眼電影排名前100資訊python爬取貓眼電影排名前100介紹請求頭的構造爬取貓眼電影資訊寫入檔案列印資訊分頁爬蟲

這是第一名的電影資訊對應的html代碼,可以發現,一部完整的電影資訊在一個dd節點上,而排名資訊是在class為board-index的 i 節點上,這裡我們推薦用非貪婪比對,正規表達式為

<dd>.*?board-index.*?>(.*?)</i>
           

然後要提取電影的圖檔,正則可以寫成

<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)"
           

然後去比對電影的名稱、主演、釋出時間也是如此。

最後最終的正則比對為:

<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>
           

這樣我們就再構造個函數parse_one_page()

def parse_one_page(html):
    pattern = re.compile(
        '<dd>.*?board-index.*?>(.*?)</i>.*?src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', 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]
        }
    print(items)
           

這裡的話,complie是将正則字元串編譯成正規表達式的對象,最後re.S是一個修飾符的作用,最後的yield函數則是為把一些資訊用key-value的形式以字典的方式展現出來,這樣我們就提取到了首頁的資訊了。

寫入檔案

我們可以将爬蟲擷取的資訊給存放在txt的檔案下,這裡的話,需要用到json庫的dumps()的方法實作對字典的序列化的操作,代碼如下:

def write_to_file(content):
    with open('result.txt', 'a' ,encoding='utf-8') as f:
        print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
           

列印資訊

我們還需要通過一個主函數main()來列印電影資訊,并将結果到txt檔案下

def main(offer):
    url = 'https://maoyan.com/board/4?offset=0' + str(offer)
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)
           

分頁爬蟲

最後我們需要爬蟲十頁的結果,則offset當作變量,可以這樣:

if __name__ == '__main__':
    for i in range(10):
        main(offer = i*10)
        time.sleep(5)
           

range函數,可以建立一個整數清單,一般用在 for 循環中,不過它預設從0開始,比如range(5),這是從0開始到4結束,列印出來的結果為[0,1,2,3,4],最後這個做一個延時等待,怕速度過快,沒有響應。

最後進行代碼整合一下,檢視結果,發現成功的爬取到了前100的電影資訊了,是不是很神奇,也很激動不,哈哈哈。