python爬取pubmed文章标题,进行词频统计、生成词云

爬取pubmed标题页面,然后统计词频,生成词云可以更直观的让我们了解到某个方向研究的热点或者趋势是什么,上效果图:
python爬取pubmed文章标题,进行词频统计、生成词云_第1张图片
需要输入的网址是在pubmed里搜索后生成的网址,可以是左侧进行各种过滤后的。
python爬取pubmed文章标题,进行词频统计、生成词云_第2张图片

爬虫代码:

import requests
from bs4 import BeautifulSoup
import re

#生成网址
start_url = ('输入网址:')
page = input('输入搜索前多少页:')
for i in range(int(page)):
	url = start_url + "&page=" + str(int(i)+1)
#爬取网页
	r = requests.get(url, headers= {'user-agent':'Mozilla/5.0'}) 
	r.raise_for_status()
	r.encoding = r.apparent_encoding
	html = r.text
#提取信息
	soup = BeautifulSoup(html, 'lxml')
	for paper in soup.find_all('article'):
		name = str(paper.a).split('">')[-1]
		title = re.sub(r'(||)', '', name).strip()
		with open('out_title.txt', 'a', encoding='utf-8') as out_file:
			out_file.write(title + '\n')

统计词频与生成词语代码:

import wordcloud
#常见词汇总,将后面统计词频后无意义的词加进来,不统计
excludes = {'a', 'an', 'and', 'of', 'from', 'for', 'in', 'by', 'the', 'with', 'to', 'on', 'among', 'us', 'study',
			'use', 'at', 'after', 'between', 'as'} 
#输入文件
in_file = 'out_title.txt'
#定义读取格式化函数
def getText():
	txt = open(in_file, "r").read()
	txt = txt.lower()                           
	for ch in '|"$%&()*+,-./:;<=>?@[\\]^_‘{|}~': #去除各类标点符号,替换为空格
		txt = txt.replace(ch, "")
	return txt  #得到的是一个以空格分隔的字符串,内容为所有输入文本

#读取
inputTxt = getText()
words = inputTxt.split()  #得到的是一个以单个单词为内容的列表
words2 = words[:]
#生成词云
for remove_word in words2:
	if remove_word in excludes:
		words2.remove(remove_word)
	else:
		continue
words3 = ' '.join(words2)
w = wordcloud.WordCloud(font_path="msyh.ttc", width=1000, height= 700,
						background_color="white", max_words=50)  #max_words=15设置最多显示词数
w.generate(words3)
w.to_file("marine.jpg")  #生成的文件名
###########################################################
counts = {}
#将同义词合并并计数
for word in words:
	if word == "cutinases" or word == "cutinase":  #合并同义词,有多个则继续加elif
		rword = "cutinase"
	else:
		rword = word
	counts[rword] = counts.get(rword, 0) + 1
#去除常见词
for word in excludes:
	if counts.get(word):
		del counts[word]
	else:
		continue
#格式化输出
items = list(counts.items())
items.sort(key=lambda x:x[1], reverse=True)
for i in range(50):   #输出前50位的
	word, count = items[i]
	print('{0:<20}{1:>5}'.format(word, count))

整了半天,函数没调试好,只能这样直来直去的的,后面还会继续优化。

你可能感兴趣的:(爬虫)