本文共 1632 字,大约阅读时间需要 5 分钟。
在我们写文章(博客、公众号、自媒体)的时候,常常觉得自己的文章有些老土,这很大程度是因为配图没有选好。笔者也曾遇到过相同的困扰,顺便解决其中一个案例,为大家提供一些技术上的参考和借鉴!
对于图片的选择,我们通常会遇到两种情况:非高清或者带水印。这两种情况都是我们所忌讪的东西。笔者这次通过图虫创意抓取高清小图,虽然不是大图,但在火热的移动端阅读上是足够的!
我们的理想状态是一个网页,图片直接嵌入在html中。这种情况就像你写的博客或个人网站上的图片,简单地通过爬虫解析即可。或者通过后台AJAX传输图片地址引用。我们不清楚这种方式是否可行!
很遗憾,理想状态难以实现。考虑到图片作为核心业务,需要注册、购买等流程,直接嵌入的想法显然不可行。那么它到底是如何实现的呢?我们来详细分析一下!
打开网页,检查图片来源发现有两个主要域名:ice 和 wel,并且编号不唯一。但我们发现相同域名不同后缀的图片地址效果相同(例如 icweiliimg9 和 icweiliimg/)。查看网页源代码发现并没有我们想要的图片地址。这意味着图片可能通过AJAX渲染,或者藏在JavaScript中进行混淆或加密。
通过分析发现,图片数据确实藏在JavaScript中。由于URL随着请求变化,返回的数据也必然不同,因此可以通过模拟请求来获取所需图片数据。接下来,我们就来详细讲述爬虫实现的过程。
经过测试发现,目标网页需要进行某些验证,包括 cookies 中的 wluuid 字段(仅验证存在,不验证正确性)。因此,我们需要编写一段代码来获取网页的HTML内容。然而,图片数据藏在JavaScript中,这意味着我们只能通过正则表达式来提取所需的图片信息。
通过 BeautifulSoup 提取 JavaScript 代码片段即可获取相关信息。例如:`js = soup.select('script')[4]`。对于有用数据,只能通过正则表达式进行截取。我们可以编写一个正则表达式来提取图片地址。例如:
import refrom bs4 import BeautifulSouppattern = re.compile(r'window.hits = (\[)(.*)(\])')match = pattern.search(str(js))if match: data = match.group(2) # 通过处理data字符串获取图片地址 # 例如:替换所有','为',,,',然后分割 data = data.replace('}', ',', '').split(',') # 最终得到一个包含图片地址的列表 for url in data: # 下载图片并存储 pass 需要注意的是,图片下载时可能会遇到无名图或重复名的问题,因此建议在下载前进行编号处理。同时,两个域名的图片地址需要分别尝试下载,确保能获取到高清图片。
图片下载:
爬虫方面:
其他:
通过上述方法,我们成功实现了自动下载图片的功能。测试结果表明,只需输入关键词即可实现自动下载,虽然图片为小图,但在移动端阅读时效果不错!这也证明了数据结构与算法的重要性。通过扎实的数据结构与算法基础,处理问题变得不再难题。如果你也对数据结构与算法感兴趣,可以关注我的公众号:bigsai。
转载地址:http://ppvkz.baihongyu.com/