Python爬取百度贴吧图片

今天我们来举个一个非常简单的例子,教大家如何爬取百度贴吧的图片

首先访问多个百度贴吧url,浏览器选择开发者选项或者审查元素,查看url的特征,可以看到所有的url有一部分都是https://tieba.baidu.com/p/十个数字开头的,后面随着贴吧页数的增加出现?pn=1, ?pn=2这样的格式,所以这样子就可以开始着手写代码了。
下面是查看网页源代码的图片
要访问网页的URl
可以看到pn的值和页面之间是对等的关系

下面是代码的部分

# -*- coding: utf-8 -*-
# @Author: Clarence
# @Date:   2018-01-01 20:12:49
# @Last Modified by:   Clarence
# @Last Modified time: 2018-01-03 14:42:09

"""
功能: 输入百度贴吧帖子的地址就可以爬取贴吧里面所有的图片,对于输入的地址没有要求,有自动修改url的模块,图片以jpg格式存储
在以贴吧标题命名的文件夹中。
测试环境为python3.7
"""

import urllib.request
import re
import os

def judge_url():
    #设定布尔中间变量
    jude=False
    while not jude :
        url = input("请输入要获取图片的贴吧地址:")
        # 格式化url删除两边的空格
        url = url.strip()
        #判断url是否包含"http://tieba.baidu.com/p/"
        url1 = url[:25]
        url2 = "http://tieba.baidu.com/p/"
        #判断url位数是否大于最低位数
        jude = int(len(url)) >=35 and url1 == url2
        print()
        if not jude:
            print("输入地址有误,请重新输入!")
    # 格式化url,只截取“http://tieba.baidu.com/p/数字 ”部分
    url = url[:35]
    return url

# 以标题存为文件夹名存放图片
def create_folder(url2):
    url=url2
    # 建立图片存放文件夹,以贴吧标题为名
    try:
        # 获取标题
        tile = re.compile('<title>(.*?)_百度贴吧</title>').findall(urllib.request.urlopen(url).read().decode('UTF-8'))
        os.mkdir(str(tile[0]))
        print("成功创建\""+str(tile[0])+"\"  文件夹")
        os.chdir(os.path.join(os.getcwd(), str(tile[0])))
    except UnicodeDecodeError:
        print("找不到标题,请检查地址!")
        print("------------------------------------------------------------------------------")
        print("重新运行程序...")
        get()
    except FileExistsError: #文件存在错误异常
        os.chdir(os.path.join(os.getcwd(), str(tile[0])))
        print("\"" + str(tile[0]) + "\"  文件夹已存在,将直接下载到本文件夹")
    except Exception as Error:
        print("获取标题失败,错误原因:" + Error)
        print("------------------------------------------------------------------------------")
        print("重新运行程序...")
        get()

def page(url):
    start=input("开始页码:")
    end=input("结束页码:")
    p=int(start)
    while p<=int(end):
        #添加url页码参数
        url2=url+"?pn="+str(p)
        #获取图片
        fetch_pictures(url2,p)
        p=int(p)+1
#遍历存储图片
def fetch_pictures(url,p):
    html_content = urllib.request.urlopen(url).read()
    try:
        #获取图片地址列表
        picture_url_list=re.compile('class="BDE_Image" (?:[a-zA_Z0-9="^>]+ )*src="(.*?)" ').findall(html_content.decode('UTF-8'))
        #检查是否搜索到图片
        if  len(picture_url_list)==0:
            print("第"+str(p)+"页没有发现图片!")
        else:
            print("正在下载第"+str(p)+"页的图片:")
            # 遍历图片地址列表存储图片
            for i in range(len(picture_url_list)):
                # 设置图片名字为页码数+序号
                picture_name = str(p) + "__" + str(i + 1) + '.jpg'
                try:
                    # 存储图片
                    urllib.request.urlretrieve(picture_url_list[i], picture_name)
                    # 存储爬取成功打印
                    print("成功下载: " + picture_url_list[i])
                except Exception as Error:
                    # 异常失败打印
                    print("下载失败: " + picture_url_list[i])
                    print("异常原因: " + Error)
    except UnicodeDecodeError:
        print("获取图片链接列表失败")
        print("------------------------------------------------------------------------------")
        print("重新运行程序...")
        get()

def get():
    # 获取地址
    url = judge_url()
    # 建立存放的文件夹
    create_folder(url)
    # 获取页码存储图片
    page(url)

if __name__ == '__main__':
   get()

代码运行情况
爬取的图片展示
爬取的图片展示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youaresherlock

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值