python学习笔记4-爬取一系列网页的相关图片

在上一篇python学习笔记3-爬取指定网页的图片 文章中,我提到了用 python 爬取一个页面的所有图片。

但是,万一一篇文字的内容被分页了,如何把这一系列的图片都爬完呢?

分页就是个拦路虎啊~~  T.0

一、要精准找到对应的图片 和 分页,我们首先要分析页面的结构

1. 不是页面中所有的图片都需要的,我们只想要主体内容的图片。

打开浏览器 F12 ,可以看到,图片都是放在一个 div.content 里面的。记下来,这个要考的~!!

2. 我们要把翻页的所有的图片都要下下来,所以还要分析翻页的结构。

可以看到,翻页的地址是相对地址,不是完全地址。所以,要记住这个页面的根路径。同时可以看到,这个页面的当前页面类名是 thisclass

3. 直接点击最后一页

可以看到,最后一页的后面没有内容了。当前页面 thisclass 就已经是最后了。也就是说,我们爬页面的时候,要判断后面还有没有内容,没有内容就要停止爬数据。

分析完毕,开干~!!

二、开始编码

接触爬虫技术刚开始,还是用最基本的爬虫模块,requests+BS4+lxml。

1. 引入各种模块。要额外安装 requests,bs4 以及 lxml 模块。安装方法,见上一篇文章。

# -*- coding:utf-8 -*-
"""
    爬虫基础练习:
    爬指定网页的内容 以及抓取其分页的内容
"""
import os
import requests   # requests 模块
import re   # 正则
from bs4 import BeautifulSoup  # 解析 HTML 的模块 导入 BS ,版本 4。
import lxml   # bs4的解析插件模块

2. 定义变量

# 定义网址。具体网址就不透露了,相信大家想爬的网址比我多~ (绅士笑...)
weburl = r"https://www.xxx.com/2019/1211/1.html"     # 开始的网址,也就是第一页
webRoot = r"https://www.xxx.com/2019/1211/"          # 翻页网址的根目录,这里存放了翻页指定的页面

# 翻页的类, 当前页面class
pageRe = "thisclass"

# 设置本地文件夹路径,这里要提前建好文件夹。
localURL = r"images/"

# 设置请求 headers,伪装浏览器并接受中文数据
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36',
    'Accept-Language': "zh-CN,zh;q=0.9"
}

3. 定义主函数

因为要爬的页面 很多,肯定要用到循环。而“上一页,下一页,1,2,3页”的网址又不一定有规律(虽然大多翻页都是有规律的,但是也不排除特殊情况)。

所以,我想到的是,用函数递归循环。爬取一个页面后,就爬翻页代码,进入下一页继续爬,直到最后一页为止。

(为了说明思路,我把函数代码,分段解释。)

def getWebImages( weburl ):
    if not weburl:
        print("页面内容已经加载完毕")
        return False

每次爬的页面不一样,所以要把页面地址写成参数。 

函数里,首先判断这个参数是否正确,不正确,就说明已经爬完内容了,这个就是就要终止递归循环,return 终止当前函数就可以~

    # 请求网址
    webReq = requests.get(weburl, headers=headers)
    webReq.encoding = webReq.apparent_encoding  # 防止中文乱码

    # 获取请求的HTML代码,字符串格式
    webHTML = webReq.text

    # 用 BeautifulSoup 解析 HTML 字符串
    bs = BeautifulSoup(webHTML, "lxml")

    #  用 BeautifulSoup 获取页面中指定位置的图片
    imgs = bs.select(".content img")

用 requests 请求页面HTML 代码。并且,用 BS4  解析HTML 字符串,从里面获取 内容图片。

    # 遍历图片 list
    for item in imgs:
        imgSrc = item.get("src")  # 获取每张图片的路径
        print( "准备下载"+ imgSrc )

        # 用 requests 下载图片,图片名字保留成网络的名字
        imgReq = requests.get( imgSrc )
        with open( localURL+imgSrc.split("/")[-1] ,"wb+") as f:
            f.write( imgReq.content )  # 把网络图片保存在本地
            print("图片下载完毕")

    print( "one page is over")  # 一个页面下载完毕

遍历图片,并且把图片下载到本地。

    # 开始下载下一个页面
    # 利用 BeautifulSoup 获取翻页的 li。
    pagesLi = bs.select(".dede_pages li")
    # nextPage = None
    for index in range( len(pagesLi) ):  # 因为要获取当前页的索引,所以就利用索引遍历翻页li标签
        # 如果 class 有 “thispage”,说明这个就是当前页面
        if pageRe in str( pagesLi[index].get("class") ):
            # 准备获取下一个页面的页码
            # 但是,如果 index+1 大于了 li 的个数,说明已经到底了,所有页面已经翻完了
            # 不需要再遍历了,直接终止函数运行,停止递归。
            if index+1 >= len(pagesLi):
                print("页面已经翻完啦~")
                return False
            # 获取下一个页面的地址
            nextPage = str( pagesLi[index+1].find("a").get("href") )
            break

    print("开始加载下一个页面内容")
    print( webRoot+ nextPage )
    getWebImages(webRoot+ nextPage )  # 递归调用

(函数代码结束)

4. 开始调用吧。

# 执行函数,开始加载第一个页面的内容
getWebImages( weburl )

大功告成~~ (绅士笑~)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章