Python3.6+Beautiful Soup+csv 爬取豆瓣电影Top250

豆瓣电影 Top 250:https://movie.douban.com/top250?start=0&filter=
Beautiful Soup:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

注:本文获取内容全部使用Beautiful Soup的select方法,使用css选择器。有html+css编程经验的可以使用css选择器,方便快捷。

0. 分析页码

当鼠标放在第二页的时候,链接显示:https://movie.douban.com/top250?start=25&filter= 从网页数据上可以看到每一页默认显示25条数据。即翻页修改此参数即可 0,25,50…,225
在这里插入图片描述
程序构造循环:

url = 'https://movie.douban.com/top250?start=%s&filter='
for page in range(10):
	current_page_url = url % (page * 25) 

即 025=0,125=25…9*25=225

1. 分析每一个电影

通过查看元素可以看到,每一个电影卡片对应ol标签下的li标签,即遍历此li标签即可。
通过css选择器定位li标签lis = soup.select("#content .grid_view > li")

‘#‘代表id选择器,’.‘代表class选择器,’>’ 代表只获取下一级
一般情况下优选使用id(唯一),其次class,最后是标签。
PS:这里是html+css编程经验,如果使用某一个选择器不能精确定位时,可以混合使用多种,优先使用id缩小范围。
在这里插入图片描述

2. 获取序号及链接

在li标签里面,序号在class=‘pic’的div标签下的第一个em标签中,链接在第一个a标签的属性href中,因此代码为:

index = li.select(".pic em")[0].text
movie_url = li.select(".pic a")[0]['href']

在这里插入图片描述

3. 获取标题

电影名称在div[class=‘info’]下的第一个a标签中。

title = li.select(".info .hd a")[0].get_text().replace('\n', '')

如果需要分开获取可以选中a标签下的span标签,使用for循环处理,或根据/截取处理。

spans = li.select(".info .hd a span")
for span in spans:
    print(span.get_text())

一般数据很难直接获取理想的格式,可以在获取到后使用基本的正则表达式或字符串处理。
在这里插入图片描述

4. 获取导演,主要,上映时间,类型

info = li.select(".info .bd p")[0].get_text().strip()

在这里插入图片描述

5. 评分及简介

因为个别电影没有一句话的简介,故加了判断,如果不存在,使用[0]获取第一个元素会报错。
如:https://movie.douban.com/top250?start=150&filter= 序号173的电影,见下下图。

PS:一般实际项目中会发现个别条目会有变化,导致程序出现异常停止或获取到的数据不对,这就需要在实际运行中及时调整代码。

rating_start = li.select(".star .rating_num")[0].get_text()
rtating_total_count = li.select(".star span")[-1].get_text()
if li.select(".quote"):
    quote = li.select(".quote")[0].get_text()
else:
    quote = None

在这里插入图片描述

6. 写入csv文件

out = open('movie.csv', 'a', newline='')
movie_csv = csv.writer(out, dialect='excel')
movie_csv.writerow(['序号', '链接', '标题', '信息', '评分', '影评数', '描述']) 

7. 完整代码



import requests
import csv
from bs4 import BeautifulSoup

url = 'https://movie.douban.com/top250?start=%s&filter='

def main():
    out = open('movie.csv', 'a', newline='')
    movie_csv = csv.writer(out, dialect='excel')
    movie_csv.writerow(['序号', '链接', '标题', '信息', '评分', '影评数', '描述'])

    headers = {
        "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Mobile Safari/537.3"
    }

    for page in range(10):
        content = requests.get(url % (25 * page), headers=headers).content
        soup = BeautifulSoup(content)

        lis = soup.select("#content .grid_view > li")
        for li in lis:
            index = li.select(".pic em")[0].text
            movie_url = li.select(".pic a")[0]['href']

            title = li.select(".info .hd a")[0].get_text().replace('\n', '')
            # spans = li.select(".info .hd a span")
            # for span in spans:
            #     print(span.get_text())

            info = li.select(".info .bd p")[0].get_text().strip()
            rating_start = li.select(".star .rating_num")[0].get_text()
            rtating_total_count = li.select(".star span")[-1].get_text()
            if li.select(".quote"):
                quote = li.select(".quote")[0].get_text()
            else:
                quote = None
            movie_csv.writerow([index, movie_url, title, info, rating_start, rtating_total_count, quote])
        print("now page:%s" % page)

