吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3322|回复: 26
收起左侧

[Python 转载] 【Python爬虫】爬取表情包-学习基本的页面爬取

  [复制链接]
情绪666 发表于 2021-11-24 11:25
本帖最后由 情绪666 于 2021-11-26 12:07 编辑

爬取表情包
一、爬取页面: https://fabiaoqing.com/biaoqing
  • Fix:
    2021/11/26: 1. 动态判断图片类型保存到本地 2. 文件名过长无法保存到本地,进行截取120个字符



二、能学到了什么(专业非Python:有错误请指正,看到会及时调整修改,还是比较适用于入门爬虫,基本上不是前后端分离的都可以使用
  • 爬取 HTML 页面
  • 使用 XPath 语法解析页面
  • asyncio 进行同步调用,防止爬取过快
  • 保存图片到文件夹
  • 简单的正则表达式,剔除 windows 不运行出现的字符
  • 定时器 time.sleep 延时
  • etree 解析页面,基本上爬取页面都能这样用
  • 错误处理:错误重试,多次错误则跳过
  • tqdm 进度条显示(用法在百度上面有很多 https://blog.csdn.net/qq_33472765/article/details/82940843




效果展示

QQ截图20211124105817.jpg

QQ截图20211124105831.jpg


代码区域

[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
# Time : 2021/11/23 10:39
# Author : Melon
# Site : 
# Note : 
# File : biaoqingbao.py
# Software: PyCharm
import asyncio
import imghdr
import os
import re
import time

import requests
from lxml import etree
from tqdm import tqdm

# 错误次数
err_num = 0


async def saveImg(image_url, file_name):
    global err_num
    # Windows 保存文件时不能出现这些字符,全部替换成_
    file_name = re.sub(r'[\\/:*?"<>|\r\n]+', "_", file_name)
    if len(file_name) > 120:
        file_name = file_name[:120]
    try:
        # 文件夹名称
        dir_name = './表情包'
        # 没有文件夹 就 创建文件夹
        if not os.path.exists(dir_name):
            os.mkdir(dir_name)
        # 加延迟防止过快
        time.sleep(0.5)
        result = requests.get(image_url)
        # 保存图片
        with open(dir_name + "/" + file_name + '.' + imghdr.what(None, result.content), "wb") as f:
            f.write(result.content)
    except Exception as e:
        # 异常:1.打印错误信息 2.延迟 3S 后重新调用 3.错误超过3次则跳过
        err_num += 1
        print("\nError Total %s Sleep 3 saveImg:%s Message: %s" % (err_num, image_url, e))
        if err_num >= 3:
            pass
        else:
            time.sleep(3)
            await saveImg(image_url, file_name)


async def get_img(start_page, end_page):
    global err_num
    for i in range(start_page, end_page):
        url = "https://fabiaoqing.com/biaoqing/lists/page/{}.html".format(i)
        get = requests.get(url=url)
        # xpath解析
        html = etree.HTML(get.content)
        divs = html.xpath("//div[@class='tagbqppdiv']")
        # 设置进度条
        pbar = tqdm(total=len(divs))
        # 设置进度条前面的文字
        pbar.set_description("Processing 第%s页" % i)
        for div in divs:
            # 设置进度条后面的文字
            pbar.set_postfix_str(div.xpath("./a/img/@title")[0])
            # 保存图片
            err_num = 0
            img_data_original = div.xpath("./a/img/@data-original")[0]
            await saveImg(img_data_original, div.xpath("./a/img/@title")[0])
            # print('\n' + div.xpath("./a/img/@title")[0], div.xpath("./a/img/@data-original")[0])
            # time.sleep(0.5)
            # 更新进度条
            pbar.update(1)
        # 关闭进度条
        pbar.close()


if __name__ == '__main__':
    # 1. 创建一个事件循环
    loop = asyncio.get_event_loop()
    tasks = [
        loop.create_task(get_img(21, 201)),
    ]
    # 3. 执行事件队列
    loop.run_until_complete(asyncio.wait(tasks))
    loop.close()

免费评分

参与人数 8吾爱币 +5 热心值 +7 收起 理由
RogerlovesLord + 1 我很赞同!
mika_2003 + 1 我很赞同!
张伯伦 + 1 + 1 用心讨论,共获提升!
dgy + 1 热心回复!
yjn866y + 1 + 1 热心回复!
MagicPotato1341 + 1 + 1 学到了,继续进步
wfmiss + 1 我很赞同!
YiWood + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

YiWood 发表于 2021-11-24 11:28
很不错的初学者案例
Domanca 发表于 2021-11-26 11:15
本帖最后由 Domanca 于 2021-11-26 11:16 编辑
Domanca 发表于 2021-11-26 00:27
看了一下,这个网站表情包还不错,200页
你的程序没有多线程,我又还不会,只能多开几个一起跑,多下一点 ...

有个问题,你这默认保存为Png格式,但是很多表情包都是gif格式的,保存下来就不是动图了
[Python] 纯文本查看 复制代码
type = div.xpath("./a/img/@data-original")[0][-4:]
if(type!=".gif" and type!=".jpg"):
        type = ".png"
# 保存图片
err_num = 0
await saveImg(div.xpath("./a/img/@data-original")[0], div.xpath("./a/img/@title")[0] + type)

改这样可以保存为jpg,png和gif

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
情绪666 + 1 + 1 谢谢@Thanks!

查看全部评分

yjn866y 发表于 2021-11-24 11:44
wupeng010142 发表于 2021-11-24 12:40
收藏  。  
LaLaLand 发表于 2021-11-24 13:35
是时候收藏一波了
aresxin 发表于 2021-11-24 13:48
先学习了
mika_2003 发表于 2021-11-24 14:52
是时候收藏一波了
xiaodie0607 发表于 2021-11-24 14:58
我可能太笨了,真是一点也看不懂,虽然是入门级的。
anzio0 发表于 2021-11-24 15:58
收藏一波   留着收集表情包
baiyegua1214 发表于 2021-11-25 09:58
收藏~正好也刚接触Python
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 07:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表