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 爬取腾讯视频评论的实现步骤

    要爬取腾讯视频评论,可以采用以下步骤: 1. 分析腾讯视频评论的接口 腾讯视频评论的接口为:https://video.coral.qq.com/video/article/comment/v2 在浏览器中打开该接口,可以看到该接口需要传入以下参数: cid:视频id,例如 1047256471。 pageflag:分页标志,用于翻页,第一页为 0,第二页为…

    python 2023年6月7日
    00
  • Python获取昨天、今天、明天开始、结束时间戳的方法

    获取昨天、今天、明天开始、结束时间戳是Python中常用的操作,本文将详细讲解如何使用Python获取这些时间戳。 获取昨天、今天、明天的开始时间戳 通常我们把一天的开始时间定义为0点0分0秒,当然这个可以根据业务需求进行修改。Python中获取当前日期时间并构造成时间戳可以使用datetime和time两个模块。具体如下: import datetime …

    python 2023年6月2日
    00
  • Python代码中引用已经写好的模块、方法的两种方式

    下面是Python代码中引用已经写好的模块、方法的两种方式的详细攻略。 1. import语句 import语句是在Python中用来引入其他模块或包中的对象。可以使用import语句引入整个模块或指定模块中的某一个或多个对象。import语句可以出现在脚本的任意位置,但通常在脚本的开头。 引入整个模块 假设我们已经编写了一个模块foo.py,其中包含一个名…

    python 2023年6月2日
    00
  • pyppeteer执行js绕过webdriver监测方法上

    在本攻略中,我们将介绍如何使用pyppeteer执行JavaScript代码绕过webdriver监测方法。webdriver监测方法是一种常见的反爬虫技术,可以检测到使用Selenium等自动化测试工具进行网页操作的行为。我们可以使用pyppeteer库来模拟人类操作,绕过这种监测方法。 以下是一个完整攻略,包括两个示例。 步骤1:安装pyppeteer库…

    python 2023年5月15日
    00
  • Python爬虫之requests库基本介绍

    Python爬虫之requests库基本介绍 在Python中,requests库是一个常用的HTTP客户端库,用于发送HTTP请求和处理HTTP响应。本文将介绍requests库的基本用法,并提供两个示例。 requests库的安装 在使用requests库之前,需要先安装它。可以使用pip命令来安装requests库,如下所示: pip install …

    python 2023年5月15日
    00
  • python写一个随机点名软件的实例

    下面就是Python写一个随机点名软件的实例的完整攻略。 步骤一:安装所需的库 首先,我们需要安装Python的random库来生成随机数,以及Tkinter库来创建GUI界面。在终端或命令提示符中输入以下命令来安装这些库: pip install random pip install tkinter 步骤二:创建GUI界面 使用Tkinter库来创建GUI…

    python 2023年6月3日
    00
  • python 获取list 长度

    获取Python中list的长度非常简单,只需要使用len()函数即可。下面是具体的攻略: 步骤1:准备一个列表 在获取列表长度之前,需要先创建一个Python列表。例如,以下是一个包含5个元素的列表: my_list = [1, 2, 3, 4, 5] 步骤2:使用len()函数获取列表长度 要获取该列表的长度,只需要使用len()函数。该函数将返回一个整…

    python 2023年6月6日
    00
  • python抓取网页时字符集转换问题处理方案分享

    关于“python抓取网页时字符集转换问题处理方案分享”的攻略,可以包含以下几个方面的内容: 1. 理解字符编码 在处理字符集转换问题时,需要首先理解字符编码的概念。常见的字符编码包括ASCII、GB2312、GBK、UTF-8等等,不同的编码方式对应着不同的字符集,因此在处理字符集转换问题时,要先确定所处理的网页使用哪种编码方式。 2. 确认网页编码方式 …

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