最近闲来无事,受Python爬虫学习的启发,我对广泛歪果仁使用的的英语词频异常感兴趣。于是,我寻思着利用最近所学习的爬虫知识,做一个小型的英语单词词频统计。

主要框架为:Python爬取可在线阅读的英文原著,提取其中的段落,并保存在本地的txt文档中,对txt文档中的数据进行分离,分离出单个单词后,将每个单词添加到Python collection模块中的Counter对象中,实现对单词的计数,接下来将counter中记录的每个单词以及其个数储存在mysql中,以便后面实现数据可视化,最后以词频降序排列,提取出前100个单词,储存在csv文档中,并利用pyecharts中的WordCloud(词云)对象让数据直观化。

想法成立,开始动手。

首先,我们得寻找一个适合在线阅读名著的非盈利网站,其中比较出名的是Zlibrary, 以及“古登堡计划”,我们选择后者,因为它是不需要登录的,而且对爬虫友好。我是想找个大概几十本书去爬取,所以我将目标定位在了这个网址:https://www.gutenberg.org/ebooks/search/?sort_order=downloads

这是目标页面:

这里用开发者工具检查一下我们需要的书籍的url在哪里,

检查后发现目标位于列表项(li)中的a标签中的href属性中,接下来开始获取URL

首先创建一个用于接受url,返回html对象的方法:open_page()

def open_page(url):req = requests.get(url, headers=headers)req.encoding = 'uft-8'html = req.textreturn html

接下来,创建一个用于获取目标书籍url的方法:

def get_full_url(html):global start_indexglobal link_listbsObj = BeautifulSoup(html, 'html.parser')links = bsObj.find_all('li', {'class': 'booklink'})start_index += len(links)for link in links:short_url = link.find('a', {'class': 'link'})['href']full_url = base_url + short_urllink_list.append(full_url)
def get_inform():global start_indexglobal main_urlhtml = open_page(main_url)get_full_url(html)main_url = "https://www.gutenberg.org/ebooks/search/?sort_order=downloads" + "&start_index=" + str(start_index)while start_index < 100:get_inform()

这里说明一下,原网页提供了按受欢迎程度排名前100名的书籍,但是每个页面受大小限制,只显示25本书籍的信息,所以我定义了一个全局字段start_index用于记录已获取了多少本书,而这里的main_url是记录当前页面的url,其命名是有规则的,每次的start_index都是不一样的。

我们将获取获取到的每本书籍的url储存在提前创建好的列表list_url中,便于之后利用。

但是,事情并不简单,获取到的url并非可以直接访问到在线阅读界面,链接打开后如下图:

所以,我们需要先进入该页面并提取两个关键信息:

1.目标书籍的url

2.目标书籍的title

def get_inform():global start_indexglobal main_urlhtml = open_page(main_url)get_full_url(html)main_url = "https://www.gutenberg.org/ebooks/search/?sort_order=downloads" + "&start_index=" + str(start_index)while start_index < 100:get_inform()def goto_page():global link_listwhile len(link_list) > 0:link = link_list.pop()html = open_page(link)bsObj = BeautifulSoup(html, 'html.parser')title = bsObj.find('td', {'itemprop': 'headline'}).get_text()title = re.sub(r'[\n\t\r\v\f]', ' ', title)title = title.strip()page_url = bsObj.find('table', {'class': 'files'}).find('td', {'class': 'unpadded icon_save'}).find('a')['href']page_url = base_url + page_urllink_dict[title] = page_url

原网页提供了按照受欢迎程度的排名前100位的书籍,受页面大小限制,每个页面只显示25本书,所以创建了start_index用于记录已获取书籍的数目,超过100时就停止爬取。按照同样的方式定位到需要爬取元素的位置,爬取并作相应处理,title去掉其中包含的的特殊字符,以免影响待会儿的文件命名,url还原为完整地址,分别储存在提前创建的link_dict中(以title为key, url为value)。

接下来时,分别进入每本书的在线阅读页面,并提取每个章节的段落,储存在txt文档中。

def store_page(html, title):bsObj = BeautifulSoup(html, "html.parser")chapters = bsObj.find_all("div", {"class": "chapter"})if len(chapters) == 0:return Falsefile_path = 'book/' + title + '.txt'with open(file_path, 'w+', encoding='utf-8') as fd:for chapter in chapters:ps = chapter.find_all('p')if len(ps) == 0:return Falsefor p in ps:content = p.get_text()fd.write(content)def is_to_store():for t, u in link_dict.items():html = open_page(u)state = store_page(html, t)if state:passelse:continue

