Scrapy搭配Selenium爬取豆瓣电影250排行榜动态网页数据

参考CSDN博客:https://blog.csdn.net/qq_43213783/article/details/113063557

2024年11月11日实现。

创建movie_douban爬虫项目:

scrapy startproject movie_douban

 进入spiders:

cd movie_douban/movie_douban/spiders

创建doubanMovieSpider爬虫:

scrapy genspider doubanMovieSpider movie.douban.com

修改items.py文件:

class MovieDoubanItem(scrapy.Item):

    number = scrapy.Field()

    name = scrapy.Field()

    grade = scrapy.Field()

    move_describe = scrapy.Field()

    evaluate = scrapy.Field()

    introduce = scrapy.Field()

    image_url = scrapy.Field()

修改doubanMovieSpider.py:

import scrapy
from ..items import MovieDoubanItem
import requests, os
from scrapy import Requestclass DoubanmoviespiderSpider(scrapy.Spider):name = 'doubanMovieSpider'allowed_domains = ['movie.douban.com']start_urls = ['https://movie.douban.com/top250']# 保存图片的url列表urllist = []#获取当前文件padouban.py所在的目录dir = os.path.dirname(__file__)#图片的保存目录dir_path = dir + '/' + 'tupian'def parse(self, response):# 判断是否请求成功if response.status == 404:print('failed url')#获取电影条目列表move_lists = response.xpath("//ol[@class='grid_view']/li")for move in move_lists:item = MovieDoubanItem()#img标签,获取属性用::attr(xxx),获取内容用::textitem['name'] = ''.join(move.css('.pic a img::attr(alt)').extract()).strip()item['grade'] = ''.join(move.css('.star span.rating_num::text').extract()).strip()item['number'] = ''.join(move.css('.pic em::text').extract()).strip()item['move_describe'] = ''.join(move.css('.quote span.inq::text').extract()).strip()item['evaluate'] = ''.join(move.css('.star span:nth-child(4)::text').extract()).strip()# 电影简介,去掉空格,换行符,制表符,拼接成一个字符串introduce_content = move.xpath(".//div[@class='bd']/p[1]/text()").getall() # getall()返回一个列表,包含所有匹配的文本节点,每个元素是一个字符串introduce = ''for content in introduce_content:content_s = ''.join(content.split()) # 去掉空格,换行符,制表符introduce = introduce + content_s + '  ' # 拼接成一个字符串,每个段落之间用两个空格隔开item['introduce'] = introduce # 电影海报图片url,strip()去掉两端空格image_url = ''.join(move.css('.pic a img::attr(src)').extract()).strip() item['image_url'] = image_urlself.urllist.append(image_url)yield item# 获取下一页内容next_text = response.xpath("//div[@class='paginator']/span[@class='next']")next_page = ''.join(next_text.css('a::attr(href)').extract()).strip()if next_page:url = 'https://movie.douban.com/top250' + next_pageyield Request(url=url, callback=self.parse)# else:  #爬取完所有电影条目开始下载图片。这里先不下载图片,若要下载图片,取消注释即可。#     for url in self.urllist:#         self.save_image(url)def save_image(self,url):# 用requests申请图片资源reponse = requests.get(url)# 获取图片名字img_name = url.split('/')[-1]#图片保存的路径img_path = self.dir_path + r'\{0}'.format(img_name)# 用os进行图片保存,保存在本地try:if not os.path.exists(self.dir_path):os.makedirs(self.dir_path)if not os.path.exists(img_path):with open(img_path, 'wb') as f:f.write(reponse.content)f.close()else:print("文件已存在")except:print("执行出错")

修改middlewares.py,使用selenium获取豆瓣动态页面的响应信息:

from scrapy.http import HtmlResponse
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time# 新增的selenium中间件 
class seleniumMiddleware(object):def __init__(self):self.timeout = 20 # 设置超时时间self.driver = webdriver.Chrome() # 使用Chrome浏览器self.driver.set_page_load_timeout(self.timeout)  # 设置页面加载超时时间self.wait = WebDriverWait(self.driver, self.timeout)  # 设置等待时间def process_request(self, request, spider,):self.driver.get(request.url) # 获取请求的urltime.sleep(1) # 等待1秒return HtmlResponse(url=request.url, body=self.driver.page_source, encoding='utf-8', request=request) # 返回HtmlResponse对象

修改pipelines.py,将数据保存到数据库:

