栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

基于python 爬取bing,百度引擎检索的图片程序设计,附有基于该源码开发的软件不用配环境

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于python 爬取bing,百度引擎检索的图片程序设计,附有基于该源码开发的软件不用配环境

python 爬取bing,百度检索到图片

文章目录
  • python 爬取bing,百度检索到图片
    • 一、前言
    • 二、爬取百度引擎检索的图片程序设计
      • 1、百度网页源码分析:检索网页源码中的哪个属性包含图片url
      • 2、百度网页源码分析:根据上一步获取的属性middleURL寻找re模式
      • 3、百度网页源码分析:对比不同请求的链接差异
      • 4、爬取百度图片的程序设计
    • 三、利用字典综合bing、百度两个引擎爬取图片的程序设计
      • 1、检索bing对当前页面html中匹配到图片链接的模式
      • 2、检索bing如何,调控链接来实现翻页
      • 3、源码
    • 四、完结撒花
      • 1、运行截图
      • 2、自动爬取图片的软件

一、前言

  我在进行视觉AI的训练时候,发现没有啥数据集是完美包含我要的类别,思来索去还是直接爬取互联网上的来的香。
  检索图片的质量上就谷歌,bing,百度比较多也比较好,sogou和360做了些反爬,我突破不了就算了,谷歌需要翻墙比较麻烦。最终图片数据来源目标就定在bing和百度了。
  谷歌爬取图片有需要的可以尝试一波

二、爬取百度引擎检索的图片程序设计 1、百度网页源码分析:检索网页源码中的哪个属性包含图片url

F12----》选择网络----》选择XHR----》F5刷新页面
点击抓包的请求----》预览

获取信息分析如下:

  • 通过对属性middleURL的模式匹配得到图片的地址
  • 每次请求,可以获取30个图片的下载地址
  • 模式:r’“middleURL”:“http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif”’
2、百度网页源码分析:根据上一步获取的属性middleURL寻找re模式

下载当前页面的网页源码

保存到txt文档中----》ctrl+F检索属性middleURL

获取信息分析如下:

  • url就在属性middleURL的后面,且都有固定的格式
  • 获取匹配图片url模式:r’“middleURL”:“http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif”’
3、百度网页源码分析:对比不同请求的链接差异

目的:以此达到自动“翻页”下载的效果

点击不同的请求,复制三个链接地址

粘贴到一个txt文档中进行对比

这样我们就知道怎么“伪造请求”了

4、爬取百度图片的程序设计

程序设计思路

  1. 创建文件夹,并将当前目录转化到该文件夹
  2. 根据模式r’“middleURL”:“http://kaotopstatic.cdn.bcebos.com/skin/sinaskin/image/nopic.gif”',设计一个函数geturls,获取当前请求内的全部图片urls
  3. 设计函数DownloadImg(),输入urls,对每一个urls,进行访问并下载
  4. 如果下载图片个数达到定义的数量就自动终止
#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="(.?)”’
    注:这个模式,有时候是比较随心的,就是看着匹配
2、检索bing如何,调控链接来实现翻页

在源码中查询,不同请求链接的差别

将不同请求粘贴到txt文本中对比,差异。

获取信息分析如下:

  • 可以通过修改first实现翻页
3、源码

思路:

  • 在之前爬取百度图片的基础上,加入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中再添加了

2、自动爬取图片的软件

图片爬虫到这里就结束了
我准备开发一个爬虫软件,到时候会放在着,就不需要配环境了
等我两天好吧,效率
我先去学Qt

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号