欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

猫眼电影TOP100榜电影信息的获取和储存

程序员文章站 2022-05-02 22:13:47
...

首先,对网页进行解析;

# 获取网页
def GetHtml(url):
    try:
        # 修改网页的头部
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2714.400'}
        r = requests.get(url,headers = headers)
        # 查看网页是否访问成功
        r.raise_for_status()
        # 将网页解析内容转换为 utf-8 形式
        r.encoding = r.apparent_encoding
        return r.text
    except RequestException:
        return '访问失败'

接着,对网页信息进行提取(注意,find函数和find_all函数的区别, find函数返回匹配的第一个结果,以标签形式;find_all返回匹配的所有结果,以列表的形式);

# 获取该网页的电影信息
def parse_one_page(html):
    # 将网页 html 代码转换为BeautifulSoup 能读懂的形式
    soup = BeautifulSoup(html, 'lxml')
    # 查找该页所有的电影, 返回列表形式,列表里是每个电影的信息
    info = soup.find_all('dd')
    result = []
    for i in info:
        # 获取电影的排名
        order = i.find('i').string
        # 获取电影的名字
        name = i.find('p', class_ = 'name').get_text()
        # 获取电影的海报
        image = i.find('img', class_ = 'board-img').get('data-src')
        # 获取电影主演
        actor = i.find('p', class_ = 'star').get_text().strip()[3:]
        # 获取电影上映时间
        times = i.find('p', class_ = 'releasetime').get_text()[5:]
        # 获取电影评分整数部分
        score1 = i.find('i', class_ = 'integer').string
        # 获取电影评分小数部分
        score2 = i.find('i', class_ = 'fraction').string
        # 将整数部分与小数部分合并
        score = score1 + score2
        # 以字典形式加入列表里
        result.append({'排名':order, '海报':image, '电影名':name, '主演':actor,
                       '上映时间':times, '评分':score})
    return result

然后, 储存为txt格式;

# 储存为 txt 格式     
def write_to_file(content):
    # ’a‘ 表示追加
    with open('TOP100.txt', 'a', encoding = 'utf-8') as f:
        # json.dumps() 将json对象转换为json文本形式
        f.write(json.dumps(content, ensure_ascii = False) + '\n')

最后,定义一个总函数,对网页进行循环遍历

def main(offset):
    # 获取网页网址
    url = 'https://maoyan.com/board/4?offset=' + str(offset)
    html = GetHtml(url)
    content = parse_one_page(html)
    for item in content:
        print(item)
        write_to_file(item)

总代码如下:

from bs4 import BeautifulSoup
import requests
import json
from requests.exceptions import RequestException
import time
import pandas as pd

# 获取网页
def GetHtml(url):
    try:
        # 修改网页的头部
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2714.400'}
        r = requests.get(url,headers = headers)
        # 查看网页是否访问成功
        r.raise_for_status()
        # 将网页解析内容转换为 utf-8 形式
        r.encoding = r.apparent_encoding
        return r.text
    except RequestException:
        return '访问失败'

# 获取该网页的电影信息
def parse_one_page(html):
    # 将网页 html 代码转换为BeautifulSoup 能读懂的形式
    soup = BeautifulSoup(html, 'lxml')
    # 查找该页所有的电影, 返回列表形式,列表里是每个电影的信息
    info = soup.find_all('dd')
    result = []
    for i in info:
        # 获取电影的排名
        order = i.find('i').string
        # 获取电影的名字
        name = i.find('p', class_ = 'name').get_text()
        # 获取电影的海报
        image = i.find('img', class_ = 'board-img').get('data-src')
        # 获取电影主演
        actor = i.find('p', class_ = 'star').get_text().strip()[3:]
        # 获取电影上映时间
        times = i.find('p', class_ = 'releasetime').get_text()[5:]
        # 获取电影评分整数部分
        score1 = i.find('i', class_ = 'integer').string
        # 获取电影评分小数部分
        score2 = i.find('i', class_ = 'fraction').string
        # 将整数部分与小数部分合并
        score = score1 + score2
        # 以字典形式加入列表里
        result.append({'排名':order, '海报':image, '电影名':name, '主演':actor,
                       '上映时间':times, '评分':score})
    return result


# 储存为 txt 格式     
def write_to_file(content):
    # ’a‘ 表示追加
    with open('TOP100.txt', 'a', encoding = 'utf-8') as f:
        # json.dumps() 将json对象转换为json文本形式
        f.write(json.dumps(content, ensure_ascii = False) + '\n')
       
def main(offset):
    # 获取网页网址
    url = 'https://maoyan.com/board/4?offset=' + str(offset)
    html = GetHtml(url)
    content = parse_one_page(html)
    for item in content:
        print(item)
        write_to_file(item)
        
 # 获取每一页电影的信息       
for i in range(10):
   main(offset = i * 10)
   time.sleep(1)
相关标签: 网络爬虫