关键词搜索

源码搜索 ×
×

多线程带你采集表情包数据,带你体验超速快乐~

发布2022-08-25浏览420次

详情内容

前言 ?

大家早好、午好、晚好吖~

开发环境以及模块使用

  • Python 3.6

  • Pycharm

  • requests

  • parsel

  • re

在这里插入图片描述

单线程代码

import requests # 第三方模块 是需要我们安装 pip instlal requests  read time out
import parsel # 第三方模块 pip install parsel
import re
import time
    def change_title(title):
        mode = re.compile(r'[\\\/\:\*\?\"\<\>\|]')
        new_title = re.sub(mode, "_", title)
        return new_title
    
    time_1 = time.time()
    # 请求网址
    for page in range(1, 11):
        url = f'https://www.fabiaoqing.com/biaoqing/lists/page/{page}.html'
        # 请求头
        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'
        }
        # 返回网页源代码
        response = requests.get(url=url, headers=headers)
        # print(response.text)
        # 解析数据   re css xpath
        selector = parsel.Selector(response.text) # 把respons.text 转换成 selector 对象
        # 第一次提取 提取所有的div标签内容
        divs = selector.css('#container div.tagbqppdiv') # css 根据标签提取内容
        for div in divs:
            # 通过标签内容提取他的图片url地址
            img_url = div.css('img::attr(data-original)').get()
            # 提取标题
            title = div.css('img::attr(title)').get()
            # 获取图片的后缀名
            name = img_url.split('.')[-1]
            # 保存数据
            # 因为文件命名不明还有 特殊字符 所以我们需要通过正则表达式 替换掉特殊字符
            new_title = change_title(title)
            # 对表情包图片发送请求 获取它二进制数据
            img_content = requests.get(url=img_url, headers=headers).content
            # 保存数据
            try:
                with open('img\\' + new_title + '.' + name, mode='wb') as f:
                    # 写入图片二进制数据
                    f.write(img_content)
                    print('正在保存:', title)
            except:
                pass
    
    time_2 = time.time()
    
    use_time = int(time_2) - int(time_1)
    print(f'总共耗时:{use_time}秒')
    
    
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    源码、解答、教程加Q裙:261823976 点击蓝字加入【python学习裙】

    请添加图片描述

    多线程代码

    import requests # 第三方模块 是需要我们安装 pip instlal requests  read time out
    import parsel # 第三方模块 pip install parsel
    import re
    import time
    import concurrent.futures # 线程池
    
    
    
    def change_title(title):
        """替换标题中的特殊字符"""
        mode = re.compile(r'[\\\/\:\*\?\"\<\>\|]')
        new_title = re.sub(mode, "_", title)
        return new_title
    
    
    def get_response(html_url):
        """对网站发送请求"""
        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'
        }
        repsonse = requests.get(url=html_url, headers=headers)
        return repsonse
    
    
    def save(title, img_url, name):
        """保存数据"""
        img_content = get_response(img_url).content
        try:
            with open('img\\' + title + '.' + name, mode='wb') as f:
                # 写入图片二进制数据
                f.write(img_content)
                print('正在保存:', title)
        except:
            pass
    
    
    def main(html_url):
        """主函数"""
        html_data = get_response(html_url).text
        selector = parsel.Selector(html_data) # 把respons.text 转换成 selector 对象
        # 第一次提取 提取所有的div标签内容
        divs = selector.css('#container div.tagbqppdiv') # css 根据标签提取内容
        for div in divs:
            # 通过标签内容提取他的图片url地址
            img_url = div.css('img::attr(data-original)').get()
            # 提取标题
            title = div.css('img::attr(title)').get()
            # 获取图片的后缀名
            name = img_url.split('.')[-1]
            # 保存数据
            # 因为文件命名不明还有 特殊字符 所以我们需要通过正则表达式 替换掉特殊字符
            new_title = change_title(title)
            save(new_title, img_url, name)
    
    
    if __name__ == '__main__':
        time_1 = time.time()
        exe = concurrent.futures.ThreadPoolExecutor(max_workers=10)
        for page in range(1, 201):
            url = f'https://www.fabiaoqing.com/biaoqing/lists/page/{page}.html'
            exe.submit(main, url)
        exe.shutdown()
        time_2 = time.time()
        use_time = int(time_2) - int(time_1)
        print(f'总共耗时:{use_time}秒')
    
    
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    尾语 ?

    好了,我的这篇文章写到这里就结束啦!

    有更多建议或问题可以评论区或私信我哦!一起加油努力叭(ง •_•)ง

    喜欢就关注一下博主,或点赞收藏评论一下我的文章叭!!!

    请添加图片描述
    在这里插入图片描述

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载