任务介绍 我们想要在百度图片下载几个明星的写真图片,首先想到的是爬虫,但是百度使用了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 webdriverfrom selenium.webdriver.chrome.options import Optionsimport urllib.request as urfrom bs4 import BeautifulSoupimport timedef 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 soup = BeautifulSoup(page_source, 'lxml' ) images = soup.findAll('img' , class_='main_img img-hover' ) for image in images[:80 ]: 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)