图片懒加载、selenium和PhantomJS

图片懒加载(Lazy Loading)是指网站在访问时,仅加载页面浏览器窗口可视范围内的图片,当滚动条滑动至其他位置时,再通过 JavaScript 技术异步地加载其他图片,从而避免了所有图片同时加载因而导致的网速缓慢、页面响应时间长的影响。在一些需要加载大量图片的网站中,使用图片懒加载可以有效提升用户体验。

然而,由于图片懒加载的机制是基于滚动条的位置来加载图片的,这给爬虫的抓取带来了困难。常规的爬虫技术无法获取那些通过 JavaScript 动态加载的图片地址,因为这些图片地址并没有出现在网页的源代码中。因此,为了爬取这样的图片信息,可以使用 Selenium 和 PhantomJS 等自动化测试工具。

Selenium 是一个通过浏览器模拟用户操作行为来测试 Web 应用程序的工具,可支持多种脚本语言(如 PythonJavaJavaScript 等),因而增强了爬虫的可编程性。使用 Selenium,可以模拟用户的滚动操作,从而使得懒加载的图片被逐个加载出来,从而获取它们的具体信息。

以下是一个使用 Python 和 Selenium 抓取大众点评上某个餐厅所有评论图片的示例代码:

``` python

from selenium import webdriver

# 打开浏览器

browser = webdriver.Firefox()

# 打开目标页面

url = 'https://www.dianping.com/shop/3341440/review_all'

browser.get(url)

# 模拟滚动操作:从第一张评论图开始逐张加载图片

while True:

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

# 获取所有图片元素

img_elems = browser.find_elements_by_css_selector('.describe img')

# 检查是否为空,如果不为空则爬去图片,否则结束

if not img_elems:

break

for img_elem in img_elems:

print(img_elem.get_attribute('src'))

# 关闭浏览器

browser.quit()

```

此代码首先打开了“大众点评”上某个餐厅的评论页面,然后模拟了滚动操作,当滚动到第一个评论图片时,开始逐张加载图片,并将图片地址打印输出。在此代码中,Selenium 通过 `browser.execute_script` 方法模拟了 JavaScript 操作来实现滚动。

虽然 Selenium 能够通过模拟浏览器操作解决图片懒加载的问题,但是它的效率并不高,尤其是在需要抓取数量较大的图片时,其速度会较慢,从而影响整个爬虫的效率。

为了提高效率,可以使用 PhantomJS。PhantomJS 是一个基于 WebKit 的无界面浏览器,它能够正常解析和执行 HTML、CSS、JavaScript 等前端技术,并且支持在命令行下进行操作(如,发送 HTTP 请求、把JavaScript脚本作为参数传递等),因此可以用于网页截屏、爬虫等应用场景。

以下是一个使用 Python 和 PhantomJS 抓取今日头条中某个新闻页所有图片链接的示例代码:

``` python

import re

from selenium import webdriver

# 构造无界面浏览器

driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs')

# 打开目标网页

url = 'https://www.toutiao.com/a6456039616691916046/?tt_from=weixin&utm_campaign=client_share&wxshare_count=1×tamp=1622702729&app=news_article&utm_source=weixin&utm_medium=wxsocialshare&use_new_style=1&req_id=202106030318490102120472281C2745B&group_id=6456039616691916046'

driver.get(url)

# 找到所有图片地址

img_urls = re.findall(r'gallery: JSON.parse\("(.*?)"\),', driver.page_source)

imgs_data = eval('"'.join(img_urls[0].split('"')[1::2]))

# 打印图片地址

for item in imgs_data['sub_images']:

r = item['url']

print(r)

# 关闭浏览器

driver.quit()

```

此代码首先打开了“今日头条”上某篇新闻页面,然后通过正则表达式解析出其中的图片 JSON 数据,使用 `eval` 将 JSON 格式的字符串转换为字典形式,然后获取所有图片地址,最后将这些地址打印输出。在此代码中,PhantomJS 与 Selenium 不同,无需模拟滚动操作即可解决图片懒加载问题,其运行速度快,而且不需要用户操作。同时,Python 也提供了其他库(如 Requests、BeautifulSoup 等)来获取 HTML 的源代码,然后再解析其中的图片链接,但这种方法会比使用 Selenium 和 PhantomJS 更加复杂,也比较容易被反爬虫技术所干扰。

综上所述,使用 Selenium 和 PhantomJS 可以解决大多数图片懒加载的问题,并且通过它们同样可以实现其他与 JavaScript 相关的网页特性的爬取,但是针对特定的网站和特殊的数据采集需求,选择不同的爬虫技术和解析工具便是最佳选择。

壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(97) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部