# 主函数
if __name__ == '__main__':
    main()

在这里插入图片描述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提数据并存储,以便后续分析或展示。虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓的场景。 虫的工作流程包括以下几个关键步骤: URL收集: 虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获。 请求网页: 虫使用HTTP或其他协议向目标URL发起请求,获网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 虫对获的HTML进行解析,提有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助虫定位和提目标数据,如文本、图片、链接等。 数据存储: 虫将提的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反虫机制,虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反虫应对: 由于虫的存在,一些网站采了反虫措施,如验证码、IP封锁等。虫工程师需要设计相应的策略来应对这些挑战。 虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提数据并存储,以便后续分析或展示。虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓的场景。 虫的工作流程包括以下几个关键步骤: URL收集: 虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获。 请求网页: 虫使用HTTP或其他协议向目标URL发起请求,获网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 虫对获的HTML进行解析,提有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助虫定位和提目标数据,如文本、图片、链接等。 数据存储: 虫将提的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反虫机制,虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反虫应对: 由于虫的存在,一些网站采了反虫措施,如验证码、IP封锁等。虫工程师需要设计相应的策略来应对这些挑战。 虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
好的,我可以为您提供一个大致的思路: 1.使用Python的requests和BeautifulSoup豆瓣电影top250的页面数据,提电影的名称、评分、导演、主演、年份、地区、类型等信息。 2.将提出的电影信息存储到CSV文件中,可以使用Pythoncsv库。 3.使用Python的pandas库读CSV文件,进行数据清洗和处理,如去重、填充空值等。 4.使用Python的matplotlib库或seaborn库进行数据可视化,实现电影评分分布图、电影类型占比图、电影地区分布图等。 下面是一个简单的示例代码,仅供参考: ```python import requests from bs4 import BeautifulSoup import csv import pandas as pd import matplotlib.pyplot as plt # 豆瓣电影top250的页面数据 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/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 提电影信息并存储到CSV文件中 movies = [] for item in soup.find_all('div', class_='item'): movie = [] movie.append(item.find('span', class_='title').text) movie.append(item.find('span', class_='rating_num').text) movie.append(item.find('p', class_='').text.strip().split('\n')[0].split(':')[-1]) movie.append(item.find('p', class_='').text.strip().split('\n')[1].strip().split('/')[0]) movie.append(item.find('p', class_='').text.strip().split('\n')[1].strip().split('/')[1]) movie.append(item.find('p', class_='').text.strip().split('\n')[1].strip().split('/')[2]) movie.append(item.find('p', class_='').text.strip().split('\n')[1].strip().split('/')[3]) movies.append(movie) with open('movies.csv', 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['电影名称', '电影评分', '导演', '主演', '年份', '地区', '类型']) for movie in movies: writer.writerow(movie) # 读CSV文件,进行数据清洗和处理 df = pd.read_csv('movies.csv') df = df.drop_duplicates(subset=['电影名称']) df['年份'] = df['年份'].str.strip() df['类型'] = df['类型'].str.strip() # 数据可视化 # 电影评分分布图 plt.hist(df['电影评分'], bins=20) plt.xlabel('电影评分') plt.ylabel('电影数量') plt.show() # 电影类型占比图 df['类型'].value_counts().plot(kind='pie', autopct='%1.1f%%') plt.axis('equal') plt.legend(bbox_to_anchor=(1.2, 1)) plt.show() # 电影地区分布图 df['地区'].value_counts().plot(kind='bar') plt.xlabel('地区') plt.ylabel('电影数量') plt.show() ``` 以上代码仅提供了基本的、数据处理和数据可视化功能,您可以根据自己的需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值