Loading... 本项目将使用`requests`库、`BeaurifulSoup`库、`selenium`库实现下载**百度图片**的功能. ### 1、前言 首先,为什么要使用`selenium`库呢?因为在我们编写爬虫代码的过程中,可能会遇到一个问题:我们需要爬取的内容虽然打开浏览器开发者工具可以看到对应的HTML代码,但是打开网页源代码却找不到对应的内容,而且使用requests库get到的HTML代码也不包含那部分内容.造成这种问题的原因是:你想要爬取的内容采取了js动态加载的方式,属于动态网页. 所谓的动态网页,是指跟静态网页相对的一种网页编程技术。静态网页,随着html代码生成,页面的内容和显示效果就不会发生变化了。而动态网页则不然,其显示的页面则是经过Javascript处理数据后生成的结果,可以发生改变。**这些数据的来源有多种,可能是经过Javascript计算生成的,也可能是通过Ajax加载的。** **从下面两张图中可以看到区别**   那么,从以上的描述我们就知道,使用`selenium`库的目的就是解决`requests`库无法加载动态网页的问题.那么`selenium`库是什么? ### 2、selenium库 Selenium最初是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Firefox,Safari,Google Chrome,Opera等。但是后来,随着动态网页技术的出现,我们用传统方法爬取动态网页遇到了很多困难,这时候就有人开始把`selenium`库用于爬取动态网页,虽然速度变慢了,但是爬取的结果相当不错. #### 2.1 安装selenium库 ```python pip install selenium ``` #### 2.2 下载浏览器驱动 由于我最常使用的是Chrome浏览器,所以我以Chrome浏览器为例. 首先,在Chrome地址栏输入地址 ``` chrome://version ```  从图中我们可以看到最上面一行`Google Chrome:77.0.3865.90`,Chrome对应版本为**77**. 然后再从[http://npm.taobao.org/mirrors/chromedriver/](http://npm.taobao.org/mirrors/chromedriver/)网站找到对应版本的Chromedriver.  #### 2.3 使用selenium ```python # 从selenium导入webdriver from selenium import webdriver from bs4 import BeautifulSoup import time ChromeDriverPath = "/home/nc/download/google/chromedriver" # 获取Chrome驱动 driver = webdriver.Chrome(executable_path=ChromeDriverPath) url = "https://www.baidu.com" # 获取url界面 driver.get(url) # 将HTML页面内容使用Beautiful解析 soup = BeautifulSoup(driver.page_source, "lxml") # 保持浏览器界面10s time.sleep(10) #浏览器可以同时打开多个界面,close只关闭当前界面,不退出浏览器 driver.close() #退出整个浏览器 driver.quit() ``` **运行结果:**  ### 3、总程序 ```python import requests from bs4 import BeautifulSoup from selenium import webdriver import time from PIL import Image from io import BytesIO def get_soup(url): ChromeDriverPath = "/home/nc/download/google/chromedriver" driver = webdriver.Chrome(executable_path=ChromeDriverPath) driver.get(url) soup = BeautifulSoup(driver.page_source, "lxml") # print(soup.prettify()) time.sleep(3) driver.close()#浏览器可以同时打开多个界面,close只关闭当前界面,不退出浏览器 driver.quit()#退出整个浏览器 return soup def main(): urls = [] pages = 5 # 下载10页内容,每一页20张图像 # 初始化链接 for page in range(pages): url_front = "https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=狼" url_end = "&ct=&ic=0&lm=-1&width=0&height=0" url = url_front + "&pn=" + str(page*20) + "&gsm=" + str(hex(page*20)) urls.append(url) num = 0 for url in urls: soup = get_soup(url) children = soup.find_all("li", class_="imgitem") print(len(children)) imageLinks = [] # 保存链接 for child in children: imageLinks.append(child.img["src"]) headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0' } for imageLink in imageLinks: r = requests.get(imageLink, headers=headers) image = Image.open(BytesIO(r.content)) try: image.save("../downloadResources/wolf_" + str(num) + ".jpg") except: print("save Error") num += 1 if __name__ == '__main__': main() ``` **运行结果:**  Last modification:January 20th, 2021 at 05:55 pm © 允许规范转载