如何使用python爬取百度图片_python百度图片爬取

"""

Created on Sun Jun 17 15:34:19 2018

爬取百度图片,下载在桌面。

@author: Chen

"""

import requests

import re

from urllib import parse

import os

import time

import tkinter as tk

import winreg

#利用系统的注册表来获取用户的桌面地址

def GetDesktop():

key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,\

r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',)

return str(winreg.QueryValueEx(key, "Desktop")[0])

#获取HTML信息

def GetHtml(url):

try:

kv =

r = requests.get(url, timeout=5, headers = kv)

r.raise_for_status()

r.encoding = r.apparent_encoding

return r.text

except:

print('爬取失败')

#用正则表达式提取objURL:"(.*?)" ——图片的地址

def TextParse(text):

raw = re.compile(r'"objURL":"(.*?)"')

l = raw.findall(text) #返回一个list

return l

#下载图片,传入url, 第num张图, 文件夹名字(以检索目标为名字)

def download(url, num, dirname):

global fileList #用于记录下载文件的大小,以过滤重复图片

path = dirname + '\\a' + str(num) +'.jpg'

if not os.path.exists(path):

try:

r = requests.get(url,timeout = 5, headers ={'user-agent': 'Mozilla/5.0'} )

length = len(r.content)

r.raise_for_status()

#通过判断二进制文件的大小来过滤掉404的图片网站和重复的图片

if length > 2000 and length not in fileList:

fileList.append(len(r.content))

#下载图片

with open(path,'wb') as f:

f.write(r.content)

f.close()

except:

pass

def rename(path):

File = os.listdir(path)

for i in range(len(File)):

os.rename(File[i],"{}.jpg".format(i+1))

print('\nSuccessfully download :',i)

def GUI():

t = tk.Tk()

t.title('百度图片抓取器') #标题

t.geometry("100x300") #窗口大小

t.resizable(width=False,height=False) #是否能改变窗口大小,默认为True

if __name__ == '__main__':

start = time.clock() #记下程序开始时间,用于后面计算总的时间

fileList = []

URLlist = []

pages = 5 #要爬取的页面数

#initUrl表示百度图片搜索的地址, targetName表示要检索的关键字

initUrl = r'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word='

targetName = input('输入你要抓取的关键词:')

word = parse.quote(targetName) #编码

DownloadPath = GetDesktop() #获取桌面的地址

os.chdir(DownloadPath)

#在下载位置下创建一个以检索字为名的文件夹用来存放图片

try:

os.mkdir(targetName)

except:

raise Exception("桌面已有{}的文件夹!".format(targetName))

os.chdir(targetName)

print("{:=^40}".format("初始化中"))

for i in range(pages):

pn = 20*i #pn为百度图片页面的参数,0->第一页,20->第二页 ……

url = initUrl + word + str(pn)

text = GetHtml(url)

#抓取页面上所有图片的地址存放在URLlist中(经过测试,一页60张,得到60个url连接)

URLlist = URLlist + TextParse(text)

lenURL = len(URLlist)

#遍历URLlist,下载链接指向的图片。

for i in range(lenURL):

download(URLlist[i],i,os.getcwd())

#打印进度条

per = int((i+1)/lenURL*100)

print("\r{}%[{}{}]{:4.2f}s".format(per, (per//3)*">",\

(33-per//3)*" ",time.clock()-start),end="")

rename(os.getcwd()) #重命名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值