君子好逑 发表于 2021-1-23 19:50:25

百度爬图

import requests
from urllib.parse import urlencode
import re
import os
import time

#计划将图片都保存在E盘叫“百度图片”的文件夹下
filelist = os.listdir(path='E:\\')
if ('百度图片') not in filelist:
    os.mkdir("E:\\百度图片")

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363'
}

name = input("请输入您需要爬取的图片信息:")

filelist = os.listdir(path='E:\\百度图片')

#检查在百度图片文件夹下是否存在以搜索内容为名的文件夹
#若存在,则说明以前曾爬取过相关内容,不再新建以此搜索内容命名的文件夹
#若不存在,则说明以前未曾搜索过相关内容,新建文件夹以保存此次爬取的图片
if (name) not in filelist:
    os.mkdir("E:\\百度图片/%s"%name)
before_path = "E:/百度图片/" + name +'/'

times = time.gmtime()
t=str(time.mktime(times))

#通过输入的需要搜索的内容拼接出百度的相关内容的搜索链接
def get_url(name):
    bef_url = 'https://image.baidu.com/search/index?'

    data = {
      'tn': 'resultjson_com',
      'logid': '7364932782014356645',
      'ipn': 'rj',
      'ct': '201326592',
      'is': '',
      'fp': 'result',
      'queryWord': '二次元图片',
      'cl': '2',
      'lm': '-1',
      'ie': 'utf-8',
      'oe': 'utf-8',
      'adpicid': '',
      'st': '',
      'z': '',
      'ic': '',
      'hd': '',
      'latest': '',
      'copyright': '',
      'word': '二次元图片',
      's': '',
      'se': '',
      'tab': '',
      'width': '',
      'height': '',
      'face': '',
      'istype': '',
      'qc': '',
      'nc': '',
      'fr': '',
      'expermode': '',
      'force': '',
      'pn': '30',
      'rn': '30',
      'gsm': '1e',
      '1611387183889': ''
    }

    data['word'] = name
    data['word'] = name

    url = bef_url + urlencode(data)
    return url

url = get_url(name)

#将链接传递给get_add函数,该函数将会取得前三十张图片的连接
def get_add(url):
    response = requests.get(url=url,headers=headers)
    if response.status_code == requests.codes.ok:
      html = response.text

      regular = re.compile('"middleURL":"(.*?)"')

      result = regular.findall(html)

    else :
      result = False

    return result


result = get_add(url)

if result == False:
    print("搜索出错!!!\n请重试")

elif not result:
    print("您搜索的内容不存在!!!")
    os.rmdir("E:\\百度图片/%s"%name)

else:
#下载图片并保存
    while(result):
      url = result.pop()
      response = requests.get(url=url,headers=headers)
      html = response.content
      name = url.split('/')[-1]

      path = before_path + t + name

      with open(path,'wb') as f:
            f.write(html)

在一个大佬的指导下写了这个爬百度图的程序,有大佬能优化一下,或者指出我的不足就再好不过了

°蓝鲤歌蓝 发表于 2021-1-23 20:44:28

1. 函数名 get_add 不行。
2. 既然后面是用 result.pop() 来依次弹出 url 进行处理,那么完全可以换成迭代器。
3. 没用到 try-except。

Daniel_Zhang 发表于 2021-1-25 20:29:54

兼容性没那么好吧,只支持 win 然后还必须得是有 E盘 的 win{:10_245:}

君子好逑 发表于 2021-1-28 21:42:20

°蓝鲤歌蓝 发表于 2021-1-23 20:44
1. 函数名 get_add 不行。
2. 既然后面是用 result.pop() 来依次弹出 url 进行处理,那么完全可以换成迭代 ...

呃,大佬,还没学到迭代器

君子好逑 发表于 2021-1-28 21:43:02

Daniel_Zhang 发表于 2021-1-25 20:29
兼容性没那么好吧,只支持 win 然后还必须得是有 E盘 的 win

初学者嘛,理解一下,哈哈哈哈哈
页: [1]
查看完整版本: 百度爬图