python爬虫12:实战4

python爬虫12:实战4

前言

​ python实现网络爬虫非常简单,只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点,方便以后复习。

申明

​ 本系列所涉及的代码仅用于个人研究与讨论,并不会对网站产生不好影响。

目录结构

文章目录

    • python爬虫12:实战4
      • 1. 目标
      • 2. 详细流程
        • 2.1 目标确定
        • 2.2 请求网页
        • 2.3 模拟滑动滚轮
        • 2.4 下载图片
        • 2.5 完整代码
      • 3. 总结

1. 目标

​ 这次爬虫实战,采用的库为:selenium,这次就以那种动态加载的图片网页为目标,本次的网站就是家大业大的百度图片。

再次说明,案例本身并不重要,重要的是如何去使用和分析,另外为了避免侵权之类的问题,我不会放涉及到网站的图片,希望能理解

2. 详细流程

2.1 目标确定

​ 写爬虫第一件事情,就是确定目标网页地址。这里,我们的目标是百度图片,因此直接打开百度图片搜索美女,然后观察它的url:

https://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&dyTabStr=MCwxLDMsMiw0LDUsLDYsOCw3LDk%3D&word=美女

​ 这个链接非常的长,因为它有很多无关的参数,所以我们第一件事情就是化繁为简,大胆的删除一些无关参数(之前讲解过参数形式都是&xxx=value),得到结果如下:

https://image.baidu.com/search/index?tn=baiduimage&word=美女

​ 另外,观察这个网页,你会发现:随着滚轮往下滚,图片越来越多。这就是动态网页,也是我们常用的requests库难以处理的场景,这同样告诉我们使用selenium这个库。

2.2 请求网页

​ 这部分就是中规中矩了,看过前面关于selenium 讲解的应该都可以轻松写出来。

​ 代码如下:

# 请求百度图片
def get_baidu_images():
    # 初始化
    driver = webdriver.Chrome()
    # 网址
    base_url = 'https://image.baidu.com/search/index?tn=baiduimage&word='
    target = input('请输入想要下载的图片名字:')
    url = base_url + target
    # 请求
    driver.get(url)

2.3 模拟滑动滚轮

​ 本次代码有很多实现思路,我这里想的是:首先,滚轮滚动一定距离,然后获取图片的下载地址,接着询问是否还需要滚动,如果不,则停止加载,开始下载图片,否则继续滚动

​ 想要实现滚动,需要执行js代码。肯定有些人没有学习过,没关系,虽然我学过的,但是也已经忘得差不多了。

​ 所以,我们直接百度js代码实现滚动条向下滚动,即可找到js代码如下:

window.scrollBy(0,100)
# 这个是移动多少的距离,即每次移动100像素

​ 那么,可以来写代码了,如下:

#( 接着上面的函数写的 )
# 是否滚动
flag = True
while flag:
    # 先让滚动条滚动五次.每次间隔0.5秒,给浏览器一定的加载时间
    for i in range(5):
        driver.execute_script('window.scrollBy(0,300)')
        time.sleep(0.5)
	# 询问是否继续滚动
    decision = input('是否继续滚动(Y/N):')
    if decision == 'N':
        flag = False

​ 给大家展示一下运行效果:

python爬虫12:实战4_第1张图片

​ 可以看出,没有什么问题,那么继续,下一步就是解析网页,获取所有的图片链接。

​ 首先,看下图:

在这里插入图片描述

​ 我们可以通过xpath来解析代码:

//div[@class="imgbox-border"]//img

​ 那么,代码如下:

# (接着上面写)
# 解析
img_list = driver.find_elements(by=By.XPATH,value='//div[@class="imgbox-border"]//img')
href = [img.get_attribute('src') for img in img_list]
# 退出
driver.close()
return href

​ 运行结果如下图所示:

在这里插入图片描述

2.4 下载图片

​ 最后一步,就是下载图片,我们可以重新写一个函数来实现。

​ 下载图片很简单,流程就是:

1. 请求图片网址
2. 获取图片源码
3. 将图片以二进制的形式写入文件即可

​ 但是,这里需要注意,不能使用selenium去请求图片,不然你相当于打开了图片所在的网页,并没有真正的打开图片,建议还是使用requests去访问

​ 代码如下:

# 下载图片
def download_image(url,index):
    '''
    :param url: 下载图片的链接
    :param index: 索引,用于文件名
    '''
    # 参数
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    }
    # 请求
    response = requests.get(url,headers=headers)
    source_code = response.content
    # 保存到文件
    with open('image'+str(index)+'.jpg','wb') as f:
        f.write(source_code)

​ 运行结果如下:

python爬虫12:实战4_第2张图片

2.5 完整代码

# 导包
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import requests

# 请求百度图片
def get_baidu_images():
    # 初始化
    driver = webdriver.Chrome()
    # 网址
    base_url = 'https://image.baidu.com/search/index?tn=baiduimage&word='
    target = input('请输入想要下载的图片名字:')
    url = base_url + target
    # 请求
    driver.get(url)
    # 是否滚动
    flag = True
    while flag:
        # 先让滚动条滚动五次.每次间隔0.5秒,给浏览器一定的加载时间
        for i in range(5):
            driver.execute_script('window.scrollBy(0,300)')
            time.sleep(0.5)
        # 询问是否继续滚动
        decision = input('是否继续滚动(Y/N):')
        if decision == 'N':
            flag = False
    # 解析
    img_list = driver.find_elements(by=By.XPATH,value='//div[@class="imgbox-border"]//img')
    href = [img.get_attribute('src') for img in img_list]
    # 退出
    driver.close()
    return href


# 下载图片
def download_image(url,index):
    '''
    :param url: 下载图片的链接
    :param index: 索引,用于文件名
    '''
    # 参数
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
    }
    # 请求
    response = requests.get(url,headers=headers)
    source_code = response.content
    # 保存到文件
    with open('image'+str(index)+'.jpg','wb') as f:
        f.write(source_code)


if __name__ == '__main__':
    url_list = get_baidu_images()
    for i,url in enumerate(url_list):
        download_image(url,i)

3. 总结

​ 本篇讲解了selenium的主要用途,处理动态网页。另外告诉了大家如何使用selenium执行js代码,还有一点就是如何爬取图片并保存到本地。

你可能感兴趣的:(python爬虫系列,python,爬虫,开发语言)