1. 程式人生 > >【爬蟲學習1】正則表示式加Requests爬取貓眼電影排行

【爬蟲學習1】正則表示式加Requests爬取貓眼電影排行

Requests獲取網頁資料

運用Requests獲得網頁

import requests
##獲取單個網頁資料
def get_one_page(url):
    response = requests.get(url)
    return response.text

def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    print(html)
if __name__ == '__main__':
    main()

加入異常處理和響應資訊確認,將get_one_page()函式修改為

from requests.exceptions import RequestException
def get_one_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None 

執行獲得網頁資料成功

這裡寫圖片描述

正則表示式匹配資料

正則表示式學習參看
這裡

進入貓眼電影網->TOP100榜
按F12開啟審查元素工具
觀察原始碼發現每部影片資訊包含在一個dd標籤內
這裡寫圖片描述
展開結構得到如下內容

<dd>
    <i class="board-index board-index-1">1</i>
    <a href="/films/1203" title="霸王別姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}">
      <img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png"
alt="" class="poster-default" />
<img data-src="http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c" alt="霸王別姬" class="board-img" /> </a> <div class="board-item-main"> <div class="board-item-content"> <div class="movie-item-info"> <p class="name"><a href="/films/1203" title="霸王別姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王別姬</a></p> <p class="star"> 主演:張國榮,張豐毅,鞏俐 </p> <p class="releasetime">上映時間:1993-01-01(中國香港)</p> </div> <div class="movie-item-number score-num"> <p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div> </div> </div> </dd>

於是構建正則表示式函式

import re
def parse_one_page(html):
    '''進行正則函式匹配'''
    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>' #排名
                         +'.*?data-src="(.*?)".*?name"><a' #圖片
                         +'.*?}">(.*?)</a>'  #名字
                         +'.*?star">\s*(.*?)\s*</p>' #主演
                         +'.*?releasetime">(.*?)</p'  #上映時間
                         +'.*?integer">(.*?)</i'  #排名個位
                         +'.*?fraction">(.*?)</i>.*?</dd>', re.S)  #排名小數點位
    items = re.findall(pattern, html)
    return items

主函式修改為

def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    print(parse_one_page(html))

獲得輸出

正則表示式獲取資料

資料格式化

可以發現正則表示式給出的是元組列表
嘗試對資料進行格式化處理

def parse_one_page(html):
    '''進行正則函式匹配'''
    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>' #排名
                         +'.*?data-src="(.*?)".*?name"><a' #圖片
                         +'.*?}">(.*?)</a>'  #名字
                         +'.*?star">\s*(.*?)\s*</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][3:],
            'times': item[4][5:15],
            'ranks': item[5]+item[6]
        }

相應的主函式修改成

def main():
    url = 'http://maoyan.com/board/4'
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)

執行得到
資料格式化結果

多頁面爬取

下面將資料從1-10擴充套件到1-100
研究網址發現,從第2頁開始網址變為

def one_page(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)

def main():
    for i in range(10):
        one_page(i*10)

獲得輸出

這裡寫圖片描述

儲存為檔案

def write_to_file(content):
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')
        f.close()
    ##讓json輸出中文而非Unicode碼
    ##在open中加入encoding='utf-8'  dumps中加入ensure_ascii=False

one_page函式相應修改

def one_page(offset):
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    html = get_one_page(url)
    for item in parse_one_page(html):
        write_to_file(item)

開啟results.txt即看到結果
這裡寫圖片描述