Python爬虫 爬取豆瓣电影Top250信息
时间:2022-07-25
本文章向大家介绍Python爬虫 爬取豆瓣电影Top250信息,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
文章目录
一、分析网页
翻页查看url变化规律:
第一页:https://movie.douban.com/top250?start=0&filter=
第二页:https://movie.douban.com/top250?start=25&filter=
第三页:https://movie.douban.com/top250?start=50&filter=
第十页:https://movie.douban.com/top250?start=225&filter=
分析可得页面url的规律:
url_list = “https://movie.douban.com/top250?start={}&filter=”.format(x * 25) for x in range(10)
二、多线程爬取电影封面图
单线程版
import requests
from lxml import etree
import datetime
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"
}
# 设置保存路径 保存到指定文件夹 路径复制过来
path = input("请输入保存路径:")
start_time = datetime.datetime.now()
def get_pic(url):
rep = requests.get(url, headers=headers).text
html = etree.HTML(rep)
# 获取电影封面图 电影名称 xpath定位提取 得到的是列表
src = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@src')
name = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@alt')
# 保存到本地
for src, name in zip(src, name):
file_name = name + ".jpg"
img = requests.get(src, headers=headers).content
with open(path + "/" + file_name, "wb") as f:
f.write(img)
if __name__ == "__main__":
# 列表推导式得到url列表 10页的电影信息 Top250
url_list = ["https://movie.douban.com/top250?start={}&filter=".format(x * 25) for x in range(10)]
for url in url_list:
get_pic(url)
delta = (datetime.datetime.now() - start_time).total_seconds()
print("抓取250张电影封面图用时:{}s".format(delta))
单线程抓取250张电影封面图所用时间:
多线程版
import requests
from lxml import etree
import datetime
from concurrent.futures import ThreadPoolExecutor
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1"
}
# 设置保存路径 保存到指定文件夹 路径复制过来
path = input("请输入保存路径:")
start_time = datetime.datetime.now()
def get_pic(url):
rep = requests.get(url, headers=headers).text
html = etree.HTML(rep)
# 获取电影封面图 电影名称 xpath定位提取 得到的是列表
src = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@src')
name = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@alt')
# 保存到本地
for src, name in zip(src, name):
file_name = name + ".jpg"
img = requests.get(src, headers=headers).content
with open(path + "/" + file_name, "wb") as f:
f.write(img)
if __name__ == "__main__":
# 列表推导式得到url列表 10页的电影信息 Top250
url_list = ["https://movie.douban.com/top250?start={}&filter=".format(x * 25) for x in range(10)]
with ThreadPoolExecutor(max_workers=4) as executor:
executor.map(get_pic, url_list)
delta = (datetime.datetime.now() - start_time).total_seconds()
print("抓取250张电影封面图用时:{}s".format(delta))
多线程抓取250张电影封面图所用时间:
程序成功运行,250张电影封面图保存到了本地文件夹,通过比较,开多线程抓取电影封面图,抓取效率有明显提高。
三、爬取电影信息
import requests
from lxml import etree
import openpyxl
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3"
}
wb = openpyxl.Workbook() # 创建工作簿对象
sheet = wb.active # 获取工作簿的活动表
sheet.title = "movie" # 工作簿重命名
sheet.append(["排名", "电影名", "导演和主演", "上映时间", "上映地区", "电影类型", "评分", "评价人数", "引言"])
def get_movie(urls):
rank = 1
for url in urls:
res = requests.get(url, headers=headers).text
html = etree.HTML(res)
# 先xpath定位提取到每个页面的所有li标签
lis = html.xpath('//*[@id="content"]/div/div[1]/ol/li')
# 每个li标签里有每部电影的基本信息
for li in lis:
name = li.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]
director_actor = li.xpath('.//div[@class="bd"]/p/text()')[0].strip()
info = li.xpath('.//div[@class="bd"]/p/text()')[1].strip()
# 按"/"切割成列表
_info = info.split("/")
# 得到 上映时间 上映地区 电影类型信息 去除两端多余空格
time, area, genres = _info[0].strip(), _info[1].strip(), _info[2].strip()
# print(time, area, genres)
rating_score = li.xpath('.//div[@class="star"]/span[2]/text()')[0]
rating_num = li.xpath('.//div[@class="star"]/span[4]/text()')[0]
quote = li.xpath('.//p[@class="quote"]/span/text()')
# 最后一页有部电影 九品芝麻官 没有一句话引言 加条件判断 防止报错
if len(quote) == 0:
quote = None
else:
quote = quote[0]
sheet.append([rank, name, director_actor, time, area, genres, rating_score, rating_num, quote])
rank += 1
# 保存到Excel
wb.save("movie.xlsx")
if __name__ == "__main__":
# 列表推导式得到url列表 10页的电影信息 Top250
url_list = ["https://movie.douban.com/top250?start={}&filter=".format(i * 25) for i in range(10)]
get_movie(url_list)
程序成功运行,豆瓣电影Top250榜单上电影的基本信息保存到了本地Excel里。
作者:叶庭云 微信公众号:修炼Python CSDN:https://yetingyun.blog.csdn.net/ 本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。 觉得文章对你有帮助、让你有所收获的话,期待你的点赞呀,不足之处,也可以在评论区多多指正。
- Java并发编程的艺术(九)——批量获取多条线程的执行结果
- web.xml中load-on-startup的作用
- Java并发编程的艺术(七)——Executors
- Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解
- PowerDesigner使用教程|使用方法
- Java并发编程的艺术(一)——并发编程需要注意的问题
- 梯度下降法快速教程 | 第三章:学习率衰减因子(decay)的原理与Python实现
- Java并发编程的艺术(三)——volatile
- java学习手册-java 新手入门必看的30个题
- Java并发编程的艺术(五)——中断
- 简易的深度学习框架Keras代码解析与应用
- Java并发编程的艺术(六)——线程间的通信
- 轻量级线程池的实现
- python根据BM25实现文本检索
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Java面试总结】常用框架之Spring
- 【学以致用】C++操作Redis
- 商业鬼才教你 工厂方法 && 抽象工厂 模式
- redis学习(十四)
- 用动态路由打通各Virtual L2网络 By HKL,
- 《深入RabbitMQ》笔记
- Nginx学习日志(六)Linux下设置开机自启动
- 轻松学会 React 钩子:以 useEffect() 为例
- linux新增用户
- Rancher搭建集群:[etcd] Failed to bring up Etcd Plane: etcd cluster is unhealthy
- ECS误删文件后恢复数据
- rxjs里的Observable对象的pipe方法
- rxjs里的Observable对象和map配合的一个用法
- rxjs里的Observable对象subscribe方法的执行原理
- Java正则表达式