由于,每本书对应的html的DOM树结构不一样,所里上面选择了折衷的方案,大多数书籍都是由以多个class为chapter的div中包含几个段落(p)的结构储存的每个章节,所以上面的代码就只适用符合该结构的书籍,不适用的就跳过了。

由于代码的不完善,上面的过程中,产生了一些无效文件,如没有后缀名的文件和文件大小为0的txt文件,这些文件都是无意义的,所以需要删去。

def delete_invalid_file():print('start to delete invalid file:')root_path = r'A:\pythonProject\book'file_list = os.listdir('book')pattern = re.compile(r'.*\.txt')for file in file_list:flag = re.match(pattern, file)new_path = root_path + '\\' + fileif flag:size = os.path.getsize(new_path)if size == 0:os.remove(new_path)print(file, end=' ')else:os.remove(new_path)print(file, end=' ')print('delete over')

删去无效文件后,储存下来的txt如下:

接下来,我们将有效的文件名(书名)储存在mysql中,这样也有一个数据来源。

def get_filename():global connglobal curprint('start to store book_name to mysql')file_list = os.listdir('book')for i in range(len(file_list)):cur.execute('INSERT INTO recorder (book_name) VALUES (%s)', file_list[i])file_list[i] = 'book' + '\\' + file_list[i]# conn.commit()return file_list

上面的代码将书名储存在MySQL中,并返回一个包含每个txt相对路径的的file_list,便于后面读取。

def read_words(file_name):print('start to count from: ' + file_name)global words_counterwith open(file_name, 'r', encoding='utf-8') as fd:lines = fd.readlines()for line in lines:line_str = line.strip()if line_str != '':words = re.findall(r'[a-z]+', line_str.lower())words_counter.update(words)print('count over')

上面的代码,遍历每个txt文件,读取其中的内容,并将每个单词分离出来,并添加到提前创建的Counter中记录每个单词出现的次数。

接下来,数据持久化,将储存在Counter中的每个单词及其出现的次数储存在MySQL中。

def update_to_mysql():global connglobal words_counterglobal curprint('start to store data to mysql:')for w, t in words_counter.items():if len(w) > 1 or (w == 'a' or w == 'i'):cur.execute('SELECT id, total FROM counter WHERE word = %s', w)if cur.rowcount == 0:cur.execute('INSERT INTO counter (word, total) VALUES(%s, %s)', (w, t))elif cur.rowcount == 1:result = cur.fetchone()id = result[0]total = result[1] + tcur.execute('UPDATE counter SET total = %s WHERE id = %s', (total, id))conn.commit()cur.close()conn.close()print('store over')

为了,以后添加,这里要分两种情况,一种是原先sql中没有出现的单词,这样直接插入新纪录就行;另一种,原本sql记录中就有这个单词了,就需要更新其出现的次数。

储存完毕后,我们将前按照词频降序排名的前100位单词选出来,并将其转化为csv和更加直观的词云图:

def convert_to_csv():global connglobal curheader = ['word', 'count']cur.execute("SELECT word, total FROM `counter` ORDER BY total DESC LIMIT 100")result = cur.fetchall()with open('book/result.csv', 'w', encoding='utf-8', newline='') as fd:f_csv = csv.writer(fd)f_csv.writerow(header)f_csv.writerows(result)cur.close()conn.close()def data_to_WordCloud():global connglobal curdata = []cur.execute("SELECT word, total FROM `counter` ORDER BY total DESC LIMIT 100")result = cur.fetchall()for row in result:data.append(row)word_map = WordCloud()word_map.add("词频统计", data, word_size_range=[20, 100])word_map.render(path='book/wordCloud.html')cur.close()conn.close()

最后,csv文件在excel中打开如下:

词云图如下:

写在文末:最终,我的任务算是完成了,但是其中存在的不足也是显而易见的,主要问题在于单词的格式并不是初始格式,但是将其还原为其原型是一件非常耗费时间的事情,无论是调用api,或是用在线查词网页都非常慢,所以最后还是妥协了。

最后,一起加油吧!

