鱼C论坛

 找回密码
 立即注册
查看: 1739|回复: 0

[作品展示] Python爬虫-下载百度图片搜索结果

[复制链接]
发表于 2018-1-1 18:46:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
    之前做课设,训练网络需要大量的图片数据,于是自己写了个下载百度图片搜索结果的代码。没加多线程,有兴趣的可以在我的代码基础上修改成多线程的。
    PS:百度图库的质量真的不咋地。。。

    效果:
        TB%DGYDM~29U[`J7]]R5D7D.png
    源代码:
  1. import os
  2. import sys
  3. import itertools
  4. import urllib
  5. from urllib.parse import quote
  6. import requests
  7. import re


  8. # 用于解码objURL
  9. str_table = {
  10.         '_z2C$q': ':',
  11.         '_z&e3B': '.',
  12.         'AzdH3F': '/'
  13. }

  14. char_table = {
  15.         'w': 'a',
  16.         'k': 'b',
  17.         'v': 'c',
  18.         '1': 'd',
  19.         'j': 'e',
  20.         'u': 'f',
  21.         '2': 'g',
  22.         'i': 'h',
  23.         't': 'i',
  24.         '3': 'j',
  25.         'h': 'k',
  26.         's': 'l',
  27.         '4': 'm',
  28.         'g': 'n',
  29.         '5': 'o',
  30.         'r': 'p',
  31.         'q': 'q',
  32.         '6': 'r',
  33.         'f': 's',
  34.         'p': 't',
  35.         '7': 'u',
  36.         'e': 'v',
  37.         'o': 'w',
  38.         '8': '1',
  39.         'd': '2',
  40.         'n': '3',
  41.         '9': '4',
  42.         'c': '5',
  43.         'm': '6',
  44.         '0': '7',
  45.         'b': '8',
  46.         'l': '9',
  47.         'a': '0'
  48. }
  49. # 转为ASCII码
  50. char_table = {ord(key): ord(value) for key, value in char_table.items()}


  51. # 获得所有图片下载链接
  52. def Build_Urls(keyword):
  53.         keyword = quote(keyword)
  54.         url = r"http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&fp=result&queryWord={word}&cl=2&lm=-1&ie=utf-8&oe=utf-8&st=-1&ic=0&word={word}&face=0&istype=2nc=1&pn={pn}&rn=60"
  55.         urls = (url.format(word=keyword, pn=i) for i in itertools.count(start=0, step=60))
  56.         return urls

  57. # 解码图片URL
  58. def decode_objURL(url):
  59.         # 替换字符
  60.         for key, value in str_table.items():
  61.                 url = url.replace(key, value)
  62.         # 替换字符
  63.         return url.translate(char_table)

  64. # 解析JSON获取图片URL
  65. def Get_ImgUrl(html):
  66.         re_url = re.compile(r'"objURL":"(.*?)"')
  67.         imgUrls = [decode_objURL(x) for x in re_url.findall(html)]
  68.         return imgUrls

  69. # 下载图片到指定路径
  70. def downImage(imgUrl, dirpath, imgName):
  71.         #print(imgName)
  72.         #print(dirpath)
  73.         filename = os.path.join(dirpath, imgName)
  74.         try:
  75.                 res = requests.get(imgUrl, timeout=15)
  76.         except:
  77.                 print("[异常:]", imgUrl)
  78.                 return False
  79.         with open(filename, 'wb') as f:
  80.                 f.write(res.content)
  81.         return True


  82. if __name__ == '__main__':
  83.         print("*" * 55)
  84.         print('代码功能:<自动下载百度图片搜索结果>')
  85.         print('下载结果保存在代码所在目录下的pictures文件夹中')
  86.         print('目前只支持单个关键词搜索,输入后按回车即可自动下载')
  87.         print("*" * 55)
  88.         keyword = input("请输入你要下载的图片关键词:\n")
  89.         try:
  90.                 IMG_NUM = int(input('请输入你要下载的图片数量:\n'))
  91.         except:
  92.                 IMG_NUM = 0
  93.         # 创建pictures文件夹(若不存在)用于保存结果
  94.         try:
  95.                 os.mkdir("pictures")
  96.                 dirpath = './pictures'
  97.         except:
  98.                 dirpath = './pictures'
  99.         # 获得所有图片下载链接
  100.         urls = Build_Urls(keyword)
  101.         index = 0
  102.         for url in urls:
  103.                 if index > IMG_NUM-1:
  104.                         break
  105.                 print("[GET_URL]:", url)
  106.                 html = requests.get(url, timeout=10).content.decode('utf-8', 'replace')
  107.                 # 获取图片URL
  108.                 imgUrls = Get_ImgUrl(html)
  109.                 # 没有图片则结束
  110.                 if len(imgUrls) == 0:
  111.                         break
  112.                 for imgUrl in imgUrls:
  113.                         pic_name = "%s%s.jpg" % (str(keyword), str(index))
  114.                         if downImage(imgUrl, dirpath, pic_name):
  115.                                 index += 1
  116.                                 print("已下载%s张" % index)
  117.                                 if index > IMG_NUM-1:
  118.                                         break
  119.                
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 08:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表