本项目将使用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

2.2 下载浏览器驱动

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

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

chrome://version

从图中我们可以看到最上面一行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()

运行结果:

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

运行结果:

Last modification:August 14th, 2020 at 08:24 pm
如果觉得我的文章对你有用,请随意赞赏