Python網絡爬蟲-抓取貓眼電影TOP100

本節將使用簡單的requests庫和正則表達式來獲取貓眼電影網站TOP100的電影相關數據。

1. 目標

爬取貓眼電影TOP100的電影相關數據如電影名稱、演員、評分等(https://maoyan.com/board/4),並保存到文件中。

2. 分析

分析結果:

當我們點擊頁面最下方的第二頁的時候,發現頁面的請求url變爲https://maoyan.com/board/4?offset=10,並且返回的是第二頁的TOP電影,因此當我們請求其他的頁面的時候只需將首頁url參數進行相關變化即可。

3. 抓取首頁

import requests

def get_one_page(url):
    # 根據源碼分析,構造請求頭
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/52.0.2743.116 Safari/537.36'
    }
    response = requests.get(url, headers = headers)
    if response.status_code == 200:
        return response.text
    return None

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

這樣運行後,就可以成功獲取貓眼電影網站首頁的的所有html代碼,下面就需要根據我們所需要的數據,來解析html源代碼

4. 解析源碼

在pycharm裏面新建一個html文件,將首頁的html結果貼進去,方便查看html結構。

正則匹配:

import re

# 解析源碼
def parse_one_page(html):
    pattern1 = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?<img data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>'
                          '.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>', re.S)
    items = re.findall(pattern1, html)
    for item in items:
        yield {
            'index' : item[0],
            'image' : item[1],
            'title' : item[2].strip(),
            'actor' : item[3].strip()[3:] if len(item[3]) > 3 else '',
            'time' : item[4].strip()[5:] if len(item[4]) > 5 else '',
            'score' : item[5].strip() + item[6].strip()
        }

5. 寫入文件

import json

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')

整體代碼如下:

# -*- coding: utf-8 -*-
# @Time    : 2019-07-10 21:29
# @Author  : xudong
# @email   : [email protected]
# @Site    : 
# @File    : requestsTest.py
# @Software: PyCharm

import requests
import re
import json


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


def get_top_movie(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)


def parse_one_page(html):
    pattern1 = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?<img data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>'
                          '.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>', re.S)
    items = re.findall(pattern1, html)
    for item in items:
        yield {
            'index' : item[0],
            'image' : item[1],
            'title' : item[2].strip(),
            'actor' : item[3].strip()[3:] if len(item[3]) > 3 else '',
            'time' : item[4].strip()[5:] if len(item[4]) > 5 else '',
            'score' : item[5].strip() + item[6].strip()
        }


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')


if __name__ == '__main__':
    for i in range(10):
        get_top_movie(i * 10)

項目的目錄下生成result.txt文件,打開查看數據是否存在,如果存在,則目標達成。

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