from itemadapter import ItemAdapter
from pymongo import MongoClientclass  DoubanMoviePipeline(object):def open_spider(self, spider):# MongoDB 连接设置  self.MONGO_URI = 'mongodb://localhost:27017/'  self.DB_NAME = 'movie'  # 数据库名称  self.COLLECTION_NAME = 'doubanMovie'  # 集合名称self.client = MongoClient(self.MONGO_URI)self.db = self.client[self.DB_NAME]self.collection = self.db[self.COLLECTION_NAME]# 如果集合中已有数据,清空集合self.collection.delete_many({})print('爬取开始')def process_item(self, item, spider):name = item['name']grade = item['grade']number = item['number']move_describe = item['move_describe']evaluate = item['evaluate']introduce = item['introduce']image_url = item['image_url']# 将item转换为字典item_dict = {'name': name,'grade': grade,'number': number,'move_describe': move_describe,'evaluate': evaluate,'introduce': introduce,'image_url': image_url}# 插入数据self.collection.insert_one(item_dict)print('即将插入数据')print(item_dict)print('数据插入成功')# self.collection.insert_one(dict(item))return itemdef close_spider(self, spider):print('爬取结束,显示数据库中所有元素')cursor = self.collection.find()for document in cursor:print(document)self.client.close()

修改settings.py:

解除中间件和piplines的注释并指定具体类名,在请求头中添加User-Agent字段。

SPIDER_MIDDLEWARES = {

   'movie_douban.middlewares.seleniumMiddleware': 543,

}

ITEM_PIPELINES = {

   'movie_douban.pipelines.DoubanMoviePipeline': 300,

}

DEFAULT_REQUEST_HEADERS = {

#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

#   'Accept-Language': 'en',

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

}

运行项目:

在movie_douban/movie_douban文件夹下新建run.py文件:

from scrapy import cmdline

cmdline.execute("scrapy crawl doubanMovieSpider -s LOG_ENABLED=true".split())

运行run.py,得到结果如下:

爬取250条电影数据:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/60149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想定制RK3566/3568安卓11开机logo吗?触觉智能Purple Pi OH来教你

本文介绍瑞芯微RK3566/RK3568主板/开发板安卓Android11系统替换开机Logo的方法,使用触觉智能Purple Pi OH鸿蒙开发板演示,搭载了瑞芯微RK3566芯片,4核1.8Ghz1T算力NPU;类树莓派设计,Laval社区主荐,已适配全…

【AliCloud】ack + ack-secret-manager + kms 敏感数据安全存储

介绍 ack-secret-manager支持以Kubernetes Secret实例的形式向集群导入或同步KMS凭据信息,确保您集群内的应用能够安全地访问敏感信息。通过该组件,您可以实现密钥数据的自动更新,使应用负载通过文件系统挂载指定Secret实例来使用凭据信息&a…

网页设计平台:6个技术亮点

想要创建个人或商业网站来分享知识或推广商品吗?这篇文章将为你介绍6个免费的网页制作平台,帮助你即使没有编程基础也能快速、轻松地搭建出专业且引人注目的网站。让我们一起探索这些平台,发现它们的特色和优势。 即时设计 即时设计是一个云…

构造,CF 2029D - Cool Graph

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 D - Cool Graph 二、解题报告 1、思路分析 我们对每条 <u, v>&…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发&#xff0c;将UniApp集成新大陆PDA设备RFID的全过程分为四部曲&#xff0c;涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程&#xff0c;轻松应对安卓原生插件开发与打包需求&#xff01; 项目背景&#xff1a; UniApp集成新大陆P…

第2章2.3立项【硬件产品立项的核心内容】

硬件产品立项的核心内容 2.3 硬件产品立项的核心内容2.3.1 第一步&#xff1a;市场趋势判断2.3.2 第二步&#xff1a;竞争对手分析1.竞争对手识别2.根据竞争对手分析制定策略 2.3.3 第三步&#xff1a;客户分析2.3.4 第四步&#xff1a;产品定义2.3.5 第五步&#xff1a;开发执…

常见计算机网络知识整理(未完,整理中。。。)

TCP和UDP区别 TCP是面向连接的协议&#xff0c;发送数据前要先建立连接&#xff1b;UDP是无连接的协议&#xff0c;发送数据前不需要建立连接&#xff0c;是没有可靠性&#xff1b; TCP只支持点对点通信&#xff0c;UDP支持一对一、一对多、多对一、多对多&#xff1b; TCP是…

突破性能瓶颈,几个高性能Python网络框架,高效实现网络应用

引言 随着互联网和大数据时代的到来&#xff0c;高性能网络应用的需求日益增加。Python作为一种流行的编程语言&#xff0c;在高性能网络编程领域也具有广泛的应用。本文将深入探讨基于Python的几种高性能网络框架&#xff0c;分析它们各自的优势和适用场景&#xff0c;帮助开发…

中国智能网联汽车技术规程(C-ICAP-2024版)之基础行车辅助测试介绍及文档分享24年7月1号实施

