scrapy_selenium rastrea páginas web Ajax, JSON y XML: Douban Movie

Agente en la nube Yiniu

Introducción

En el proceso de desarrollo de rastreadores web, a menudo nos encontramos con algunas páginas web cargadas dinámicamente, cuyos datos no están directamente incrustados en HTML, sino que se obtienen de forma asincrónica a través de Ajax, JSON, XML, etc. Estas páginas web son difíciles de analizar directamente para los rastreadores scrapy tradicionales. Entonces, ¿cómo utilizamos scrapy_selenium para rastrear páginas web en estos formatos de datos? Este artículo le presentará los principios básicos y el uso de scrapy_selenium y le brindará un caso práctico.

descripción general

scrapy_selenium es un marco de rastreo que combina scrapy y selenium. Nos permite usar selenium en scrapy para controlar el navegador y rastrear páginas web dinámicas. Las principales características de scrapy_selenium son:

  • Proporciona una clase SeleniumRequest que nos permite enviar solicitudes de selenio en scrapy en lugar de solicitudes HTTP normales.
  • Proporciona una clase SeleniumMiddleware que nos permite procesar respuestas de selenio en scrapy en lugar de respuestas HTML normales.
  • Proporciona una clase SeleniumSpider que nos permite usar selenio en scrapy para escribir la lógica del rastreador en lugar de la clase scrapy.Spider normal.

texto

Para utilizar scrapy_selenium para rastrear páginas web en Ajax, JSON, XML y otros formatos de datos, debemos seguir los siguientes pasos:

  • Instale la biblioteca scrapy_selenium. Podemos usar el comando pip para instalar la biblioteca scrapy_selenium de la siguiente manera:
pip install scrapy-selenium
  • Configure los ajustes de scrapy_selenium. Necesitamos agregar lo siguiente al archivo 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
}
  • Escribe un rastreador de selenio. Necesitamos heredar la clase SeleniumSpider y reescribir el método start_requests y el método parse de la siguiente manera:
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}'

el caso

Para demostrar cómo scrapy_selenium rastrea páginas web en Ajax, JSON, XML y otros formatos de datos, tomamos Douban Movie como ejemplo para rastrear su lista de películas y su página de detalles. Podemos encontrar que la lista de películas de Douban Movies se carga de forma asincrónica a través de Ajax y la página de detalles de la película se devuelve en formato JSON. Nuestro objetivo es rastrear el nombre, la calificación, el perfil y la imagen del póster de cada película y guardarla localmente.

  • Primero, necesitamos crear un proyecto scrapy e instalar la biblioteca scrapy_selenium:
scrapy startproject douban
cd douban
pip install scrapy_selenium
  • Luego, necesitamos configurar los ajustes de scrapy_selenium y modificar el archivo settings.py de la siguiente manera:
# 设置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'
  • A continuación, debemos escribir un rastreador de selenio y crear el archivo douban/spiders/douban.py de la siguiente manera:
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}'

epílogo

A través de la introducción y el caso anteriores, podemos comprender que scrapy_selenium es un marco de rastreo muy potente y flexible que nos permite rastrear fácilmente páginas web en Ajax, JSON, XML y otros formatos de datos, sin necesidad de escribir código JavaScript complejo ni utilizarlo. otras herramientas. scrapy_selenium también se puede combinar con otros componentes y funciones de scrapy, como canalización de imágenes, middleware proxy, almacenamiento de datos, etc., para mejorar la eficiencia y calidad de los rastreadores.

Supongo que te gusta

Origin blog.csdn.net/ip16yun/article/details/132408943
Recomendado
Clasificación