利用360搜图爬取图片

​ 最近闲得无聊,搞了个基于360搜图的图片爬取。用得都是比较基础的知识,所以这里也分享一下代码。本人也不是什么大佬。代码看看就行。**完整的代码在文章最后面。**下面我就简单介绍一下我爬取的过程。

1.第一步

首先我们要知道360关键字是用什么键来对应的,我记得360是q对应关键字,百度的是wd对应关键字。

如下360连接https://image.so.com/i?q=%E9%A3%9E%E6%9C%BA&src=srp,这里的q后面的%E9%A3%9E%E6%9C%BA就是对应的url编码,知道了连接之后,我们就可以打开网页。

打开网页的代码如下:

# 打开url返回没有解码的html
def open_url(url):r.Request(url).add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36')respond = r.urlopen(url)try:if respond.getcode() == 200:html = respond.read()except Exception as e:page = e.partialhtml = pagereturn html

注意的是:我这里没有对爬回来的HTML代码进行encode,也就是说这里的html是二进制的。要解码就需要.encode(‘utf-8’)。

2.第二步

第二步就是分析网页结构了。看看图片都藏在哪里,通过浏览器F12,我们可以看到源代码,我找到了图片的地方。

从这里我们可以找到图片是所在位置,并且我们可以找到图片的下载地址,但问题来了,这个页面是动态的,也就是说图片的获取也是动态的啦,如果我们只是通过定位到图片,在找图片的地址,未免有点笨了。

然后我继续查看网络传送那里和页面代码,然后我在页面那里找到了页面图片初始化的数据。这些数据存在一段js代码里面,并且数据的结构是json。

这里我写了两函数来获取信息,我没有使用正则表达式,只是单纯的做了个定位。

# 这里只是针对初始化数据(页面前60-100张进行爬取)
def json_FindInitimg(string, imgurl_dict):js = json.loads(string)  # 将标签中的信息进行json加载for elevent in iter(js):if type(js[elevent]) == type([]):for lis in js[elevent]:for (key, value) in lis.items():if key == 'thumb_bak':imgurl_dict[value] = value.split('/')[-1].split('.')[-1]return imgurl_dict# 获取初始化的图片(一般是页面前60或100张)
def find_imgurl(html):if html == None:returnimgurl_dict = {}d = pq(html)  # 用爬回来的网页str进行网页分析scr = d('body')('script')('#initData')  # 找到对应的标签imgurl_dict = json_FindInitimg(scr.html(), imgurl_dict)return imgurl_dict

爬取的图片连接:(这里要的是下载连接,当然也可以要图片原网站地址)

生成的字典格式,key是地址,val是图片格式

当然这些是不够的,这些都是页面初始化的数据。我要的是那些动态传送过来的图片,果然我找到了图片数据的请求。

并且那些需要的参数我也找到了。它放在一个js代码段里面。这里的sid等其他参数,每次打开网页都不同。

现在就是万事俱备,只欠东风。

首先拿到那些需要的参数

def find_param(html):if html == None:returnd = pq(html)  # 用爬回来的网页str进行网页分析scr = d('body')('script')('#initParam')  # 找到对应的标签param_dict = json.loads(scr.html().replace("'", '"'))           #爬取回来的参数字典return param_dict

然后:(形成连接的url)

# 通过参数形成新的url(通过这些参数形成新的url)
def Newurl(param_dict, num=1):urllist = []sn = 60ps = 1for i in range(num):URLdata = {'q': p.unquote(param_dict['query']),'pd': 1,'pn': 60,'correct': p.unquote(param_dict['query']),'adstar': param_dict['adstar'],'tab': param_dict['tab'],'sid': param_dict['sid'],'ras': param_dict['ras'],'cn': param_dict['cn'],'gn': param_dict['gn'],'kn': param_dict['kn'],'crn': param_dict['crn'],'bxn': param_dict['bxn'],'cuben': param_dict['cuben'],'src': 'srp','sn': sn,'ps': ps,'pc': 60}url = 'https://image.so.com/j?' + p.urlencode(URLdata)print('生成批道url:   ' + url)urllist.append(url)sn += 70ps += 70return urllist

3.第三步

下载图片下载图片就非常简单了,直接打开图片连接,然后把打开的连接中读取二进制数据,然后保存到文件里面,加上对应的文件命和后缀。

代码在后面。

4.完整代码

我也不多说,放在也是爬来玩玩,直接给代码。能力水平和精力有限,代码可能有点粗糙。如果出现什么BUG还请各位自己修改。最后说一下,代码里面有两个爬取方向,一个是页面是初始化图片,一个是基于参数请求新的图片。

