Python爬虫图片懒加载技术 selenium和PhantomJS解析

Python爬虫图片懒加载技术 selenium和PhantomJS解析

本文将介绍如何利用Python爬虫对使用懒加载技术的网页上的图片进行爬取。在这里我将使用selenium和PhantomJS解析器作为我们工具。其中selenium是一个流行的Web自动化测试框架,可以模拟用户在浏览器上的各种操作,而PhantomJS是一个无界面的,基于WebKit的JavaScript解释器,可以处理Web界面渲染和页面抓取的任务。以下是整个过程的详细步骤。

准备工作

在开始之前,您需要先安装以下工具:

  1. Python:我将使用Python3版本,您可以前往官网下载安装。
  2. selenium源代码包和PhantomJS解析器:您可以使用以下命令进行安装:
pip install selenium
  1. PhantomJS解析器:您也可以从PhantomJS官网下载并安装。

步骤 1:使用selenium和PhantomJS设置驱动程序

在这个项目中,我们将使用PhantomJS作为解析器,selenium作为Python与PhantomJS之间的桥梁。以下是如何设置这些驱动程序的步骤:

from selenium import webdriver

#创建PhantomJS的web驱动
browser = webdriver.PhantomJS(executable_path='D:/Tools/phantomjs-2.1.1-windows/bin/phantomjs.exe')

以上代码会创建一个名为“browser”的PhantomJS web驱动程序,并将其保存在可执行文件“phantomjs.exe”的路径中。这里,我们将会使用phantomjs 作为我们的默认解析器。

步骤 2:访问网站并加载页面

接下来,我们将访问我们要爬取数据的目标网站,并加载其中的所有网页内容。以下是这个步骤的代码:

#访问目标网站
browser.get("https://www.example.com")

#加载网站全部内容
content = browser.page_source.encode('utf-8')

这里,我们使用了PhantomJS的get方法来实现对目标网站的访问。我们在加载了全部网站内容之后,将会使用Python的encode()函数对其进行编码,最终将其保存在变量“content”中。

步骤 3:识别页面中的图片

在这个步骤中,我们将使用BeautifulSoup库来解析页面中所有元素。以下是这个步骤的代码:

from bs4 import BeautifulSoup

soup = BeautifulSoup(content,'lxml')
img_tags = soup.find_all('img',src=True)

以上代码将使用BeautifulSoup库对页面内容进行解析,并将其中所有包含“img”元素的标签都存储在名为“img_tags”的变量中。

步骤 4:下载页面中的所有图片

在这个步骤中,我们将循环遍历所有的图像标签,并尝试下载其中的图片。以下是这个步骤的代码:

import requests
import os

#定义存储文件夹的路径
folder_path='./images/'

#判断文件夹是否存在,不存在则新建
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

#循环遍历所有的图像标签
for img in img_tags:
    #获取图像的URL
    img_url = img['src']

    #下载图像并将其保存到指定的文件夹中
    response = requests.get(img_url)
    with open(folder_path + img_url.split('/')[-1], 'wb') as f:
        f.write(response.content)
        print("下载图片:",img_url)

在以上代码中,我们使用了requests库和os库。requests库被用来下载我们在步骤2中指定的图片,而os库则被用来定义我们存储所有图片的文件夹路径。

示例1

以下是一个完整代码片段。在这个示例中,我们将抓取豆瓣电影《肖申克的救赎》的海报。

from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import os

#创建PhantomJS的web驱动
browser = webdriver.PhantomJS(executable_path='D:/Tools/phantomjs-2.1.1-windows/bin/phantomjs.exe')

#访问目标网站
browser.get("https://www.douban.com/")

#输入检索关键字并搜索
search_input = browser.find_element_by_name('q')
search_input.send_keys("肖申克的救赎")
search_input.submit()

#等待关键字检索结果
browser.implicitly_wait(3)

#加载网站全部内容
content = browser.page_source.encode('utf-8')

#解析页面内容,获取图像标签
soup = BeautifulSoup(content, 'lxml')
img_tags = soup.find_all('img', {"src": re.compile(".*doubanio\.com.*")})

#定义存储文件夹的路径
folder_path = './images/'

#判断文件夹是否存在,不存在则新建
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

#下载所有的图像
for img in img_tags:
    #获取图像的URL
    img_url = img['src']

    #下载图像并将其保存到指定的文件夹中
    response = requests.get(img_url)
    with open(folder_path + img_url.split('/')[-1], 'wb') as f:
        f.write(response.content)
        print("Downloaded image: ", img_url)

在以上代码中,我们使用了PhantomJS作为我们的浏览器解析器,使用了BeautifulSoup库来获取页面中包含“img”标签元素的标签列表,并通过使用requests库将所有的图像下载到一个单独的文件夹中。

示例2

接下来,我们再来看一个例子:我们将尝试爬取一个包含“延时加载”图片的网站。此类网站仅在用户滚动到图像位置时才加载显示该图像。如果我们在步骤3和4中执行遇到这种情况,那么我们只能爬取到在页面加载时就被加载的图片。幸运的是,PhantomJS提供了一个解决方案,它可以以模拟用户在浏览器中操作的方式来自动触发图片的延时加载。以下是这个示例的完整代码:

from selenium import webdriver
from bs4 import BeautifulSoup
import requests
import os

