用Python爬取斗图网表情包

一、介绍

用python处理二进制文件的事情做的比较少,虽然之前有写过分析Ajax抓取今日头条街拍美图,但那个爬虫重在分析Ajax,并没有提到文件路径和文件命名,所以就有了这个爬虫

二、流程

流程一般化,没什么特别的,这里就不说了

---------------------------17/8/25第一次更新:关于文件名语法错误
  • 当文件名中含@等特殊字符串时,文件名的字符串长度会超级超级长,会造成文件名语法错误这个问题我一开始是这样解决的:
 if len(title)>20:   #有些表情包的标题含特殊字符,例如@,这个时候文件夹名称会超长,导致程序报错
        title =title[:3]   
    else:
        title=title   #虽然解决了问题,但也使得文件名不齐全
  • 当文件名以?等标点符号结尾时,会造成文件名语法错误,这个问题是皮皮哥运行的时候发现的,所以用python删除标点符号,这个想法就冒出来了,在网上查到两种方法:translate()和正则,translate我写的没有解决问题,这里我就用正则,一般我们用正则得到的是一个列表,那样显然不符合我们的要求,所以我们要这样写:
import re
l='你知道@不>大,记得?'
m=' '.join(re.findall(u'[\u4e00-\u9fff]+', l))
print(type(m))
m=m.replace(' ', '')   #这里再用replace把空格去掉
print(m)
a=re.findall(u'[\u4e00-\u9fff]+', l)
print(type(a))
print(a)

运行结果:
F:\Anaconda3\python.exe E:/Pycharm文件存储位置/day33/2.py
<class 'str'>
你知道不大记得
<class 'list'>
['你知道', '不', '大', '记得']

Process finished with exit code 0
  • strip()函数原型
    有人说空格可以直接用strip()函数啊,这里我再补充一点关于strip()函数的用法
    声明:s为字符串,rm为要删除的字符序列
    s.strip(rm) 删除s字符串中开头、结尾处,位于 rm删除序列的字符
    s.lstrip(rm) 删除s字符串中开头处,位于 rm删除序列的字符
    s.rstrip(rm) 删除s字符串中结尾处,位于 rm删除序列的字符
1. 当rm为空时,默认删除空白符(包括'\n', '\r',  '\t',  ' ')
>>> a = '     123'
>>> a.strip()
'123'
>>> a='\t\tabc'
'abc'
>>> a = 'sdff\r\n'
>>> a.strip()
'sdff'

2.这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。
>>> a = '123abc'
>>> a.strip('21')
'3abc'   结果是一样的
>>> a.strip('12')
'3abc'

三、代码

import requests
from bs4 import BeautifulSoup
import os
import re
from requests.exceptions import RequestException

base_url='https://www.doutula.com/article/list/?page='

def get_page_index(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        print('请求索引页出错')
        return None

def parse_the_index(html):
    pattern1 = re.compile('random_title">(.*?)<div class="date', re.S)
    titles = re.findall(pattern1, str(html))
    pattern2 = re.compile('(https?://www.doutula.com/article/detail/\d+)', re.S)   #有些是http://,有些是https://
    items = re.findall(pattern2, str(html))
    for i in range(10):   #每页10套表情包,这个是固定的
        try:   #中途报错加上去的
            if get_page_index(items[i]):
                html=get_page_index(items[i])
                picture_url=get_picture_url(html)
                for url in picture_url:
                    if 'http' in url:
                        url=url
                    else:
                        url=str('http:')+url
                    mkdir(titles[i], url)
        except IndexError:   #这个错误是有些图片在html中抓取的url没有http:造成的,后面错误被我补好了,留着它也没事
            print('这页网页结构不一样,pass')

def download(url):   #下载图片
    response = requests.get(url)
    p=response.content   #返回二进制格式
    name = url[-9:-4]
    try:
        f = open(name + '.jpg', 'ab')
        f.write(p)
        f.close()
    except FileNotFoundError:   #这个错误在中途遇到一次,没搞懂它为什么报错
        print('储存文件失败')

def mkdir(title,url):
    '''if len(title)>20:
        title =title[:3]
    else:
        title=title'''
    title = ' '.join(re.findall(u'[\u4e00-\u9fff]+', title))
    title = title.replace(' ', '')
    isExists = os.path.exists(os.path.join("D:\doutu", title))
    if not isExists:
        print(u'建了一个名字叫做', title, u'的文件夹!')
        os.makedirs(os.path.join("D:\doutu", title))   #返回这个文件夹
    else:
        pass
        os.chdir(os.path.join("D:\doutu", title))
        download(url)
        return True

def get_picture_url(html):   #获得详情页里表情包图片的url
    pattern = re.compile('img src="(.*?)" alt=', re.S)
    picture_url = re.findall(pattern, str(html))
    return picture_url

def the_sum():   #获取总页数
    html = get_page_index(base_url)
    soup = BeautifulSoup(html,'lxml')
    sum = soup.find_all("a", href="/article/list/?page=510")
    sum=int(sum[0].get_text())   #使用选择器获得的是一个列表,get_text()只能对列表里的元素使用
    return sum

def main():
    sum=the_sum()
    for i in range(1,sum+1):
        print('正在下载第%d页表情包'%i)
        url = base_url+str(i)
        html = get_page_index(url)
        parse_the_index(html)

if __name__ == '__main__':
    main()

四、最后得到的表情包

部分截图

五、总结

1.正则虽然好用,但稍显复杂,要好好看看选择器的知识了
2.调试程序的时候好好利用try:...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,368评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,941评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,369评论 0 326
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,848评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,719评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,505评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,904评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,528评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,819评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,848评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,652评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,468评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,912评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,095评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,389评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,906评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,120评论 2 339

推荐阅读更多精彩内容