2.2 案例4:爬取网页图片并下载到本地

课前说明:本章节请求的 url 部分用 ** 代替

本章节需要掌握的知识点:

1、用 js 代码模拟下拉动作:

    document.documentElement.scrollTop= %d   %d表示下拉的幅度

2、如何使用 redis 数据库进行数据存储

爬虫分三个模块:

       1、请求模块:用于构造请求体,并将请求到的网页(数据)返回给解析模块;

       2、解析模块:用于提取数据(本章节用xpath提取网页中的数据),并返回数据给存储模块;

       3、存储模块:用 redis 数据库存储数据。

案例简介:

       用于抓取网页  https://image.bai**.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E6%9D%A8%E6%80%9D%E6%95%8F 中的图片

简单解析一下爬虫的思路:

       1、访问链接:    https://image.bai**.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E6%9D%A8%E6%80%9D%E6%95%8F
 检查该网站是否动态加载网站(本网站为动态网站)

             爬取动态网页需要借助 selenium 工具;
       2、用xpath 解析网页内容;

       3、将爬取到的数据存储到 redis 数据库中;

       4、下载图片;

       5、撰写爬虫代码,具体代码如下:

from time import sleep

import redis
from selenium import webdriver
from urllib import request
from lxml import etree

driver = r"/home/**/Downloads/chromedriver"
# 把浏览器改为无界面浏览器
opt = webdriver.ChromeOptions()
opt.add_argument('--headless')
opt.add_argument('--disable-gpu')
browser = webdriver.Chrome(executable_path=driver, options=opt)


# 请求模块
def request_html(url):
    '''
    :param url: 请求url
    :return: 返回请求到的页面
    '''
    browser.get(url)
    sleep(2)
    dis = 0
    for _ in range(50):
        dis += 10
        # 执行下拉操作的 js 代码
        js = 'document.documentElement.scrollTop=%d' % dis
        browser.execute_script(js)
        # 每执行一次,等待0.02秒,模仿人类手动操作
        sleep(0.02)
    yield browser.page_source


# 解析模块
def analysis_html(html_list):
    '''
    :param html_list: 页面列表
    :return: 返回解析出来的url_list
    '''
    for html in html_list:
        html_tree = etree.HTML(html)
        src_list = html_tree.xpath("//a/img[@class='main_img img-hover']/@src")
        return src_list


# 存储模块
def save_redis(src_list):
    '''
    :param src_list: 图片的src 列表
    :return: 将图片的 src存入redis
    '''
    connect = redis.StrictRedis(host='localhost', port=6379, db=1)
    for src in src_list:
        connect.lpush('img_src', src)
    img_src = connect.lrange('img_src', 0, 9)
    for img in img_src:
        yield img


# 下载图片
def download(img_list):
    '''
    从redis数据库中取出10条src并下载到本地
    :param img_list: 
    :return: 
    '''
    i = 0
    for src in img_list:
        i += 1
        src = src.decode('utf-8')
        filename = './yangsimin/img%d.png' % i
        request.urlretrieve(src, filename=filename)


def main():
    url = 'https://image.bai**.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&fm=index&pos=history&word=%E6%9D%A8%E6%80%9D%E6%95%8F'
    # 请求
    html = request_html(url)
    # 解析
    src_list = analysis_html(html)
    # # 存储
    img_src = save_redis(src_list)
    # 下载到本地
    download(img_src)


if __name__ == '__main__':
    main()

温馨提示:记得动手敲一敲哦n(*≧▽≦*)n!不记得 xpath 的同学可以复习一下 1.7 认识网页解析工具哦,还有selenium 的使用哈,嘻嘻~

你可能感兴趣的:(一,爬虫基础框架urllib,python爬虫从0到精通)