本项目将使用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库
pip install selenium
- 1
2.2 下载浏览器驱动
由于我最常使用的是Chrome浏览器,所以我以Chrome浏览器为例.
首先,在Chrome地址栏输入地址
chrome://version
- 1
从图中我们可以看到最上面一行Google Chrome:77.0.3865.90
,Chrome对应版本为77.
然后再从http://npm.taobao.org/mirrors/chromedriver/网站找到对应版本的Chromedriver.
2.3 使用selenium
# 从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()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
运行结果:
3、总程序
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()
- 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
- 56
- 57
- 58
- 59
运行结果: