selenium下载百度图片

任务介绍

我们想要在百度图片下载几个明星的写真图片,首先想到的是爬虫,但是百度使用了js渲染,只有下拉滑动条后面的图片才会加载出来。因此,单纯使用爬虫无法完成任务。这时我们想到了web自动化测试工具selenium,它可以帮助我们下拉滑动条,还可以实现图片的自动搜索。接下来介绍一下selenium+BeautifulSoup+urllib完成这个任务的过程。


任务分析

  • 通过selenium创建谷歌浏览器,然后进行相关配置
  • 找到百度图片的主页https://image.baidu.com/
  • 通过xpath定位输入框,并键入要搜索的内容
  • 通过xpath定位搜索按钮,点击跳转到图片页面
  • 下拉滑动条,加载出足够多的图片
  • 将页面源码交付给BeautifSoup,并定位到所有的图片
  • 通过urllib将图片下载下来

具体代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import urllib.request as ur
from bs4 import BeautifulSoup
import time

# 创建浏览器
def createBrowser():
options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)
return driver

# 定位并下载图片
def download(nameList, driver):
driver.get('https://image.baidu.com/')
for name in nameList:
# 清空搜索框
driver.find_element_by_xpath('//*[@id="kw"]').clear()
# 向搜索框输入内容
driver.find_element_by_xpath('//*[@id="kw"]').send_keys(name + '写真')
time.sleep(1)
if nameList.index(name) == 0:
# 点击搜索按钮
driver.find_element_by_xpath('//*[@id="homeSearchForm"]/span[2]/input').click()
else:
driver.find_element_by_xpath('//*[@id="imgMainSearch"]/div[1]/form/span[2]/input').click()
current_url = driver.current_url
driver.get(current_url)
# 将滑动条拉到页面底部,操作三次
for _ in range(3):
js = 'window.scrollTo(0, document.body.scrollHeight)'
driver.execute_script(js)
time.sleep(3)
page_source = driver.page_source

# 基于此时页面源码创建BeautifSoup对象
soup = BeautifulSoup(page_source, 'lxml')
images = soup.findAll('img', class_='main_img img-hover')
for image in images[:80]:
# 提取图片src属性的内容
img_url = image['src']
# 下载保存
ur.urlretrieve(img_url, 'photo/%s%s.jpg' %(name, images.index(image)))

# 关闭浏览器
def quitBrowser(driver):
driver.quit()

if __name__ == '__main__':
nameList = ['汪苏泷', '杨洋', '杨紫', '吴亦凡']
driver = createBrowser()
download(nameList, driver)
quitBrowser(driver)