Python爬蟲(一)--爬取貓眼Top100排行

1.概述

    這是博主接觸的第一個爬蟲實例,利用python的request庫和正則表達式對貓眼網站的Top100電影進行爬取,將結果打印出來並保存成txt文件。關鍵的部分有以下三點:

  1. python中request庫的簡單使用。
  2. 利用re模塊來解析request到的頁面。
  3. json格式文件存儲和讀取方法。

2.詳細代碼以及註釋如下:

# -*-coding:utf-8 -*-
import json
import requests
from requests.exceptions import RequestException
import re
import time


def get_one_page(url):
    try:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
        }
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None


def parse_one_page(html):
    #re.S使得匹配包括換行符在內的所有字符。
    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-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]
        }#yield執行後並沒有退出,每次遇到關鍵字後返回相應結果,保留函數當前的執行狀態。直到函數執行完。
        #理解爲播放和暫停更佳。

'''
def func():
    for i in range(0,3):
        yield i
        
f=func()
f.next()
f.next()

def func(n):
    for i in range(0,n):
        val = yield i        
        print val
 
f = func(10)
f.next()
#f.send(None)
f.send(2)
f.send(10)
print f.next()
'''


def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')#inorder to output the chinese


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)

需要注意的以下幾點:

  1. 貓眼電影網站爬取時,需要加入User-Agent字段,具體的內容可以通過瀏覽器的開發工具來查看,使用Chrome瀏覽器採用如下的方式:進入瀏覽器後右鍵單擊,點擊檢查,然後輸入貓眼網址,在獲得請求中尋找NetWork選項,選中左邊的任意一條請求,便可看到如下顯示的內容,其中就有我們需要的User-Agent,添加後再進行後續的操作。

              

    2.關於正則表達式的匹配,很長的一串字符看起來讓人很難理解,可以一點點拆開來看。

 

    如上圖所示,還是進入瀏覽器的開發工具,按上述步驟來選定Top100中排行第一的電影,霸王別姬,我們要爬取所有的電影時候,首先就需要掌握單個電影的全部信息,然後採用遍歷的方式便可以獲取到所有的電影。選中霸王別姬後,第一眼看到就是<dd>節點,我們將這個節點下所有的子節點全部打開,對應着parse_one_page中的正則表達式來看,就可以看得很清楚,這種匹配方式結合re的非貪婪方式,將單個電影的有效信息全部匹配,並在後續yield操作中將信息羅列開來,顯示清楚。

    3.關於json格式文件的存儲

    json全稱爲JavaScript Object Notation,JavaScript標記對象,通過對象和數組的組合來表示數據,是一種輕量級的數據交換格式。常用的數據處理方式有兩種:Json的loads方法將JSON文本字符串轉位JSON對象,dumps方法將JSON對象轉位文本字符串,這裏使用的是後者。

總體來說,代碼很簡單,很容易理解,多敲幾遍就沒有什麼大問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章