python网络爬虫--下载图片

本项目将使用requests库、BeaurifulSoup库、selenium库实现下载百度图片的功能.

1、前言

首先,为什么要使用selenium库呢?因为在我们编写爬虫代码的过程中,可能会遇到一个问题:我们需要爬取的内容虽然打开浏览器开发者工具可以看到对应的HTML代码,但是打开网页源代码却找不到对应的内容,而且使用requests库get到的HTML代码也不包含那部分内容.造成这种问题的原因是:你想要爬取的内容采取了js动态加载的方式,属于动态网页.

所谓的动态网页,是指跟静态网页相对的一种网页编程技术。静态网页,随着html代码生成,页面的内容和显示效果就不会发生变化了。而动态网页则不然,其显示的页面则是经过Javascript处理数据后生成的结果,可以发生改变。这些数据的来源有多种,可能是经过Javascript计算生成的,也可能是通过Ajax加载的。

从下面两张图中可以看到区别

python网络爬虫--下载图片_第1张图片

那么,从以上的描述我们就知道,使用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

2.2 下载浏览器驱动

由于我最常使用的是Chrome浏览器,所以我以Chrome浏览器为例.

首先,在Chrome地址栏输入地址

chrome://version

python网络爬虫--下载图片_第2张图片

从图中我们可以看到最上面一行Google Chrome:77.0.3865.90,Chrome对应版本为77

然后再从http://npm.taobao.org/mirrors/chromedriver/网站找到对应版本的Chromedriver.

python网络爬虫--下载图片_第3张图片

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()

运行结果:

python网络爬虫--下载图片_第4张图片

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()

运行结果:

python网络爬虫--下载图片_第5张图片

你可能感兴趣的:(项目,python)