Python爬取并分析IMDB电影

一.打开IMDB电影T250排行可以看见250条电影数据,电影名,评分等数据都可以看见

image

按F12进入开发者模式,找到这些数据对应的HTML网页结构,如下所示

image

可以看见里面有链接,点击链接可以进入电影详情页面,这可以看见导演,编剧,演员信息

image

同样查看HTML结构,可以找到相关信息的节点位置

image

演员信息可以在这个页面的cast中查看完整的信息

image

HTML页面结构

image

分析完整个要爬取的数据,现在来获取首页250条电影信息

1.整个爬虫代码需要使用的相关库

import re
import pymysql
import json
import requests
from bs4 import BeautifulSoup
from requests.exceptions import RequestException
'''
遇到不懂的问题?Python学习交流群:1136201545满足你的需求,资料都已经上传群文件,可以自行下载!
'''

2.请求首页的HTML网页,(如果请求不通过可以添加相关Header),返回网页内容

def get_html(url):
    response=requests.get(url)
    if response.status_code==200:
        #判断请求是否成功
        return  response.text
    else:
        return None

3.解析HTML

def parse_html(html):
    #进行页面数据提取
    soup = BeautifulSoup(html, 'lxml')
    movies = soup.select('tbody tr')
    for movie in movies:
        poster = movie.select_one('.posterColumn')
        score = poster.select_one('span[name="ir"]')['data-value']
        movie_link = movie.select_one('.titleColumn').select_one('a')['href']
        #电影详情链接
        year_str = movie.select_one('.titleColumn').select_one('span').get_text()
        year_pattern = re.compile('\d{4}')
        year = int(year_pattern.search(year_str).group())
        id_pattern = re.compile(r'(?<=tt)\d+(?=/?)')
        movie_id = int(id_pattern.search(movie_link).group())
        #movie_id不使用默认生成的,从数据提取唯一的ID
        movie_name = movie.select_one('.titleColumn').select_one('a').string
        #使用yield生成器,生成每一条电影信息
        yield {
            'movie_id': movie_id,
            'movie_name': movie_name,
            'year': year,
            'movie_link': movie_link,
            'movie_rate': float(score)
        }

4.我们可以保存文件到txt文本

def write_file(content):
    with open('movie12.txt','a',encoding='utf-8')as f:
        f.write(json.dumps(content,ensure_ascii=False)+'\n')

def main():
    url='https://www.imdb.com/chart/top'
    html=get_html(url)
    for item in parse_html(html):
        write_file(item)

if __name__ == '__main__':
    main()

5.数据可以看见

image

6.如果成功了,可以修改代码保存数据到MySQL,使用Navicat来操作非常方便先连接到MySQL

db = pymysql.connect(host="localhost", user="root", password="********", db="imdb_movie")
cursor = db.cursor()

创建数据表

CREATE TABLE `top_250_movies` (
`id` int(11) NOT NULL,
`name` varchar(45) NOT NULL,
`year` int(11) DEFAULT NULL,
`rate` float NOT NULL,
PRIMARY KEY (`id`)
)

接下来修改代码,操作数据加入数据表

def store_movie_data_to_db(movie_data):


    sel_sql =  "SELECT * FROM top_250_movies \
       WHERE id =  %d" % (movie_data['movie_id'])
    try:
        cursor.execute(sel_sql)
        result = cursor.fetchall()
    except:
        print("Failed to fetch data")
    if result.__len__() == 0:
        sql = "INSERT INTO top_250_movies \
                    (id, name, year, rate) \
                 VALUES ('%d', '%s', '%d', '%f')" % \
              (movie_data['movie_id'], movie_data['movie_name'], movie_data['year'], movie_data['movie_rate'])
        try:
            cursor.execute(sql)
            db.commit()
            print("movie data ADDED to DB table top_250_movies!")
        except:
            # 发生错误时回滚
            db.rollback()
    else:
        print("This movie ALREADY EXISTED!!!")

运行

def main():
    url='https://www.imdb.com/chart/top'
    html=get_html(url)
    for item in parse_html(html):
        store_movie_data_to_db(item)

if __name__ == '__main__':
    main()
Python是网络爬虫开发的理想语言,由于其简洁易读的语法和丰富的库支持。如果你想要爬取大量电影数据,通常会使用到以下几个步骤和相关的Python库: 1. **选择爬取工具**: 使用`requests`库发送HTTP请求获取网页内容,`BeautifulSoup`或`lxml`用于解析HTML文档,提取你需要的数据。 2. **目标识别**: 确定你要从哪些网站抓取电影数据,如IMDb、豆瓣电影等。每个网站的结构可能不同,所以需要了解其HTML标记和API(如果有)。 3. **数据抽取**: 通过分析网页的HTML结构,找到包含电影信息的元素,如电影标题、演员、评分、链接等。例如,`find_all()`方法可以找出所有特定标签。 4. **数据处理**: 用`pandas`库创建数据结构(如DataFrame)来存储抓取的数据,并可能进行清洗和转换。 5. **速率限制与代理**: 为了遵守网站的使用政策和防止被封IP,通常需要设置请求间隔(使用`time.sleep()`)并考虑使用代理服务器(`Scrapy`库提供了这方面的支持)。 6. **存储数据**: 数据可能很大,可以选择直接写入CSV、Excel,或者使用数据库如SQLite、MySQL或更专业的数据存储服务如MongoDB。 7. **异常处理**: 处理可能出现的网络错误、解析错误或网站结构变化等问题,使用try-except块来捕获异常。 8. **合法合规**: 在爬取前,请确保你的行为符合网站的robots.txt规则,并尊重版权。 相关问题: 1. 如何处理动态加载的内容或JavaScript生成的数据? 2. 爬虫过程中如何处理反爬机制,如验证码、登录验证等? 3. 如何在大规模爬取时避免IP被封禁?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值