Python 抓取猫眼电影TOP100数据

133 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

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

(1)猫眼电影网址如下,共10页。

在这里插入图片描述maoyan.com/board/4?off… maoyan.com/board/4?off… ... maoyan.com/board/4?off…

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>'#index
        '.*?data-src="(.*?)"'#image
        '.*?name.*?a.*?>(.*?)</a>'#title
        '.*?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(9):
        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)

复制代码
import re
import time
import requests
from requests.exceptions import RequestException
import xlwings as xw
#from fake_useragent import UserAgent

def getHTML(url):
    try:
        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,timeout=30, headers=headers)
        response.encoding = response.apparent_encoding
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def findMaoyan(html):
    global mlist
    pattern = re.compile(
        '<dd>'
        '.*?board-index.*?>(.*?)</i>'#index
        '.*?data-src="(.*?)"'#image
        '.*?name.*?a.*?>(.*?)</a>'#title
        '.*?star.*?>(.*?)</p>'#主演
        '.*?releasetime.*?>(.*?)</p>'#上映时间
        '.*?integer.*?>(.*?)</i>'#评分 整数部分
        '.*?fraction.*?>(.*?)</i>'#评分 小数部分
        '.*?</dd>', re.S)
    items = re.findall(pattern,str(html))
    for item in items:
        mlist.append([item[0],#index
                      item[1],#image
                      item[2].strip(),#title
                      item[3].strip()[3:] if len(item[3]) > 3 else '',#主演
                      item[4].strip()[5:] if len(item[4]) > 5 else '',#上映时间
                      item[5].strip() + item[6].strip()])#评分
    #print(mlist)
    return mlist

def main():
    global mlist
    mlist = [['index', 'image', 'title', '主演', '上映时间', '评分']]
    for i in range(10):
        url = "http://maoyan.com/board/4?offset=" + str(i*10)
        html = getHTML(url)
        findMaoyan(html)
        time.sleep(1)

    # 写入Excel文件
    wb = xw.Book()
    sht = wb.sheets('Sheet1')
    sht.range('a1').value = mlist  # 将数据添加到表格中

if __name__ == '__main__':
    main()


复制代码

在这里插入图片描述 在这里插入图片描述

转载:

作者:BoBo欧巴\
链接:https://juejin.cn/post/7079709897515859982\
来源:稀土掘金\
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。