Requests庫+正則爬取貓眼電影Top100

聲明:此篇文章主要是觀看靜覓教學視頻後作的筆記,原教程地址:https://cuiqingcai.com/html

流程框架python

1.抓取單頁內容:利用requests請求目標站點,獲得單個網頁HTML代碼,返回結果。git

2.正則表達式分析:根據HTML代碼分析獲得電影的名稱,主演,上映時間,評分,圖片連接等信息github

3.開啓循環及多線程:對多頁內容遍歷,開啓多線程提升抓取速度正則表達式

4.保存至文件:經過文件的形式將結果保存,每一部電影一個結果一行Json字符串json

流程設計多線程

1.maoyan_Spider函數是一個總體的爬蟲調度器,其中包含了請求的url地址,headers請求頭框架

def maoyan_Spider(offset):
    """
        做用:貓眼電影調度器
        offset:get的頁碼參數
    """
    url = 'http://maoyan.com/board/4?offset=' + str(offset)
    headers = {
        'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36'
    }

    # 獲取單頁html
    html = get_one_page(url, headers)
    # print(html)
    
    # 將每一頁的電影信息解析,並寫入文件中
    for item in parse_one_page(html):
        # print(item)
        item_str = json.dumps(item, ensure_ascii=False)
        write_to_file(item_str)

2.首先以單個網頁源代碼進行分析,進入到貓眼電影官網榜單,經過構造請求能夠拿到http://maoyan.com/board/4?的源碼ide

def get_one_page(url, headers):
    """
        做用:獲取一頁的源碼
        url:請求地址
        headers:請求頭
    """
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

3.接下來感受整個爬蟲的難點就在於解析,源碼有了,這裏我使用的仍是正則來提取數據,稍有字符寫錯,可能就解析不出來了。下面以Top榜第一名爲例進行解析,並轉化爲json格式保存函數

<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 alt="霸王別姬" class="board-img" src="http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c">
    </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>

    能夠得出其字符串匹配規則是

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

4.而後經過使用re模塊findall方法找到全部電影信息,電影信息包含排名,圖片地址,電影名稱,主演,上映時間,評分。findall方法返回的是一個元素爲元組的列表,而後遍歷這些元素經過yield生成json字典形式

def parse_one_page(html):
    """
        做用:解析一頁的源碼
        html:網頁源碼
    """
    pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>', re.S)
    items = pattern.findall(html)
    # print(items)
    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]
        }

5.最後是寫入文件,由於此處是對每一個電影信息進行寫入,因此注意寫入方法用的是a,不是w。不然寫入的內容只有一個電影信息,也就是Top100

def write_to_file(item):
    """
        做用:往文件中寫入內容
        item:處理後的單個電影信息
    """
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(item + '\n')

6.完整源碼地址:https://github.com/XiaoFei-97/maoyan_Spider-Top100

原文出處:https://www.jzfblog.com/detail/64,文章的更新編輯以此連接爲準。歡迎關注源站文章!

相關文章
相關標籤/搜索