import urllib.request as r
import urllib.parse as p
from pyquery import PyQuery as pq
import json
import os# 打开url返回没有解码的html
def open_url(url):r.Request(url).add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36')respond = r.urlopen(url)try:if respond.getcode() == 200:html = respond.read()except Exception as e:page = e.partialhtml = pagereturn html# 获取初始化的图片(一般是页面前60或100张)
def find_imgurl(html):if html == None:returnimgurl_dict = {}d = pq(html)  # 用爬回来的网页str进行网页分析scr = d('body')('script')('#initData')  # 找到对应的标签imgurl_dict = json_FindInitimg(scr.html(), imgurl_dict)return imgurl_dict# 获取请求参数(获取请求参数)
def find_param(html):if html == None:returnd = pq(html)  # 用爬回来的网页str进行网页分析scr = d('body')('script')('#initParam')  # 找到对应的标签param_dict = json.loads(scr.html().replace("'", '"'))           #爬取回来的参数字典return param_dict# 通过参数形成新的url(通过这些参数形成新的url)
def Newurl(param_dict, num=1):urllist = []sn = 60ps = 1for i in range(num):URLdata = {'q': p.unquote(param_dict['query']),'pd': 1,'pn': 60,'correct': p.unquote(param_dict['query']),'adstar': param_dict['adstar'],'tab': param_dict['tab'],'sid': param_dict['sid'],'ras': param_dict['ras'],'cn': param_dict['cn'],'gn': param_dict['gn'],'kn': param_dict['kn'],'crn': param_dict['crn'],'bxn': param_dict['bxn'],'cuben': param_dict['cuben'],'src': 'srp','sn': sn,'ps': ps,'pc': 60}url = 'https://image.so.com/j?' + p.urlencode(URLdata)print('生成批道url:   ' + url)urllist.append(url)sn += 70ps += 70return urllist# 这里只是针对(页面前60-100张进行爬取)
def json_FindInitimg(string, imgurl_dict):js = json.loads(string)  # 将标签中的信息进行json加载for elevent in iter(js):if type(js[elevent]) == type([]):for lis in js[elevent]:for (key, value) in lis.items():if key == 'thumb_bak':print((key, value))imgurl_dict[value] = value.split('/')[-1].split('.')[-1]return imgurl_dict# 下载
def download(dirpath, imgurl_dict):count = 0print(imgurl_dict)for (imgurl, type) in imgurl_dict.items():if type == 'jpg' or type == 'png' or type == 'jpeg':print("图片[   %s   ]开始下载......" % imgurl)html = open_url(imgurl)path = dirpath + str(count) + '.' + typeprint("图片写入路径是:%s" % dirpath + path)with open(path, mode='wb') as f:f.write(html)count += 1return count# 不同的下载方式,下载不同数量的图片
def download_img(url, dirpath, num=None):Pcount = 1  # 批道数if num == None:html = open_url(url).decode('utf-8')imgurl_dict = find_imgurl(html)os.mkdir(dirpath + str(Pcount))download(dirpath+str(Pcount)+'\\', imgurl_dict)else:html = open_url(url).decode('utf-8')for i in Newurl(find_param(html), num=num):newhtml = open_url(i).decode('utf-8')imgurl_dict = {}json_FindInitimg(newhtml, imgurl_dict)os.mkdir(dirpath+str(Pcount))        #工具批道数新建文件夹download(dirpath+str(Pcount)+'\\', imgurl_dict)          #下载到对应的文件夹Pcount +=1if __name__ == '__main__':path = 'F:\\my_img\\'      #根目录(每一批会在根目录建一个新目录)   最后记得加个'\\'结尾Qval = input('请输入你要搜索的图片:')mod = input('请输入爬取方式:(1:爬取页面前60-100张\t0:爬取指定数量)')data = {'q': Qval,'src': 'srp'}url = 'https://image.so.com/i?' + p.urlencode(data)if mod == '1':download_img(url, dirpath=path)else:num = int(input('请输入爬取批数:(一般60/批)'))download_img(url, dirpath=path, num=num)

爬取结果如下:(爬取的一些动漫图片)

