Python 抓取猫眼电影TOP100数据

1. 利用 requests 库和正则表达式抓取猫眼电影 TOP100 的相关内容

(1)目标网址如下,共10页。

Python 抓取猫眼电影TOP100数据

https://maoyan.com/board/4?offset=0
https://maoyan.com/board/4?offset=10

https://maoyan.com/board/4?offset=90

import re
import json
import time
import requests
from requests.exceptions import RequestException
#from fake_useragent import UserAgent

(2)定义get_one_page(url)方法,获取指定网页的源代码。

def get_one_page(url):
    """
    发送请求,获取响应!
    :param url:
    :return:
    """
    try:
        headers = {
            'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'
        }
        response = requests.get(url,timeout=30, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

(3)定义parse_one_page(html)方法,解析源代码,获取每条电影信息。

def parse_one_page(html):
    """
    利用正则表达式提取响应里的电影信息,并形成结构化数据!
    :param html:
    :return:
    """
    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, str(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()
        }

(4)定义write_to_file(content)方法,将电影信息写入Excel文件中。

def write_to_file(content):
    """
    存储数据,通过JSON库的dumps()方法实现字典的序列化,写入到一个文本文件!
    :param content:
    :return:
    """
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + ',\n')

(5)定义main(offset)方法,总合所有方法。

def main(offset):
    """
    通过构造URL中的offset参数(偏移量值),实现TOP100十页数据的爬取!
    :param offset:
    :return:
    """
    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)

(6)使用for循环遍历所有网址。

if __name__ == '__main__':
    for i in range(1):
        main(offset=i * 10)
        time.sleep(5)
import re
import json
import time
import requests
from requests.exceptions import RequestException
#from fake_useragent import UserAgent


def get_one_page(url):
    """
    发送请求,获取响应!
    :param url:
    :return:
    """
    try:
        headers = {
            'User-Agent':'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0'
        }
        response = requests.get(url,timeout=30, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):
    """
    利用正则表达式提取响应里的电影信息,并形成结构化数据!
    :param html:
    :return:
    """
    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, str(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):
    """
    存储数据,通过JSON库的dumps()方法实现字典的序列化,写入到一个文本文件!
    :param content:
    :return:
    """
    with open('result.txt', 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + ',\n')

def main(offset):
    """
    通过构造URL中的offset参数(偏移量值),实现TOP100十页数据的爬取!
    :param offset:
    :return:
    """
    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(1):
        main(offset=i * 10)
        time.sleep(5)

上一篇:requests爬取猫眼排行榜


下一篇:数据分析——医科大学排名