scrapy_selenium爬取Ajax、JSON、XML网页:豆瓣电影

简介: 在网络爬虫的开发过程中,我们经常会遇到一些动态加载的网页,它们的数据不是直接嵌入在HTML中,而是通过Ajax、JSON、XML等方式异步获取的。这些网页对于传统的scrapy爬虫来说,是很难直接解析的。那么,我们该如何使用scrapy_selenium来爬取这些数据格式的网页呢?本文将为你介绍scrapy_selenium的基本原理和使用方法,并给出一个实际的案例。

亿牛云代理

导语

在网络爬虫的开发过程中,我们经常会遇到一些动态加载的网页,它们的数据不是直接嵌入在HTML中,而是通过Ajax、JSON、XML等方式异步获取的。这些网页对于传统的scrapy爬虫来说,是很难直接解析的。那么,我们该如何使用scrapy_selenium来爬取这些数据格式的网页呢?本文将为你介绍scrapy_selenium的基本原理和使用方法,并给出一个实际的案例。

概述

scrapy_selenium是一个结合了scrapy和selenium的爬虫框架,它可以让我们在scrapy中使用selenium来控制浏览器,从而实现对动态网页的爬取。scrapy_selenium的主要特点有:

  • 它提供了一个SeleniumRequest类,可以让我们在scrapy中发送selenium请求,而不是普通的HTTP请求。
  • 它提供了一个SeleniumMiddleware类,可以让我们在scrapy中处理selenium响应,而不是普通的HTML响应。
  • 它提供了一个SeleniumSpider类,可以让我们在scrapy中使用selenium来编写爬虫逻辑,而不是普通的scrapy.Spider类。

正文

要使用scrapy_selenium来爬取Ajax、JSON、XML等数据格式的网页,我们需要遵循以下几个步骤:

  • 安装scrapy_selenium库。我们可以使用pip命令来安装scrapy_selenium库,如下所示:
pip install scrapy-selenium
  • 配置scrapy_selenium设置。我们需要在settings.py文件中添加以下内容:
# 设置selenium驱动程序的路径
SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = '/path/to/chromedriver'
# 设置selenium驱动程序的选项
SELENIUM_DRIVER_ARGUMENTS = ['--headless'] # 使用无头模式
# 启用selenium中间件
DOWNLOADER_MIDDLEWARES = {
   
   
    'scrapy_selenium.SeleniumMiddleware': 800
}
  • 编写selenium爬虫。我们需要继承SeleniumSpider类,并重写start_requests方法和parse方法,如下所示:
from scrapy_selenium import SeleniumRequest, SeleniumSpider

class MySpider(SeleniumSpider):
    name = 'my_spider'

    def start_requests(self):
        # 发送selenium请求,指定回调函数和元数据
        yield SeleniumRequest(
            url='https://example.com', # 目标网址
            callback=self.parse, # 回调函数
            meta={
   
   'proxy': self.get_proxy()} # 元数据,包含代理信息
        )

    def parse(self, response):
        # 处理selenium响应,提取数据或跟进链接
        # response为一个SeleniumResponse对象,它包含了driver属性,即浏览器驱动对象
        driver = response.driver # 获取浏览器驱动对象
        data = driver.find_element_by_xpath('//div[@id="data"]') # 通过xpath定位数据元素
        print(data.text) # 打印数据内容

    def get_proxy(self):
        #设置亿牛云 爬虫加强版代理
        #获取代理信息,返回一个字符串,格式为'user:pass@host:port'        
        proxyHost = "www.16yun.cn"
        proxyPort = "3111"
        proxyUser = "16YUN"
        proxyPass = "16IP"
        return f'{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}'

案例

为了演示scrapy_selenium如何爬取Ajax、JSON、XML等数据格式的网页,我们以豆瓣电影为例,爬取它的电影列表和详情页。我们可以发现,豆瓣电影的电影列表是通过Ajax异步加载的,而电影详情页是通过JSON格式返回的。我们的目标是爬取每部电影的名称、评分、简介和海报图片,并保存到本地。

  • 首先,我们需要创建一个scrapy项目,并安装scrapy_selenium库:
scrapy startproject douban
cd douban
pip install scrapy_selenium
  • 然后,我们需要配置scrapy_selenium设置,修改settings.py文件如下:
# 设置selenium驱动程序的路径
SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = '/path/to/chromedriver'
# 设置selenium驱动程序的选项
SELENIUM_DRIVER_ARGUMENTS = ['--headless'] # 使用无头模式
# 启用selenium中间件
DOWNLOADER_MIDDLEWARES = {
   
   
    'scrapy_selenium.SeleniumMiddleware': 800
}
# 设置图片管道
ITEM_PIPELINES = {
   
   
    'scrapy.pipelines.images.ImagesPipeline': 300
}
# 设置图片存储路径
IMAGES_STORE = 'images'
  • 接着,我们需要编写selenium爬虫,创建douban/spiders/douban.py文件如下:
from scrapy_selenium import SeleniumRequest, SeleniumSpider
from douban.items import DoubanItem

