- python 爬取bing,百度检索到图片
- 一、前言
- 二、爬取百度引擎检索的图片程序设计
- 1、百度网页源码分析:检索网页源码中的哪个属性包含图片url
- 2、百度网页源码分析:根据上一步获取的属性middleURL寻找re模式
- 3、百度网页源码分析:对比不同请求的链接差异
- 4、爬取百度图片的程序设计
- 三、利用字典综合bing、百度两个引擎爬取图片的程序设计
- 1、检索bing对当前页面html中匹配到图片链接的模式
- 2、检索bing如何,调控链接来实现翻页
- 3、源码
- 四、完结撒花
- 1、运行截图
- 2、自动爬取图片的软件
我在进行视觉AI的训练时候,发现没有啥数据集是完美包含我要的类别,思来索去还是直接爬取互联网上的来的香。
检索图片的质量上就谷歌,bing,百度比较多也比较好,sogou和360做了些反爬,我突破不了就算了,谷歌需要翻墙比较麻烦。最终图片数据来源目标就定在bing和百度了。
谷歌爬取图片有需要的可以尝试一波
F12----》选择网络----》选择XHR----》F5刷新页面
点击抓包的请求----》预览
获取信息分析如下:
- 通过对属性middleURL的模式匹配得到图片的地址
- 每次请求,可以获取30个图片的下载地址
- 模式:r’“middleURL”:“http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif”’
下载当前页面的网页源码
保存到txt文档中----》ctrl+F检索属性middleURL
获取信息分析如下:
- url就在属性middleURL的后面,且都有固定的格式
- 获取匹配图片url模式:r’“middleURL”:“http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif”’
目的:以此达到自动“翻页”下载的效果
点击不同的请求,复制三个链接地址
粘贴到一个txt文档中进行对比
这样我们就知道怎么“伪造请求”了
程序设计思路
- 创建文件夹,并将当前目录转化到该文件夹
- 根据模式r’“middleURL”:“http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif”',设计一个函数geturls,获取当前请求内的全部图片urls
- 设计函数DownloadImg(),输入urls,对每一个urls,进行访问并下载
- 如果下载图片个数达到定义的数量就自动终止
#coding=utf-8
import re
import time
import requests
from urllib import parse #对汉字进行编码
import os
#用来随机抽头发出申请
import random
from fake_useragent import UserAgent #随机生成一个user-agent,模拟有多个浏览器访问
import urllib3
'''
函数功能
返回一个url页面里面全部图片超链接的列表
'''
dic={'bing':r'img.*src="http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif"','baidu':r'"middleURL":"http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif"','sogou':r'img.*src="http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif"','360':r'"img":"http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif"'}
def writeHtml(url,html):
with open(url,'w',encoding='utf-8') as f:
f.write(str(html))
def geturls(baseurl,enginPattern):
Img = re.compile(enginPattern) # 正则表达式匹配图片,匹配bing搜索
# 头,假装我是浏览器访问的网页
headers ={'User-Agent':UserAgent().random}
urllib3.disable_warnings()
response = requests.get(baseurl, headers=headers) # 获取网页信息
html = response.text # 将网页信息转化为text形式
data=re.findall(Img, html) # 存储图片超链接的列表
return data # 返回一个包含该页面全部图片超链接的新列表
def DownloadImg(imgUrls):
global i
# 头,假装我是浏览器访问的网页
headers={'User-Agent':UserAgent().random}
for ImgUrl in imgUrls:
if i < imgNum:
try: # 如果url是无效的,则查看下一个url
resp = requests.get(ImgUrl, headers=headers) # 获取网页信息
except requests.ConnectionError as e:
continue
byte = resp.content # 转化为content二进制
with open("{:0>4d}.jpg".format(i + 1), "wb") as f: # 文件写入
if resp.status_code==200 and len(str(byte)) > 1000 : # 访问成功且返回的值大于1000
f.write(byte)
# print(len(str(byte)))
i = i + 1 # 递增,表示又多下载了一张图片
time.sleep(0.5) # 每隔0.5秒下载一张图片放入D://情绪图片测试
print("第{}张与{}有关的图片爬取成功!".format(i, search))
else:
break
search=input('请输入检索词:') #检索词
imgNum=int(input('请输入爬取图片数量:')) #爬取图片数量
engine='baidu' #要爬取的引擎,有效值有:bing,baidu,360
i=0
def main():
if not os.path.isdir("./{}_{}".format(search,engine)):#确定文件夹一定存在
os.mkdir("./{}_{}".format(search,engine))
os.chdir("./{}_{}".format(search,engine)) #确保当前目录位于search目录,图片将保存在这一目录
global i # 图片名递增,并用于判断图片数量是否达到imgNum
while(i=imgNum:
break
if(i==imgNum):
print("已基于搜索引擎{}爬取了{}张与{}相关的图片,保存在文件夹{}{}_{}".format(engine,imgNum,search,os.getcwd(),search,engine))
if __name__ == '__main__':
main()
三、利用字典综合bing、百度两个引擎爬取图片的程序设计
1、检索bing对当前页面html中匹配到图片链接的模式
F12查看当前网络源码,利用当鼠标移动到那个块,哪个块就会高亮标记的特点
锁定,该图片所对应的块,
将其复制到txt文件中
获取信息分析如下:
- 从html中获取图片的地址,模式为:‘’‘src="(.?)”’
注:这个模式,有时候是比较随心的,就是看着匹配
在源码中查询,不同请求链接的差别
将不同请求粘贴到txt文本中对比,差异。
获取信息分析如下:
- 可以通过修改first实现翻页
思路:
- 在之前爬取百度图片的基础上,加入dicPattern字典,和dicUrl字典,分别保存从网页源码中搜索图片地址的模式,bing和百度的链接
#coding=utf-8
import re
import time
import requests
from urllib import parse #对汉字进行编码
import os
#用来随机抽头发出申请
from fake_useragent import UserAgent #随机生成一个user-agent,模拟有多个浏览器访问
import urllib3
dicPattern={'bing':r','baidu':r'"middleURL":"http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif"','sogou':r'img.*src="http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif"','360':r'"img":"http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif"'}
dicUrl={'bing':'https://cn.bing.com/images/search?q={}&form=HDRSC2&first={}&tsc=ImageHoverTitle','baidu':'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=7542812996841482750&ipn=rj&ct=201326592&is=&fp=result&fr=&word={}&queryWord={}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&expermode=&nojc=&isAsync=&pn={}&rn=30&gsm=1e&{}='}
'''
函数功能
输入一个地址和,网页源码,
将源码写入txt文本,便于浏览
'''
def writeHtml(outfile,html):
with open(outfile,'w',encoding='utf-8') as f:
f.write(str(html))
'''
函数功能
返回一个url页面里面全部图片超链接的列表
'''
def geturls(baseurl,enginPattern):
ImgUrlPattern = re.compile(enginPattern) # 正则表达式匹配图片,匹配bing搜索
# 响应头,假装我是浏览器访问的网页
headers ={'User-Agent':UserAgent().random}
urllib3.disable_warnings() #忽略警告
response = requests.get(baseurl, headers=headers) # 获取网页信息
html = response.text # 将网页信息转化为text形式
data=re.findall(ImgUrlPattern, html) # 得到图片超链接的列表
return data # 返回一个包含该页面全部图片超链接的新列表
'''
函数功能:
遍历输入的图像urls
并将其下载下来
'''
def DownloadImg(imgUrls):
global i
# 头,假装我是浏览器访问的网页
headers={'User-Agent':UserAgent().random}
for ImgUrl in imgUrls:
if i < imgNum: #判断次数是否够了
# 如果url是无效的,则查看下一个url
try:
resp = requests.get(ImgUrl, headers=headers) # 获取网页信息
except requests.ConnectionError as e:
continue
byte = resp.content # 转化为content二进制
with open("{:0>4d}.jpg".format(i + 1), "wb") as f: # 文件写入
if resp.status_code==200 and len(str(byte)) > 1000 : # 访问成功200且返回页面字节长度大于1000
f.write(byte)
# print(len(str(byte)))
i = i + 1 # 递增,表示又多下载了一张图片
time.sleep(0.5) # 每隔0.5秒下载一张图片,避免由于访问过快被反爬了,认为我在DDS攻击服务器
print("第{}张与{}有关的图片爬取成功!".format(i, search))
else:
break
print('有效的引擎有:bing,baidu')
engine=input('请输入引擎:') #要爬取的引擎,有效值有:bing,baidu
search=input('请输入检索词:') #检索词
imgNum=int(input('请输入爬取图片数量:')) #爬取图片数量
i=0 # 已下载好的图片数量,用于判断图片数量是否达到imgNum
def main():
if not os.path.isdir("./{}_{}".format(search,engine)):#确定文件夹一定存在
os.mkdir("./{}_{}".format(search,engine))
os.chdir("./{}_{}".format(search,engine)) #确保当前目录位于search目录,图片将保存在这一目录
global i # 已下载好的图片数量,用于判断图片数量是否达到imgNum
while(i=imgNum:
break
if(i==imgNum):
print("已基于搜索引擎{}爬取了{}张与{}相关的图片,保存在文件夹{}".format(engine,imgNum,search,os.getcwd()))
if __name__ == '__main__':
main()
四、完结撒花
1、运行截图
运行如上
还缺一个基于MD5码的图片自动去重。这个我在软件,以及随后的github中再添加了
图片爬虫到这里就结束了
我准备开发一个爬虫软件,到时候会放在着,就不需要配环境了
等我两天好吧,效率
我先去学Qt