#创建PhantomJS的web驱动
driver = webdriver.PhantomJS(executable_path='D:/Tools/phantomjs-2.1.1-windows/bin/phantomjs.exe')

#访问目标网站
driver.get("https://stackoverflow.com/questions/43085512/selenium-webdriver-get-all-elements-with-class-name")

#滚动窗口,自动加载所有延时加载图片
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

#加载网站全部内容
content = driver.page_source.encode('utf-8')

#解析页面内容,获取图像标签
soup = BeautifulSoup(content, 'lxml')
img_tags = soup.find_all('img', {"class": "load-lazy"})

#定义存储文件夹的路径
folder_path = './images/'

#判断文件夹是否存在,不存在则新建
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

#下载所有的图像
for img in img_tags:
    #获取图像的URL
    img_url = img['data-src']

    #下载图像并将其保存到指定的文件夹中
    response = requests.get(img_url)
    with open(folder_path + img_url.split('/')[-1], 'wb') as f:
        f.write(response.content)
        print("Downloaded image: ", img_url)

以上代码中,仅在浏览器自动滚动到“document.body.scrollHeight”时才会加载所有的延时加载图片。在我们获取页面内所有的“img”标签元素时,我们将选择“class”属性中包含“load-lazy”的标签,并将它们存储在名为“img_tags”的变量组中。最后,我们将使用requests库从每个图像的URL中下载图像,并将其保存到一个名为“images”的文件夹中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫图片懒加载技术 selenium和PhantomJS解析 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python实现一个优先级队列的方法

    下面是“Python实现一个优先级队列的方法”的完整攻略,步骤如下: 步骤一:理解优先级队列的概念 优先级队列是一种数据结构,它可以按照优先级来排列元素。在优先级队列中,每个元素都有一个优先级,最高优先级的元素最先被处理,而优先级较低的元素后被处理。优先级队列可以用来解决很多实际问题,比如任务调度、事件处理等。 步骤二:选择合适的实现方式 Python中有多…

    python 2023年6月3日
    00
  • Python三目运算符(三元运算符)用法详解(含实例代码)

    Python三目运算符(三元运算符) Python三目运算符也被称为三元运算符,是一种简洁的条件表达式,用于在满足条件时返回两个不同的值之一。它的语法结构如下: a if condition else b 其中condition是一个条件表达式,如果其结果为True,则返回a,否则返回b。 三目运算符在Python中可以大大缩短常见的if-else语句的代码…

    python 2023年5月14日
    00
  • python二维键值数组生成转json的例子

    下面我就为你详细讲解如何将Python中的二维键值数组转换成JSON格式的字符串。 1. 什么是二维键值数组? 在Python中,二维键值数组实际上就是嵌套字典(也可以理解为嵌套的字典列表),其中第一层字典的键值对的值是第二层字典。 下面是一个简单的嵌套字典的例子: data = {‘name’: ‘张三’, ‘age’: 20, ‘scores’: {‘数…

    python 2023年5月13日
    00
  • 使用pyinstaller逆向.pyc文件

    使用 PyInstaller 逆向 .pyc 文件需要以下步骤: 安装 PyInstaller 使用 Pip 命令安装 PyInstaller: pip install pyinstaller 生成 .spec 文件 在终端或命令行中执行以下命令生成 .spec 文件: pyinstaller –name=app_name file.pyc 其中,–na…

    python 2023年6月3日
    00
  • python中%格式表达式实例用法

    下面是详细的攻略: Python中%格式表达式实例用法 在Python中,我们可以使用%格式表达式来格式化字符串。%格式表达式是一种非常方便的字符串格式化方式,可以将变量插入到字符串中。本文将详细讲解Python中%格式表达式的语法和用法,并提供两个示例说明。 %格式表达式语法 Python中%格式表达式的语法如下: string % values 其中,s…

    python 2023年5月14日
    00
  • 对Python3中的input函数详解

    对Python3中的input函数详解 在Python3中,input()函数用于从标准输入读取用户输入的字符串。该函数会阻塞程序执行,直到用户输入完毕并按下回车键为止。 函数语法 input([prompt]) 参数说明 prompt:可选参数,表示用户输入时在屏幕上输出的提示信息。如果该参数未提供,则不会输出任何提示信息。 返回值 input()函数返回…

    python 2023年6月5日
    00
  • Python之ascii转中文的实现

    概述 在Python中,我们可以使用内置的 chr() 和 ord() 函数来进行字符和ASCII码之间的相互转换。但是,如果我们需要把一堆ASCII码转成相应的中文怎么办呢?接下来,让我们来逐步实现实现这个转换的过程。 获取ASCII码值 首先,我们需要获取每个中文字符的ASCII码值。Python中的 ord() 函数可以帮助我们实现。我们可以使用下面的…

    python 2023年5月31日
    00
  • Python 函数式编程和并发

    Python函数式编程和并发使用是Python编程中非常重要的两个知识点,本文将为大家提供一份完整攻略。 Python函数式编程 函数式编程是基于数学上的函数概念而发展的一种编程范式,它的特点是将计算视为数学函数的计算,并避免使用程序状态以及变量等需要修改的数据结构,尽量使用无状态(immutable)数据结构,从而消除了副作用带来的影响。 Python提供…

    python-answer 2023年3月25日
    00
合作推广
合作推广
分享本页
返回顶部