Python爬虫实战(5)斗图啦表情包下载(单线程)

利用BeautifulSoup requests库和urllib库,实现斗图啦的表情包下载

运行平台: Windows
Python版本: Python 3.8
IDE: Pycharm

基本思路:分析网页得到表情包的url和名称,然后利用urllib下载图片并用得到的名称作为文件名.

网页分析

        斗图啦 http://www.doutula.com/photo/list/?page=1
斗图啦
       所有的表情包都放在div中的各个a class=“col-xs-6 col-sm-3”,中的img标签属性的data-original(表情包url)和alt(名称).

代码

# 使用单线程下载表情包
import requests
import time
import os  # 用于导入文件后缀名
from urllib import request  # 用于下载
from bs4 import BeautifulSoup


def parser_page(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
        'Host': 'www.doutula.com'}
    t1 = time.time()

    response = requests.get(url, headers=headers).text
    bs = BeautifulSoup(response, 'html.parser')
    images = bs.find_all('a', class_='col-xs-6 col-sm-3')

    for image in images:
        img0 = image.find_all('img')[-1]

        img = img0.get('data-original')
        title = img0.get('alt')
        # 防止一些中文标点符号做文件名时会出错,替换成''
        title = title.replace(',', '').replace('?', '').replace('!', '')
        suffix = os.path.splitext(img)[1]  # 得到文件的后缀
        filename = title + suffix
        print(filename, '\t', '下载完成!')
        # request.urlretrieve(img, 'images/' + filename) # 直接使用会被反爬虫限制

        # 用于网页的反爬虫
        opener = request.build_opener()
        opener.addheaders = [headers]
        request.install_opener(opener)
        request.urlretrieve(img, 'images/' + filename)

        time.sleep(0.5)

    t2 = time.time() - t1
    print('\n', '耗时:', t2, 's')


def main():
    for i in range(1, 2):  # 下载的表情包页数
        url0 = 'http://www.doutula.com/photo/list/?page='
        url = url0 + str(i)
        parser_page(url)


if __name__ == '__main__':
    main()

注意事项

文件名的中文标点

       因为从alt属性得到名称中很多都带有中文标点符号如 ? ! , ,它们无法当作文件名,所以要把它替换成空白.

title = title.replace(',', '').replace('?', '').replace('!', '')
可以用正则表达式来实现.

文件后缀os.path.splitext

       os.path.splitext可以实现将文件名和拓展名分开,如下:

os.path.splitext('/home/ubuntu/python/example.py')

('/home/ubuntu/python/example', '.py')

网页反爬虫

       如果直接使用request.urlretrieve下载图片,因为里面没有headers信息所以很容易被网页发现是爬虫,从而禁止访问,如下:

request.urlretrieve(img, 'images/' + filename)

urllib.error.HTTPError: HTTP Error 403: Forbidden

       可以使用下面的方法:

opener = request.build_opener()
opener.addheaders = [headers]
request.install_opener(opener)
request.urlretrieve(img, 'images/' + filename)

输出结果

我生气了.jpg 	 下载完成!
坏龙.jpg 	 下载完成!
吃东西中.gif 	 下载完成!
嘻嘻.jpg 	 下载完成!
疑问墨镜熊猫.jpg 	 下载完成!
我靠看不下去了.gif 	 下载完成!
短发胖虎.jpg 	 下载完成!
点赞哦.jpg 	 下载完成!
歪脑袋.jpg 	 下载完成!
又到了溜狗群主时间.jpg 	 下载完成!
我特么.png 	 下载完成!
你们不吃饭吗.png 	 下载完成!
涂口红.jpg 	 下载完成!
无敌伞.jpg 	 下载完成!
胖虎尴尬了.jpg 	 下载完成!
灭了你我就能睡着了.gif 	 下载完成!
左边儿右边儿摇摇头.jpg 	 下载完成!
我不想被劝退我饭卡里还有好多钱呢.jpg 	 下载完成!
闭嘴寡妇.jpg 	 下载完成!
在你胸囗上比划富城.jpg 	 下载完成!
我看你是土狗吃屎打饱嗝.jpg 	 下载完成!
在你右边儿再画个龙.jpg 	 下载完成!
帅哥伞.jpg 	 下载完成!
那我告诉你吧我变得更爱你了.jpg 	 下载完成!
你家死一户口本.jpg 	 下载完成!
我给你变一个魔术.jpg 	 下载完成!
不说了要去搬砖了.jpg 	 下载完成!
呆滞.jpg 	 下载完成!
狗管理你老婆寂寞吗.jpg 	 下载完成!
变完了看到了吗.jpg 	 下载完成!
假装去世.jpg 	 下载完成!
错是娶我.jpg 	 下载完成!
注意你的言辞小智障.jpg 	 下载完成!
下次你来我家.jpg 	 下载完成!
我是一只小绵羊你可以给我草吗.png 	 下载完成!
瘦了.jpg 	 下载完成!
大声的告诉你.jpg 	 下载完成!
您不配.jpg 	 下载完成!
我可能是假….面骑士.jpg 	 下载完成!
看我的手表是夜光的.jpg 	 下载完成!
拽到被窝里.jpg 	 下载完成!
您配.jpg 	 下载完成!
用被子蒙住咱俩的头.jpg 	 下载完成!
四可我你仙人板板.jpg 	 下载完成!
深情的告诉你.jpg 	 下载完成!
狗日的生活.jpg 	 下载完成!
我这一个响指下去每个人都要少一个睾丸.jpg 	 下载完成!
可是这并不能让蟹老板交出他的秘方.jpg 	 下载完成!
老子戴这么大的眼镜都看不透你这个憨批.jpg 	 下载完成!
估摸这个点你也该想我子.jpg 	 下载完成!
滚开狗杂种你妈的坟墓出门左转.jpg 	 下载完成!
你可能会先死.jpg 	 下载完成!
请尊重我.jpg 	 下载完成!
物理超度.jpg 	 下载完成!
原来我就是桥本环奈啊.jpg 	 下载完成!
嬲得你恩婆还不是.jpg 	 下载完成!
带我吃鸡好不好嘛.jpg 	 下载完成!
小骚货.jpg 	 下载完成!
啪(小黄鸡).jpg 	 下载完成!
你脑子是进胡萝北了吗.jpg 	 下载完成!
对方不想和你说话并且向你投掷了一套女装。.jpg 	 下载完成!
啪你死了.jpg 	 下载完成!
哇是萝莉控.jpg 	 下载完成!
我真的很快乐.jpg 	 下载完成!
乡下人的目光.null 	 下载完成!
我爱你妈妈.jpg 	 下载完成!
谁他妈买小米.png 	 下载完成!
刀不锋利马太瘦我还不想和你斗.jpg 	 下载完成!

耗时: 126.40596842765808 s

imgs

总结

       这是使用单线程下载的表情包,速度会较慢,待我完成多线程的表情包下载代码后,会把链接放在下面做一个速度和代码的对比!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值