Python爬虫图片懒加载技术 selenium和PhantomJS解析
本文将介绍如何利用Python爬虫对使用懒加载技术的网页上的图片进行爬取。在这里我将使用selenium和PhantomJS解析器作为我们工具。其中selenium是一个流行的Web自动化测试框架,可以模拟用户在浏览器上的各种操作,而PhantomJS是一个无界面的,基于WebKit的JavaScript解释器,可以处理Web界面渲染和页面抓取的任务。以下是整个过程的详细步骤。
准备工作
在开始之前,您需要先安装以下工具:
- Python:我将使用Python3版本,您可以前往官网下载安装。
- selenium源代码包和PhantomJS解析器:您可以使用以下命令进行安装:
pip install selenium
- 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技术站