Python爬取百度图片|爬取动态网页|

Python动态爬取百度图片

爬取思路
主要通过selenium模拟人为一步步操作浏览器
功能结果展示

  1. 根据输入要求,爬取百度图片,并返回结果
    在这里插入图片描述

  2. 根据输入关键字创建对应文件夹
    在这里插入图片描述

  3. 如下图为相同关键字下,百度图片和爬取后保存的图片对比。(爬取中有一张相同图片,原因事代码设置等待时间太长,下载重复,可调节)
    百度图片
    下载并保存到本地文件夹:
    爬取下载的图片
    代码解释

  4. 下面为程序需要的模块

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
  1. 创建一个浏览器启动对象
b=webdriver.Chrome()
  1. 获取网页元素的位置
    在浏览器页面按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输入回车
  1. 选择尺寸
    我们可以选择一个尺寸,同理找到全部尺寸的代码位置,模拟鼠标在上面,得到下拉列表。然后我们通过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()

  1. 进入第一张图片
    此处进入第一张图片后,浏览器会打开新网页,所以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
  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()


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大虾写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值