python爬虫隔一段时间一乐之海子的诗

每隔一段时间(一周到一个月)拿出1到2天来做一个好玩的东西,不求回报,只为快感。 前两天刚买了一本电子书《海子的诗》,晚上读了快一半,好多诗里面都提及了麦子和村庄。想到可以对海子的所有的诗来个词频分析,顺便做一个词云图片。

用到了python的图片处理PIL,绘图模块matplotlib,科学计算numpy,还有中文分词jieba,词云模块wordcloud。很多代码都是从网上或者wordcloud示例程序中摘抄过来的。在做这个的过程中发现了一篇相关内容非常不错的博客,强烈推荐:http://minimaxir.com/2016/05/wordclouds/

直接贴代码吧,前提是需要把海子的诗保存到txt中

# -*- coding: utf-8 -*-

import jieba
import numpy as np
import matplotlib.pyplot as plt

from os import path
from collections import Counter
from PIL import Image

from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

d = path.dirname(__file__)

with open('haizi.txt', 'r') as poet:
    s = poet.read()

seg_list = [x for x in jieba.cut(s) if len(x) > 1 and x not in [u'一个', u'一只', u'一样', u'一直', u'一种']]

alice_coloring = np.array(Image.open(path.join(d, "haizi.jpg")))

font = "/Library/Fonts/Lantinghei.ttc"
wc = WordCloud(background_color="white", font_path=font, mask=alice_coloring, max_font_size=80, random_state=42, scale=1.5)

# generate word cloud
wc.fit_words(Counter(seg_list).items())

# create coloring from image
image_colors = ImageColorGenerator(alice_coloring)


# show
plt.imshow(wc)
plt.axis("off")
plt.figure()

# recolor wordcloud and show
# we could also give color_func=image_colors directly in the constructor
plt.imshow(wc.recolor(color_func=image_colors))
plt.axis("off")
plt.figure()
plt.imshow(alice_coloring, cmap=plt.cm.gray)
plt.axis("off")
plt.show()

# store to file
wc.to_file(path.join(d, 'haizi.png'))

下面这个代码是爬虫的代码,最主要的还是中文乱码处理,从 http://www.eywedu.com/haizi/ 上面爬下来了海子的大部分诗,没有全部爬下来,代码里只对下一页进行了爬取,后来发现有的长诗里面还有目录,本来以为麦子应该占很大的比重,生成了图片才发现没有麦子这个词的踪迹。

中间花费了很大部分的时间来处理中文乱码问题,历史遗留的ASP网站果然不行,http返回头里都不带content-type字段。

# -*- coding: utf-8 -*-

from bs4 import BeautifulSoup
import requests
import re


def parse_poet(html, encoding):
    soup = BeautifulSoup(html, from_encoding=encoding)
    title = soup.find("table", attrs={"width": "95%", "border": "0", "align": "center"}).text
    text = re.sub('\n[ \t]+', '\n', soup.find("blockquote").text)
    hrefs = soup.find("p", attrs={"align": "right"}).find_all('a')
    next_page = None
    if len(hrefs) == 3:
        next_page = hrefs[-1].get('href')
    return title, text, next_page


url = "http://www.eywedu.com/haizi/01/001.htm"

with open('haizi.txt', 'a') as mfile:
    while url is not None:
        r = requests.get(url)
        if r.encoding == 'ISO-8859-1':
            encodings = requests.utils.get_encodings_from_content(r.content)
            if encodings:
                r.encoding = encodings[0]
            else:
                r.encoding = r.apparent_encoding

        poet = parse_poet(r.text, r.encoding)
        mfile.write(poet[0].encode('utf8'))
        mfile.write(poet[1].encode('utf8'))
        url = poet[2] and '/'.join(url.split('/')[0:-1]) + '/' + poet[2] or None

现在可以去想想下一次要搞个什么好玩的东西了,不出意外还会是基于爬虫。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

Python进阶学习之阅读代码

起因 最近在公司的任务是写一些简单的运营工具,因为是很小的工具,所以就用了github上面的一个开源项目flask-admin,可以省去很多的事情。 但是,这个...

28770
来自专栏Flutter入门

ffplay.c 源码分析- 音频部分

1. 读取线程-read_thread 在main方法中会启动的读取的线程。 这个和视频的线程模型中是一致的。不同的是,循环读取的数据是音频数据。

16920
来自专栏何俊林

利用FFmpeg玩转Android视频录制与压缩

本文为剑西独家授权发布,剑西也是做Android多媒体开发,算是同道中人,不过他主要集中在视频压缩,利用FFmpeg,能做很多事,但是做到效果好,却不多。今天看...

1.2K60
来自专栏大数据和云计算技术

一套数据,多种引擎(续)---两种数据格式(Parquet/ORCfile)浅析

最近主要在研究大数典型应用adhoc query,要实现秒级的adhoc query,通常有3种思路: 1、用搜索技术,将查询都建立索引,然后用搜索技术来实现。...

408100
来自专栏写代码的海盗

初生牛犊不怕虎 golang入坑系列

读前必读,下面所有内容都是来自这里。 放到这里的目的,就是为了比对一下,哪里的读者多。。(X := '难' || X :='耐' || X := '好' ) 都...

30540
来自专栏FreeBuf

Python工具分析风险数据

小安前言 随着网络安全信息数据大规模的增长,应用数据分析技术进行网络安全分析成为业界研究热点,小安在这次小讲堂中带大家用Python工具对风险数据作简单分析,主...

28390
来自专栏小詹同学

爬点重口味的 。

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,对面的女孩看过来(邪恶的一笑),让人想入非非啊,一看卧槽,左边这妹子彻底赢了,这(**)这么大,还这么漂亮,...

16120
来自专栏北京马哥教育

Python新手应该如何练手?知乎5600赞答案告诉你!

作者:小小搬运工 链接:https://www.zhihu.com/question/29372574/answer/88624507 一直在学习python,...

40270
来自专栏牛客网

今日头条三面面经

4.       优先队列的底层数据结构?插入和删除一个节点的时间复杂度是多少? 

95820
来自专栏Golang语言社区

C++ 实现银行排队服务模拟

教程简介:使用 C++对银行排队服务进行模拟,以事件驱动为核心思想,手动实现模板链式队列、随机数产生器等内容,进而学习概率编程等知识。作为可选进阶,这个模型同时...

406120

扫码关注云+社区

领取腾讯云代金券