Python动态爬取百度图片
爬取思路
主要通过selenium模拟人为一步步操作浏览器
功能结果展示
-
根据输入要求,爬取百度图片,并返回结果
-
根据输入关键字创建对应文件夹
-
如下图为相同关键字下,百度图片和爬取后保存的图片对比。(爬取中有一张相同图片,原因事代码设置等待时间太长,下载重复,可调节)
下载并保存到本地文件夹:
代码解释 -
下面为程序需要的模块
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
import requests
import os
import re
- 创建一个浏览器启动对象
b=webdriver.Chrome()
- 获取网页元素的位置
在浏览器页面按f12进入开发者页面
第一步模拟人为点击搜索框。通过find_element_by_id()方法,以ID找到该input,然后send_keys()模拟键盘输入
search_box=b.find_element_by_id('kw')#通过id获取百度图片搜索框
search_box.send_keys(name)
search_box.send_keys(Keys.ENTER) #Keys.ENTER输入回车
- 选择尺寸
我们可以选择一个尺寸,同理找到全部尺寸的代码位置,模拟鼠标在上面,得到下拉列表。然后我们通过find_element_by_xpath()来找到特大尺寸的位置。(在右边html里找到特大尺寸位置,右击鼠标,copy>copy XPath,即复制到了,粘贴进方法即可,如下面的代码)
ele=b.find_element_by_id('sizeFilter') #ele获取到了尺寸选择块
ActionChains(b).move_to_element(ele).perform() #移动鼠标到ele块上并悬停perform()>>>得到下拉框
time.sleep(1)
ele_bigsize=b.find_element_by_xpath('//*[@id="sizeFilter"]/div/div[1]')#传入最大尺寸选项的位置
ActionChains(b).move_to_element(ele_bigsize).perform() #点击最大尺寸选项
ele_bigsize.click()
- 进入第一张图片
此处进入第一张图片后,浏览器会打开新网页,所以b.switch_to.window(b.window_handles[1])确保当前操作页在新页
##打开第一张
ele_first=b.find_element_by_xpath('//*[@id="imgid"]/div/ul/li[1]/div/a/img')#找到第一张图片最大尺寸的位置
ele_first.click()#点击进入最大尺寸界面
b.switch_to.window(b.window_handles[1])#因为打开了新页面所以需要切换页面
x=1
- 保存图片到文件
for item in range(1,num+1):
ele_down=b.find_element_by_xpath('//*[@id="currentImg"]') #获取图片所在的位置
img=ele_down.get_attribute('src') #获取路径下图片的src属性
r=requests.get(img)
if r.status_code==200:
path=cb+'/%d.jpg'%x
print('正在爬取'+img)
with open(path,'wb') as f:
f.write(r.content)
time.sleep(1)
print('爬取成功')
x=x+1
ele_next=b.find_element_by_xpath('//*[@id="container"]/span[2]/span')
ele_next.click()
else:
ele_next = b.find_element_by_xpath('//*[@id="container"]/span[2]/span')
ele_next.click()
time.sleep(1)
continue
源码
注释很全,可慢慢体会
'''
动态爬取百度图片
主要根据模拟浏览器人为操作
'''
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
import requests
import os
import re
def getNamepage(name):
b.get('https://image.baidu.com/')
search_box=b.find_element_by_id('kw')#通过id获取百度图片搜索框
search_box.send_keys(name) #向里面输入值
search_box.send_keys(Keys.ENTER) #Keys.ENTER输入回车
time.sleep(1)
def downLoad(img_list,num):
ele=b.find_element_by_id('sizeFilter')#ele获取到了尺寸选择块
ActionChains(b).move_to_element(ele).perform()#移动鼠标到ele块上并悬停perform()>>>得到下拉框
time.sleep(1)
ele_bigsize=b.find_element_by_xpath('//*[@id="sizeFilter"]/div/div[1]')#传入最大尺寸选项的位置
ActionChains(b).move_to_element(ele_bigsize).perform()#点击最大尺寸选项
ele_bigsize.click()
##打开第一张
ele_first=b.find_element_by_xpath('//*[@id="imgid"]/div/ul/li[1]/div/a/img')#找到第一张图片最大尺寸的位置
ele_first.click()#点击进入最大尺寸界面
b.switch_to.window(b.window_handles[1])#因为打开了新页面所以需要切换页面
x=1
for item in range(1,num+1):
ele_down=b.find_element_by_xpath('//*[@id="currentImg"]')#获取图片所在的位置
img=ele_down.get_attribute('src')#获取路径下图片的src属性
r=requests.get(img)
if r.status_code==200:
path=cb+'/%d.jpg'%x
print('正在爬取'+img)
with open(path,'wb') as f:
f.write(r.content)
time.sleep(1)
print('爬取成功')
x=x+1
ele_next=b.find_element_by_xpath('//*[@id="container"]/span[2]/span')
ele_next.click()
else:
ele_next = b.find_element_by_xpath('//*[@id="container"]/span[2]/span')
ele_next.click()
time.sleep(1)
continue
if __name__ == '__main__':
name = input('请输入要下载的图片:')
b=webdriver.Chrome()
imgoutpath='E://PythonDown//' #保存路径
cb=imgoutpath+name
#创建文件夹(不重名就直接创建,重名就以输入的关键字+x创建)
x = 0
while x < 5:
if os.path.exists(cb):
# cb = cb + str(x)
cb = re.sub(r'\d+', '', cb) + str(x) # 用正则方法删除数字
x += 1
else:
os.mkdir(cb)
break
num=10 #一次爬取的图片个数
img_list=[]
getNamepage(name)
downLoad(img_list,num)
b.quit()