基于360搜图爬取图片相关推荐

  1. 基于CLIP实现以文精准搜图

    基于CLIP实现以文精准搜图 在使用CLIP做图文匹配时,发现只能用多个文本语句和一张图片匹配,而我想实现多个图片与文本进行匹配. 打个断点 用DEBUG看了下 在经过预处理和模型后 logits_p ...

  2. python 爬取图片_Python实现千图成像:从图片爬取到图片合成

    千图成像:用N张图片拼凑成一张图片. 实现原理:先将所要成像的图片转化成马赛克图片,然后从图库中用对应颜色的图片替换相应色块. 图库中的图片处理:标记图库中每张图片的混合颜色,用于替换目标色块,并记录 ...

  3. 以图搜图 图像匹配_图像匹配,基于深度学习DenseNet实现以图搜图功能

    原标题:图像匹配,基于深度学习DenseNet实现以图搜图功能 度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图像检索这一块儿,目前有谷歌的以图搜图,百度 ...

  4. python如何爬取图片到指定文件夹论文_基于Python的图片爬虫程序设计

    互联网中包含大量有价值的 数据,网络爬虫通过既定规则可 以自动地抓取互联网数据并下载 至本地存储.研究网络爬虫的工 作原理和基于 Python 网络信息爬 取技术模块功能,基于 Requests- B ...

  5. 图像匹配,基于深度学习DenseNet实现以图搜图功能

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 度学习的发展使得在此之前以机器学习为主流算法的相关实现变得简单,而且准确率更高,效果更好,在图 ...

  6. 基于内容的图像检索引擎(以图搜图)

    基于内容的图像检索引擎(以图搜图) 本文介绍一些基于内容的图像检索技术(Content-Based Image Retrieval,CBIR)的搜索引擎(即以图搜图),这类搜索引擎基本上代表了图像检索 ...

  7. 网络爬虫---从千图网爬取图片到本地

    #图片爬虫,从千图网爬取图片到本地 import urllib.request import re import urllib.error for i in range(1,10):     page ...

  8. selenium搜狗搜图简单操作(爬取任意关键字的图片)

    Picture preview Steps 这里以搜狗搜图作为一个简单的例子: 第一步就是获取我们的需求了,输入需要下载的图片名字以及需要下载的图片数量. 接下来我们需要在搜狗搜图中输入用户的需求,透 ...

  9. 读《基于深度学习的以图搜图技术在照片档案管理中的应用研究_赵学敏》

    论文名称:<基于深度学习的以图搜图技术在照片档案管理中的应用研究_赵学敏> 发表时间:2020年4月 发表期刊:档案学研究(北大核心.CSSCI) 发表单位:云南大学档案馆 愚见 是一个叙 ...

最新文章

  1. 用tomcat插件 在Eclipse 中配置Tomcat项目
  2. 使用dokcer搭建个人博客网站
  3. 【pmcaff】从 Lending Club 的 IPO,我们能学到些什么
  4. [SAP PI]ECC系统接收财务凭证IDoc的配置步骤(总账 应收 应付)
  5. 嵩天-Python语言程序设计程序题--第二周:基本图形绘制
  6. HTML实体字符列表,总结到位
  7. php七牛云rtmp直播推流,GitHub - jangocheng/FlutterQiniucloudLivePlugin: Flutter 七牛云直播云 推流/播放 SDK集成...
  8. 由浅入深逐步了解 Synchronized
  9. 感知机:Perceptron Learning Algorithm
  10. 肉肉好走,愿你在异界依旧快乐活泼
  11. 使用密钥文件登录及免密登录服务器方法
  12. DCDC和LDO的区别
  13. ajax 传实体对象,前端ajax或axios发送数据后端实体类接受(实例和报错原因)
  14. Overlay网络与物理网络的关系
  15. 2019-05-22 Domain注入工具;旁注工具;ASP木马;
  16. java课程设计源码(游戏:急速生存)
  17. 立秋了,愿天下人天寒心不寒,快快乐乐
  18. I帧和IDR帧区别(转载)
  19. 蓝桥杯 算法训练 一元三次方程求解
  20. asc码即ascii,没有asc这一说,ascii后是ii而不是罗马数字

热门文章

  1. android BitMap回收
  2. 软件体系结构C2风格
  3. ASA防火墙外部web应用端口与默认审查协议相冲突的解决方法
  4. Power Designer的使用
  5. 让“云”无处不在-Citrix Xenserver之三 license server
  6. 使用Sublime text 3打造一个小巧但强大的Go语言开发IDE
  7. Spring中基于Java的配置@Configuration和@Bean用法
  8. SQL Service自定义数据类型
  9. php性能分析工具XHProf安装配置使用教程(linux精华版)
  10. PHP的xdebug安装步骤以及遇到的坑