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

yizhihongxing

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 中,异常可以分为以下几类: 语法错误(Syntax Error) 语法错误是指在编…

    python 2023年5月13日
    00
  • Python 实现循环最快方式(for、while 等速度对比)

    Python 实现循环最快方式 在Python编程中,循环是常见的操作。常用的循环语句有for循环和while循环。那么,在Python中,如何实现最快的循环方式呢? 1. 使用 xrange 代替 range 函数 Python内置函数range()是一个很常见的循环操作函数。但是当循环次数比较多时,使用range()会比较慢,可以使用一个专门针对循环的函…

    python 2023年6月3日
    00
  • 如何通过雪花算法用Python实现一个简单的发号器

    下面是详细讲解“如何通过雪花算法用Python实现一个简单的发号器”的完整攻略,包含两个示例说明。 雪花算法简介 雪花算法是一种用于生成唯一ID的算法。它可以生成全局唯一的ID,适用于分布式系统中的唯一标识符。 雪花算法实现 下面是Python实现雪花算法的代码: import time class Snowflake: def __init__(self,…

    python 2023年5月14日
    00
  • Postman安装与使用详细教程 附postman离线安装包

    Postman 安装与使用详细教程 Postman 是一款流行的 API 开发工具,可以帮助开发者快速测试和调试 API 接口。以下是 Postman 的安装与使用详细教程。 1. 下载 Postman 首先,我们需要从 Postman 官网下载适合自己操作系统的安装包。可以访问 https://www.postman.com/downloads/ 下载最新…

    python 2023年5月15日
    00
  • 如何使用Python在MySQL中使用主键?

    在MySQL中,主键是一种用于唯一标识表中每一行的特殊列。在Python中,可以使用MySQL连接来执行主键查询。以下是在Python中使用主键的完整攻略,包括主键的基本语法、使用主键的示例以及如何在Python中使用主键。 主键的基本语法 MySQL中,可以使用PRIMARY KEY关键字来指定主键列。以下创建主键列的基本法: TABLE table_na…

    python 2023年5月12日
    00
  • python爬虫今日热榜数据到txt文件的源码

    在本攻略中,我们将介绍如何使用Python爬虫获取今日热榜数据,并将数据保存到txt文件中。以下是一个完整攻略,包括两个示例。 步骤1:分析网页结构 首先,我们需要分析今日热榜页面的HTML结构。我们可以使用Chrome浏览器的开发者工具来查看页面的HTML结构。 在Chrome浏览器中,我们可以按F12键打开开发者工具。然后,我们可以选择“Elements…

    python 2023年5月15日
    00
  • Python字典的概念及常见应用实例详解

    Python字典的概念及常见应用实例详解 Python字典的概念 Python字典是一种可变容器类型,可以存储任意数量的Python对象,如数字、字符串、列表、甚至其他字典等。与列表、元组、集合等有序容器类型不同,字典是无序容器类型。 Python字典通过键(key)来查询对应的值(value),可以理解为一种映射关系。一个字典包含多个键值对,键值对用冒号分…

    python 2023年5月13日
    00
  • 解决Python pip 自动更新升级失败的问题

    针对“解决Python pip自动更新升级失败的问题”,我提供以下完整攻略: 问题描述 在使用Python的pip包管理工具进行更新、安装或升级软件时,可能会出现以下错误信息: Could not fetch URL https://pypi.org/simple/xxx: There was a problem confirming the ssl cer…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部