在上一篇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 )
大功告成~~ (绅士笑~)