天天看點

python 爬取貓眼電影排行

python 爬取貓眼電影排行前 100

  1. 分析要爬取頁面的 url
  2. 通過 url 擷取網頁源碼
  3. 通過
  4. 将資訊貯存為合适的格式
  5. 用 json 格式寫入檔案
import requests
import re
import json
import time
from requests.exceptions import RequestException

def get_one_page(url):  
    """
    擷取目前 url 的網頁源碼
    """
    try:
        headers = {     # 構造請求頭
        'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 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):
    pattern = re.compile(       # 構造正規表達式對象
        '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.'
        +'*?releasetime.*?>(.*?)</p>.*?integer.*?(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',
        re.S)
    items = re.findall(pattern, html)  # items 是清單,每一個元素都是字元串元組
    for item in items:
        yield {             # 傳回一個生成器,每個元素是字典
            'index' : item[0],
            'image' : item[1],
            'title' : item[2],              # strip 移除字元串頭尾空格換行
            'actor' : item[3].strip()[3:],  # "主演:" 後面的字元
            'time' : item[4].strip()[5:],   # "上映時間:" 後面的字元
            'score' : item[5] + item[6]
        }

def write_to_file(content):     # 傳入的是一個字典,這裡用到了 json 的加載檔案
    with open('result.txt', 'a', encoding='utf-8') as f:
        print(type(json.dumps(content)))
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
    f.close()

def main(offset):       # 每次爬取一個頁面的 10 部電影的資訊
    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(0.5)         # 每次等待 0.5 秒,防止反爬