• Python爬取表情包


    前面做了个爬表情包的文章,群聊斗神 - Python爬取斗图表情包 - 斗图之神的战斗神。今天又爬取了一些表情包,但是这次的处理方式有些许的不同,就是在查找到网页中所有的img标签后,处理图片url和图片名字的时候有些许不同。前面是通过处理字符串的方式来处理,效率上会慢一些,今天用bs4处理标签的方式来处理。代码如下:

    """
        爬点表情包,目标网址https://fxxx.com/
    """
    import os
    import requests
    from bs4 import BeautifulSoup
    
    # 首先定义请求网页
    def get_html(url):
        # 设置headers
        headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
        }
        # 请求网页
        request = requests.get(url, headers=headers)
        # 解码
        request.raise_for_status()
        request.encoding = request.apparent_encoding
        request.encoding = 'utf-8'
    
        # 获取内容
        content = request.text
    
        # 返回内容
        return content
    
    # 获取单页的image_list
    def get_image_lists(html_content):
    
        # 解析网页
        soup = BeautifulSoup(html_content, 'lxml')
        # 找到我们需要的信息
        image_lists = soup.findAll(name='img', attrs={"class":"ui image lazy" }) # 找到网页中所有的图片
    
        return image_lists
    
    # 获取图片的地址
    def get_image_urls(image_lists):
        # 开始循环遍历
        image_urls = []
        for i in image_lists:
            image_url = i['data-original'] # 获取img标签下属性为data-original的内容
            image_urls.append(image_url)
        return image_urls
    
    # 获取图片名字
    def get_image_names(image_lists):
        # 开始循环
        image_names = []
        for i in image_lists:
            image_name = i['title'] # 获取img标签下属性为title的内容
            image_names.append(image_name)
    
        # 因为图片名称中可能出现windows不支持的字符如? /等,我们全部替换掉
        str_image_names = [str(image_name).replace('?','').replace('/','') for image_name in image_names] #表达式获取一个新的名字列表
        # 上面我们处理了特殊字符,接下来处理长度,可能会存在长度超出限制的情况
        new_image_names = [str(image_name)[0:20] for image_name in str_image_names] # 如果文件名超出20,我们就截取前20个字符作为标题
        # 当然可能还有其他情况需要处理
        return new_image_names
    
    # 开始处理
    if __name__ == "__main__":
        # 读取20页
        for page in range(1, 5):
            url = f'https://xxx.com/biaoqing/lists/page/{page}.html'
            html_content = get_html(url) # 获取网页内容
            image_lists = get_image_lists(html_content) # 解析网页获取图片信息列表
            image_urls = get_image_urls(image_lists) # 获取网址列表
            image_names = get_image_names(image_lists) # 获取标题列表
    
            all_data = zip(image_urls, image_names) # 将其封装好处理
            # print(list(all_data))
            filePath = './images' # 当前路径下的一个文件夹
    
            for image_url, image_name in all_data:
                if os.path.exists(filePath):
                    rimage = requests.get(image_url)
                    rimage.raise_for_status()
                    with open(os.path.join(filePath, image_name + str(image_url).split('.')[-1]), 'wb') as fileObject:
                        fileObject.write(rimage.content)
                        fileObject.close()
                        print("正在保存:" + image_name)
                else:
                    os.mkdir(filePath)
                    rimage = requests.get(image_url)
                    rimage.raise_for_status()
                    with open(os.path.join(filePath, image_name + str(image_url).split('.')[-1]), 'wb') as fileObject:
                        fileObject.write(rimage.content)
                        fileObject.close()
                        print("正在保存:" + image_name)

    其实不同的地方不多,总结一下思路:

      1,请求网页返回内容;

      2,对内容进行解析;

      3,找到所有的img标签,形成列表;

      4,通过列表提取图片的url和图片的名字

        a,将列表的转换成字符串进行提取;

        b,用标签属性值的方式进行提取;

      5,处理一下图片名字可能给保存带来的麻烦;

      6,逐一保存。

  • 相关阅读:
    团队服务器搭建(搭建php环境和安装在线mysql管理工具phpmyadmin)
    游戏交流社区的构思
    脚本实现在线黄金点游戏,支持多用户,不重复,防机器等功能
    LogFilter
    XML
    Java互联网应用和企业级应用的区别
    Java小目标
    JAVA集合类
    黄金点游戏
    WordCount
  • 原文地址:https://www.cnblogs.com/mafu/p/15331866.html
Copyright © 2020-2023  润新知