Python爬虫的应用:统记词频相关推荐

  1. Python爬虫网易云歌词及词频统计--(周杰伦top50)

    本篇博客是利用Python爬虫网易云音乐,并利用jieba分词,对歌词进行分词,然后分析周杰伦top50中最常出现的词语. 我们先尝试获取一首歌的歌词吧,比如等你下课这首歌 上面的id就是等你下课这首 ...

  2. 一个Python爬虫工程师学习养成记

    大数据的时代,网络爬虫已经成为了获取数据的一个重要手段. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道 ...

  3. Python爬虫工程师学习养成记

    大数据的时代,网络爬虫已经成为了获取数据的一个重要手段. 但要学习好爬虫并没有那么简单.首先知识点和方向实在是太多了,它关系到了计算机网络.编程基础.前端开发.后端开发.App 开发与逆向.网络安全. ...

  4. Python爬虫及其它函数知识读记及简单用法,持续更新中...

    Python爬虫相关函数知识读记及简单用法,持续更新中- requests [riˈkwests] n. 请求,要求( request的名词复数 ): 需要: 所请求的事物: 申请书 函数或单词- 音 ...

  5. 记第一次Python爬虫-----五块五毛网站小说

    事情要从那个吃了蝙蝠的人开始说起(2020.02.03记)...... 一.前因 因为哪些个吃蝙蝠的人,让我有足够的时间和充分的理由,可以待在家不出门,也不会被嫌弃,于是,待久了,人总要无聊,于是开始 ...

  6. 深圳python爬虫培训南山科技园钽电容回收_记一次python 爬虫爬取深圳租房信息的过程及遇到的问题...

    为了分析深圳市所有长租.短租公寓的信息,爬取了某租房公寓网站上深圳区域所有在租公寓信息,以下记录了爬取过程以及爬取过程中遇到的问题: 爬取代码: import requests from reques ...

  7. python解决租房问题_记一次python 爬虫爬取深圳租房信息的过程及遇到的问题

    为了分析深圳市所有长租.短租公寓的信息,爬取了某租房公寓网站上深圳区域所有在租公寓信息,以下记录了爬取过程以及爬取过程中遇到的问题: 爬取代码: import requests from reques ...

  8. 记第一次写出自己的简单python爬虫:GCZW3

    经过差不多一个星期的折腾,当然这其中也有做很多其他事情.周四写出来直接通过浏览器Network找到观察者网评论链接进行的爬虫,今天下午有折腾了差不多一下午,终于通过BeautifulSoup解析出的h ...

  9. python爬虫入门实例-终于领会python爬虫入门示例

    随着人工智能 大数据的火热 Python成为了广大科学家和普通大众的学习语言.在学习Python的过程中 有很多人感到迷茫 不知道自己该从什么地方入手,今天我们就来说一些新手该如何学习Python编程 ...

  10. python 爬虫抓站

    python 爬虫抓站 记录(虾米,百度,豆瓣,新浪微博) python 下用到的库,urllib, urllib2, BeautifulSoup, cookielib, mechanize, re ...

最新文章

  1. 搭建selenium + Python环境的总结:
  2. Python_Mix*OS模块,序列化模块种的json,pickle
  3. 投稿须知 | 让你的文字被很多很多很多人看到
  4. VTK:超流线用法实战
  5. 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
  6. 手机 — oppo手机录音放在哪个文件夹里
  7. docker:编排与部署小神器Compose
  8. 电子信息工程专业概论_本科专业介绍 | 电子信息工程
  9. 三层交换机/路由器OSPF配置详解【华为eNSP实验】
  10. DMG Canvas 3 for Mac 共享版 – 优秀的DMG安装包制作软件
  11. 11个超实用的创意设计思维训练方法
  12. Backdoor.Zegost木马病毒分析(一)
  13. 推荐一个简单好用的HTML编辑器
  14. Chrome 不支持 WebGL 怎么办
  15. Microsemi Libero使用技巧7——离线安装IP Core
  16. android 开源 高斯模糊_Android高斯模糊你所不知道的坑
  17. HDU 威威猫系列故事——篮球梦
  18. 【论文笔记】ECCV_2016_The Unreasonable Effectiveness of Noisy Data for Fine-Grained Recognition
  19. ORACLE之DG搭建1-DG搭建要求
  20. 考研调剂心得体会,给学弟学妹们的一些经验感想(希望对你们有所帮助)

热门文章

  1. 64位电脑如何安装32位系统
  2. 遇到一个Bug:Android: requestLayout() improperly called
  3. html5视频 小马哥,小码哥-HTML5培训之进击前端的动画狮!
  4. 拷贝temp文件下的麦客疯临时文件到当前目录 .
  5. 3d模型 vv5_你也想做锦鲤信小呆?WEY VV5升级款这就来满足你!
  6. html做成avi格式文件,制作HTML网页插入视频Mp 4格式可以播放,AVI格式为何不可以播放...
  7. IPS(Intrusion Prevention System)入侵防护系统原理
  8. 软件测试工程师的职业技能分析
  9. 记录下生活,让人生有点感悟
  10. 搬砖(二分答案 + 线性规划)