Scrap爬虫框架集成Selenium来解析动态网页

news/2024/11/24 4:22:30/

1、爬虫项目单独使用scrpay框架的不足

当前网站普遍采用了javascript 动态页面,特别是vue与react的普及,使用scrapy框架定位动态网页元素十分困难,而selenium是最流行的浏览器自动化工具,可以模拟浏览器来操作网页,解析元素,执行动作,可以处理动态网页,使用selenium处理1个大型网站,速度很慢,而且非常耗资源,是否可以将selenium集成到scrapy框架中,发挥二者的优点呢?

Scrapy集成selenium的关键是,将其放入DownloaderMiddleware. 如下面的scrapy原理图,可以在Downloader的中间件方法中,修改request与response对象,再返回给scrapy
在这里插入图片描述

可以自定义downloader middleware 中间件类来集成selenium,当然实现selenium的所有特性,工作量比较大。因此,我们推荐使用scrapy-selenium第3方为来集成。

2. 搭建 scrapy-selenium 开发环境

2.1 安装scrapy-selenium库

pip install scrapy-selenium
python 版本应大于3.6,

2.2 安装浏览器驱动

本机上应该安装有1个selenium支持的浏览器,如chrom, firefox, edge等
再安装对应浏览器、版本的webdrive
下载 downloaded chromedriver.exe 之后,放在项目根目录下,或者加入系统环境变量。

2.3 集成selenium到scrapy 项目

项目结构如下


├── scrapy.cfg
├── chromedriver.exe ## <-- Here
└── myproject├── __init__.py├── items.py├── middlewares.py├── pipelines.py├── settings.py└── spiders└── __init__.py

进入项目文件夹,更新settings.py

## settings.py# for Chrome driver 
from shutil import whichSELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver')
SELENIUM_DRIVER_ARGUMENTS=['--headless']  DOWNLOADER_MIDDLEWARES = {'scrapy_selenium.SeleniumMiddleware': 800}

3. 在spider中使用selenium来解析网页

在spider中,用SeleniumRequest 类来代替selenium内置的Request类。

## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItem
from scrapy_selenium import SeleniumRequestclass QuotesSpider(scrapy.Spider):name = 'quotes'def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url, callback=self.parse)def parse(self, response):quote_item = QuoteItem()for quote in response.css('div.quote'):quote_item['text'] = quote.css('span.text::text').get()quote_item['author'] = quote.css('small.author::text').get()quote_item['tags'] = quote.css('div.tags a.tag::text').getall()yield quote_item

scrapy 会自动调用selenium来解析response回传的页面元素,这里selenium 使用的是headless chrom浏览器。

4. 使用selenium 的特性来爬取数据

可以使用selenium的特性,如
• 网页元素等待
• 模拟点击等操作
• 屏幕截图
等。

(1)Waits 功能

动态网页定位不到元素,通常是由于组件加载顺序,ajax 异步请求更新等造成的,而selenium提供了 wait_until的功能来处理实现对动态网页元素的定位。
所有request 等待10秒

def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url, callback=self.parse, wait_time=10)

使用selenium wait_until条件等待功能

## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItemfrom scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECclass QuotesSpider(scrapy.Spider):name = 'quotes'def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url, callback=self.parse, wait_time=10,wait_until=EC.element_to_be_clickable((By.CLASS_NAME, 'quote')))def parse(self, response):quote_item = QuoteItem()for quote in response.selector.css('div.quote'):quote_item['text'] = quote.css('span.text::text').get()quote_item['author'] = quote.css('small.author::text').get()quote_item['tags'] = quote.css('div.tags a.tag::text').getall()yield quote_item

(2) 点击按钮

比如,可以配置selenium执行 a 标签的点击事件

lass QuotesSpider(scrapy.Spider):name = 'quotes'def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url,callback=self.parse,script="document.querySelector('.pager .next>a').click()",)

(3)页面截图

## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItem
from scrapy_selenium import SeleniumRequestclass QuotesSpider(scrapy.Spider):name = 'quotes'def start_requests(self):url = 'https://quotes.toscrape.com/js/'yield SeleniumRequest(url=url, callback=self.parse, screenshot=True)def parse(self, response):with open('image.png', 'wb') as image_file:image_file.write(response.meta['screenshot'])

http://www.ppmy.cn/news/778248.html

相关文章

在web中打开SVG格式文件

在web网页中打开SVG格式文件 浏览器&#xff1a;QQ浏览器、火狐浏览器、谷歌浏览器均可 效果图&#xff1a; 第一步&#xff1a;打开 QQ浏览器&#xff1b; 第二步&#xff1a;将 .svg 文件拖入网页栏&#xff1b; 第三步&#xff1a;打开拖入的网页即可。

svg格式的图片转化为 png 格式

下载并使用插件插件&#xff1a;save-svg-as-pngimport saveSvg from "save-svg-as-png";let path ${url}?t${new Date().getTime()};const parser new DOMParser();fetch(path).then(response > response.text()).then(text > {const parsed parser.parseF…

R语言使用svg函数将可视化图像结果保存为svg格式、使用svg函数打开图像设备、使用dev.off函数关闭图像设备

R语言使用svg函数将可视化图像结果保存为svg格式、使用svg函数打开图像设备、使用dev.off函数关闭图像设备 目录

SVG是什么?了解svg 编写svg 使用svg

SVG是什么&#xff1f;简单了解下 SVG是一种XML语言&#xff0c;类似XHTML&#xff0c;可以用来绘制矢量图形。 HTML提供了定义标题、段落、表格等等内容的元素。与此类似&#xff0c;SVG也提供了一些元素&#xff0c;用于定义圆形、矩形、简单或复杂的曲线。一个简单的SVG文…

图片转Svg格式以及压缩优化方法

除了文中方法&#xff0c;还可以使用svgo工具对svg图片进行压缩&#xff1a;可参考svgo 背景 前端有些时候需要把像png、jpg等格式的图片转为svg格式的矢量图使用&#xff0c;但是直接去一些网站里转换&#xff0c;得到的svg代码往往因为冗余信息实在太多&#xff0c;大得离谱…

c# System.IO命名空间 文件的各种属性操作

c# System.IO命名空间 文件的各种属性操作 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace Test05 { public partial…

svg怎么转为jpg格式?

svg怎么转换成jpg格式&#xff1f; 什么是svg格式&#xff1f;svg是一种图形文件格式&#xff0c;意思为可缩放的矢量图形。所以svg算是一种开放标准的矢量图形语言&#xff0c;可以用来设计高分辨率的web图形页面&#xff0c;对于开发者来说&#xff0c;可以使用代码来描绘图像…

来来来一起用C#解析渲染显示SVG矢量图转化格式保存

文章目录 一、下载和安装SVG库1、下载需要注意版本2、初探功能函数 二、第一个svg图像代码1、读取一个SVG文件显示出来2、自己绘制一个3、显示代码4、效果 三、文件格式转换和保存1、自带的save保存SVG文件2、用bitmap的Save完成转化 文章出处&#xff1a; 来来来一起用C#解析…