C-ICAP(2024 版)对辅助驾驶测评单元(行车辅助项目、泊车辅助项目)、智慧座舱测评单元、隐私保护测评单元开展测试评价。 1 行车辅助评价项目 行车辅助项目包括基础行车辅助和领航行车辅助。其中,基础行车辅助部分为必测项,包括跟车能力、组合控制能力、紧急避险能力和驾…

一文详解MacOS使用VSCode搭建SpringBoot+Gradle开发环境

开发后端Java应用时&#xff0c;大多数开发者使用的是IntelliJ IDEA&#xff0c;但该软件是一个付费软件&#xff0c;所以希望可以使用开源且免费的VSCode来创建和开发后端项目。本文为本人在 Mac 上使用 Visual Studio Code&#xff08;简称 VSCode&#xff09;集成开发环境来…

创建者模式之【建造者模式】

建造者模式 概述 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 分离了部件的构造(由Builder来负责)和装配(由Director负责)。 从而可以构造出复杂的对象。这个模式适用于&#xff1a;某个对象的构建过程复杂的情况。由于实现了构建和…

pyspark入门基础详细讲解

1.前言介绍 学习目标&#xff1a;了解什么是Speak、PySpark&#xff0c;了解为什么学习PySpark&#xff0c;了解课程是如何和大数据开发方向进行衔接 使用pyspark库所写出来的代码&#xff0c;既可以在电脑上简单运行&#xff0c;进行数据分析处理&#xff0c;又可以把代码无缝…

5. 类加载子系统

一、前言 前面我们了解了字节码文件的大致组成部分&#xff0c;那么 JVM 是如何加载 .class字节码文件的&#xff1f;加载到.class字节码文件后又做了哪些事情呢&#xff1f; 二、类加载子系统初步认识 首先类加载子系统作为虚拟机和外界的一个对接口&#xff0c;主要负责以…

AI 写作(六):核心技术与多元应用(6/10)

一、AI 写作的核心技术概述 AI 写作在当今数字化时代正发挥着越来越重要的作用。它不仅极大地提高了写作效率&#xff0c;还为不同领域带来了创新的可能性。 AI 写作的核心技术主要包括基于模板的文本生成和基于深度学习的文本生成。基于模板的文本生成通常依赖预先设定的模板…

显卡驱动版本过低怎么办?显卡驱动升级的方法

显卡驱动程序是计算机与显卡之间沟通的桥梁&#xff0c;它负责将操作系统发出的指令翻译成显卡可以理解的语言&#xff0c;从而确保图形显示的流畅与高效。当您遇到显卡驱动版本过低的问题时&#xff0c;升级驱动程序不仅能够提升电脑的图形处理能力&#xff0c;还能解决兼容性…

java导出word文件(手绘)

文章目录 代码细节效果图参考资料 代码细节 使用的hutool的WordUtil&#xff0c;WordUtil对poi进行封装&#xff0c;但是这一块的官方封装的很少&#xff0c;很多细节都没有。代码中是常见的绘制段落&#xff0c;标题、表格等常用api Word07Writer writer WordUtil.getWriter(…

UML的另一个主角——用例图

顺序图和类图已经出过单集&#xff0c;本贴要分享的是用例图。 类图https://blog.csdn.net/jsl123x/article/details/143526286?spm1001.2014.3001.5501顺序图https://jslhyh32.blog.csdn.net/article/details/134350587 目录 一.系统 二.参与者 1.主要参与者 2.次要参与…

《TCP/IP网络编程》学习笔记 | Chapter 4:基于TCP的服务器端/客户端(1)

《TCP/IP网络编程》学习笔记 | Chapter 4&#xff1a;基于TCP的服务器端/客户端&#xff08;1&#xff09; 《TCP/IP网络编程》学习笔记 | Chapter 4&#xff1a;基于TCP的服务器端/客户端&#xff08;1&#xff09;理解TCP和UDPTCP/IP协议栈TCP/IP协议的诞生背景链路层网络层T…

【基于PSINS工具箱】以速度为观测量的SINS/GNSS组合导航,UKF滤波

基于【PSINS工具箱】&#xff0c;提供一个MATLAB例程&#xff0c;仅以速度为观测量的SINS/GNSS组合导航&#xff08;滤波方式为UKF&#xff09; 文章目录 工具箱程序简述运行结果 代码程序讲解MATLAB 代码教程&#xff1a;使用UKF进行速度观测1. 引言与基本设置2. 初始设置3. U…

【Vue】Vue3.0(十七)Vue 3.0中Pinia的深度使用指南(基于setup语法糖)

上篇文章&#xff1a; 【Vue】Vue3.0&#xff08;十一&#xff09;Vue 3.0 中 computed 计算属性概念、使用及示例 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年11月10日15点23分 文章…