爬取豆瓣电影TOP250的数据/存储到MySQL

本文介绍了一个使用Python实现的豆瓣电影Top250数据爬取项目。通过requests和lxml库获取网页信息,解析并抓取电影名称、导演、演员、类型、国家、上映时间、片长及评分等详细信息,最后将数据存入MySQL数据库。项目涵盖了网络爬虫、数据解析和数据库操作等关键技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

import requests
from lxml import etree
import re
import pymysql
import time

conn = pymysql.connect(host='localhost', user='root', passwd='cjlushenbin', db='my_database', port=3306, charset='utf8')
cursor = conn.cursor()

headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                  '(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'
}

def get_movie_url(url):
    html = requests.get(url,headers=headers)
    selector = etree.HTML(html.text)
    movie_hrefs = selector.xpath('//div[@class="hd"]/a/@href')
    for movie_href in movie_hrefs:
        get_movie_info(movie_href)

def get_movie_info(url):
    html = requests.get(url,headers=headers)
    selector = etree.HTML(html.text)
    try:
        name = selector.xpath('//*[@id="content"]/h1/span[1]/text()')[0]
        director = selector.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]
        actor = selector.xpath('string(//*[@id="info"]/span[3]/span[2])')
        style = re.findall('<span property="v:genre">(.*?)</span>',html.text,re.S)
        style = '/'.join(style)
        # style = selector.xpath('//span[@property="v:genre"]//text()')
        # style = '/'.join(style)
        country = re.findall('<span class="pl">制片国家/地区:</span> (.*?)<br/>',html.text,re.S)[0]
        release_time = selector.xpath('//span[@property="v:initialReleaseDate" ]//text()')
        release_time = '/'.join(release_time)
        # time = re.findall('片长:</span>.*?>(.*?)</span>',html.text,re.S)[0]
        time = re.findall('<span class="pl">片长:</span>.*?>(.*?)</span>(.*?)<br/>',html.text,re.S)[0]
        time = ''.join(time)
        score = selector.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0]
        print(name,director,actor,style,country,release_time,time,score)
        cursor.execute(
            "insert into doubanmovie (name,director,actor,style,country,release_time,time,score) values(%s,%s,%s,%s,%s,%s,%s,%s)",
            (str(name), str(director), str(actor), str(style), str(country), str(release_time), str(time), str(score)))

    except IndexError:
        pass

if __name__ == '__main__':
    urls = ['https://movie.douban.com/top250?start={}'.format(str(i)) for i in range(0, 250, 25)]
    for url in urls:
        get_movie_url(url)
        time.sleep(1)
    conn.commit()

 

### 爬取豆瓣电影 Top 250 数据存储MySQL 数据库的步骤 #### 1. 准备工作 在开始爬取数据之前,需要安装以下 Python 库: - `requests`:用于发送 HTTP 请求获取网页内容。 - `BeautifulSoup`(或 `bs4`):用于解析 HTML 页面内容。 - `pymysql` 或 `MySQLdb`:用于连接和操作 MySQL 数据库。 可以使用以下命令安装这些库: ```bash pip install requests beautifulsoup4 pymysql ``` #### 2. 分析目标网站 豆瓣电影 Top 250 的网址是 `https://movie.douban.com/top250`。每页显示 25 部电影,共有 10 页。可以通过观察 URL 发现规律,例如第一页为 `?start=0&filter=`,第二页为 `?start=25&filter=`,依此类推[^3]。 #### 3. 编写爬虫代码 以下是爬取豆瓣电影 Top 250 并将数据存入 MySQL 数据库的示例代码: ```python import requests from bs4 import BeautifulSoup import pymysql # 连接数据库 db = pymysql.connect(host='localhost', port=3306, user='root', passwd='', db='movie', charset='utf8')[^4] cursor = db.cursor() # 创建表 cursor.execute(''' CREATE TABLE IF NOT EXISTS movies ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255), rating FLOAT, director VARCHAR(255), year INT, country VARCHAR(255), genre VARCHAR(255) ) ''') # 定义爬取函数 def crawl_douban(): base_url = 'https://movie.douban.com/top250' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' } for page in range(0, 10): url = f'{base_url}?start={page * 25}&filter=' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') items = soup.find_all('div', class_='item') for item in items: title = item.find('span', class_='title').text.strip() rating = float(item.find('span', class_='rating_num').text.strip()) info = item.find('div', class_='bd').p.text.strip().split('\n') director_info = info[0].split('导演: ')[1].split('  主演: ') director = director_info[0] year_country_genre = info[1].strip().split('/') year = int(year_country_genre[0].strip()) country = year_country_genre[1].strip() genre = year_country_genre[2].strip() # 插入数据 cursor.execute(''' INSERT INTO movies (title, rating, director, year, country, genre) VALUES (%s, %s, %s, %s, %s, %s) ''', (title, rating, director, year, country, genre)) db.commit() # 调用爬取函数 crawl_douban() # 关闭数据库连接 cursor.close() db.close() ``` #### 4. 代码说明 - **请求与解析**:使用 `requests` 发送 GET 请求获取页面内容,并通过 `BeautifulSoup` 解析 HTML 内容。 - **数据提取**:从每个电影条目中提取标题、评分、导演、年份、国家和类型等信息。 - **数据库操作**:使用 `pymysql` 连接 MySQL 数据库,创建表并插入数据[^4]。 #### 5. 注意事项 - **反爬机制**:豆瓣可能会对频繁请求进行限制,建议设置合理的请求间隔或使用代理。 - **异常处理**:在实际应用中,建议添加异常处理逻辑以确保程序稳定性。 - **数据清洗**:根据实际需求对提取的数据进行进一步清洗和处理。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值