博客
关于我
写博客没高质量配图?python爬虫教你绕过限制一键搜索下载图虫创意图片!
阅读量:443 次
发布时间:2019-03-06

本文共 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

需要注意的是,图片下载时可能会遇到无名图或重复名的问题,因此建议在下载前进行编号处理。同时,两个域名的图片地址需要分别尝试下载,确保能获取到高清图片。

其他注意事项

图片下载:

  • 为了避免重复下载或命名冲突,可以为图片编号。例如:图片名为`image-001.jpg`。
  • 两个域名的图片地址需要尝试下载,其中一个成功即可完成下载。

爬虫方面:

  • 全程无需登录,下载的图片为小图。但由于技术限制,后续可以研究登录后的大图下载方法并分享给大家!

其他:

  • 创建图片存储路径时,确保路径存在。可以通过`os.makedirs` 检查并创建路径。

效果与总结

通过上述方法,我们成功实现了自动下载图片的功能。测试结果表明,只需输入关键词即可实现自动下载,虽然图片为小图,但在移动端阅读时效果不错!这也证明了数据结构与算法的重要性。通过扎实的数据结构与算法基础,处理问题变得不再难题。如果你也对数据结构与算法感兴趣,可以关注我的公众号:bigsai。

转载地址:http://ppvkz.baihongyu.com/

你可能感兴趣的文章
NOIP2011T1 数字反转
查看>>
NOIP2014 提高组 Day2——寻找道路
查看>>
noip借教室 题解
查看>>
NOIP模拟测试19
查看>>
NOIp模拟赛二十九
查看>>
Vue3+element plus+sortablejs实现table列表拖拽
查看>>
Nokia5233手机和我装的几个symbian V5手机软件
查看>>
non linear processor
查看>>
Non-final field ‘code‘ in enum StateEnum‘
查看>>