class DoubanSpider(SeleniumSpider):
    name = 'douban'

    def start_requests(self):
        # 发送selenium请求,指定回调函数和元数据
        yield SeleniumRequest(
            url='https://movie.douban.com/', # 目标网址
            callback=self.parse, # 回调函数
            meta={
   
   'proxy': self.get_proxy()} # 元数据,包含代理信息
        )

    def parse(self, response):
        # 处理selenium响应,提取数据或跟进链接
        # response为一个SeleniumResponse对象,它包含了driver属性,即浏览器驱动对象
        driver = response.driver # 获取浏览器驱动对象
        movies = driver.find_elements_by_xpath('//div[@class="list"]/a') # 通过xpath定位电影元素列表
        for movie in movies: # 遍历每部电影元素
            item = DoubanItem() # 创建一个DoubanItem对象,用于存储数据
            item['name'] = movie.get_attribute('title') # 获取电影名称属性,并赋值给item['name']
            item['url'] = movie.get_attribute('href') # 获取电影详情页链接属性,并赋值给item['url']
            yield SeleniumRequest( # 发送selenium请求,请求电影详情页,并指定回调函数和元数据
                url=item['url'], 
                callback=self.parse_detail, 
                meta={
   
   'item': item, 'proxy': self.get_proxy()} # 元数据,包含item对象和代理信息
            )

    def parse_detail(self, response):
        # 处理selenium响应,提取数据或跟进链接
        # response为一个SeleniumResponse对象,它包含了driver属性,即浏览器驱动对象
        driver = response.driver # 获取浏览器驱动对象
        item = response.meta['item'] # 获取元数据中的item对象
        data = driver.find_element_by_xpath('//div[@id="info"]') # 通过xpath定位数据元素
        item['rating'] = data.find_element_by_xpath('.//strong').text # 获取评分元素的文本,并赋值给item['rating']
        item['summary'] = data.find_element_by_xpath('.//span[@property="v:summary"]').text # 获取简介元素的文本,并赋值给item['summary']
        item['image_urls'] = [data.find_element_by_xpath('.//img[@rel="v:image"]').get_attribute('src')] # 获取海报图片元素的链接,并赋值给item['image_urls']
        yield item # 返回item对象

    def get_proxy(self):
        #设置亿牛云 爬虫加强版代理
        #获取代理信息,返回一个字符串,格式为'user:pass@host:port' 
        proxyHost = "www.16yun.cn"
        proxyPort = "3111"
        proxyUser = "16YUN"
        proxyPass = "16IP"
        return f'{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}'

结语

通过上面的介绍和案例,我们通过上面的介绍和案例,我们可以了解到scrapy_selenium是一个非常强大和灵活的爬虫框架,它可以让我们轻松地爬取Ajax、JSON、XML等数据格式的网页,而不需要编写复杂的JavaScript代码或使用其他的工具。scrapy_selenium也可以与scrapy的其他组件和功能相结合,如图片管道、代理中间件、数据存储等,从而提高爬虫的效率和质量。

相关文章
|
2月前
|
XML 存储 JSON
Twaver-HTML5基础学习(19)数据容器(2)_数据序列化_XML、Json
本文介绍了Twaver HTML5中的数据序列化,包括XML和JSON格式的序列化与反序列化方法。文章通过示例代码展示了如何将DataBox中的数据序列化为XML和JSON字符串,以及如何从这些字符串中反序列化数据,重建DataBox中的对象。此外,还提到了用户自定义属性的序列化注册方法。
46 1
|
3月前
|
XML JSON 前端开发
【Web前端揭秘】XML与JSON:数据界的双雄对决,你的选择将如何改写Web世界的未来?
【8月更文挑战第26天】本文深入探讨了XML和JSON这两种广泛使用的数据交换格式在Web前端开发中的应用。XML采用自定义标签描述数据结构,适用于复杂层次数据的表示,而JSON则以键值对形式呈现数据,更为轻量且易解析。通过对两种格式的示例代码、结构特点及应用场景的分析,本文旨在帮助读者更好地理解它们的差异,并根据实际需求选择最合适的数据交换格式。
60 1
|
2月前
|
XML JSON 数据处理
C# 中的 XML 与 JSON 数据处理
在现代软件开发中,数据交换和存储需求日益增长,XML 和 JSON 成为最常用的数据格式。本文从 C# 角度出发,详细介绍如何处理这两种格式,并提供示例代码。对于 XML,我们介绍了读取、创建和写入 XML 文件的方法;对于 JSON,则展示了如何使用 Newtonsoft.Json 库进行数据解析和序列化。此外,文章还总结了常见问题及其解决方案,帮助开发者更好地应对实际项目中的挑战。
178 61
C# 中的 XML 与 JSON 数据处理
|
1月前
|
XML JSON 数据可视化
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
本文详细介绍了不同数据集格式之间的转换方法,包括YOLO、VOC、COCO、JSON、TXT和PNG等格式,以及如何可视化验证数据集。
63 1
数据集学习笔记(二): 转换不同类型的数据集用于模型训练(XML、VOC、YOLO、COCO、JSON、PNG)
|
2月前
|
JSON 前端开发 JavaScript
JavaWeb基础8——Filter,Listener,Ajax,Axios,JSON
Filter过滤器、Listener监听器、AJAX、 同步、异步优点和使用场景、Axios异步框架、JSON、js和JSON转换、案例,Axios + JSON 品牌列表查询和添加
JavaWeb基础8——Filter,Listener,Ajax,Axios,JSON
|
3月前
|
XML 前端开发 JavaScript
Ajax(Asynchronous JavaScript and XML)
【8月更文挑战第16天】
32 3
|
3月前
|
XML JSON Java
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
本文介绍了如何使用IntelliJ IDEA和Maven搭建一个整合了Struts2、Spring4、Hibernate4的J2EE项目,并配置了项目目录结构、web.xml、welcome.jsp以及多个JSP页面,用于刷新和学习传统的SSH框架。
88 0
使用IDEA+Maven搭建整合一个Struts2+Spring4+Hibernate4项目,混合使用传统Xml与@注解,返回JSP视图或JSON数据,快来给你的SSH老项目翻新一下吧
|
3月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
51 0
|
3月前
|
XML JSON 前端开发
JSON与AJAX:网页交互的利器
JSON与AJAX:网页交互的利器
37 0
|
4月前
|
XML JSON 缓存
优化Java中XML和JSON序列化
优化Java中XML和JSON序列化