本人长期出售超大量微博数据、旅游网站评论数据,并提供各种指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。同时欢迎加入社交媒体数据交流群:99918768
背景
参加泰迪杯数据挖掘竞赛,这次真的学习到了不少东西,最后差不多可以完成要求的内容,准确率也还行。总共的代码,算上中间的过程处理也不超过500行,代码思想也还比较简单,主要是根据论坛的短文本特性和楼层之间内容的相似来完成的。(通俗点说就是去噪去噪去噪,然后只留下相对有规律的日期,内容)
前期准备
软件和开发环境: Pycharm,Python2.7,Linux系统
用的主要Python包: jieba, requests, BeautifulSoup, goose, selenium, PhantomJS, pymongo等(部分软件的安装我前面的博客有介绍)
网页预处理
首先因为网站很多是动态的,直接用bs4是获取不到有些信息的,所以我们使用selenium和phantomjs将文件保存在本地,然后再处理。
相关的代码是
def save(baseUrl):
driver = webdriver.PhantomJS()
driver.get(baseUrl) # seconds
try:
element = WebDriverWait(driver, 10).until(isload(driver) is True)
except Exception, e:
print e
finally:
data = driver.page_source # 取到加载js后的页面content
driver.quit()
return data
由于网页中存在着大量的噪音(广告,图片等),首先我们需要将与我们所提取内容不一致的所有噪声尽可能去除。我们首先选择将一些带有典型噪声意义的噪声标签去除,比如script等,方法我们选择BeautifulSoup来完成。
代码大概是这样
for element in soup(text=lambda text: isinstance(text, Comment)):
element.extract()
[s.extract() for s in soup('script')]
[s.extract() for s in soup('meta')]
[s.extract() for s in soup('style')]
[s.extract() for s in soup('link')]
[s.extract() for s in soup('img')]
[s.extract() for s in soup('input')]
[s.extract() for s in soup('br')]
[s.extract() for s in soup('li')]
[s.extract() for s in soup('ul')]
print (soup.prettify())
处理之后的网页对比
可以看出网页噪声少了很多,但是还是不足以从这么多噪声中提取出我们所要的内容
由于我们不需要标签只需要标签里面的文字,所以我们可以利用BeautifulSoup提取出文字内容再进行分析
for string in soup.stripped_strings:
print(string)
with open(os.path.join(os.getcwd())+"/data/3.txt", 'a') as f:
f.writelines(string.encode('utf-8')+'\n')
可以看出来还是非常杂乱,但是又是十分有规律的。我们可以发现每个楼层中的文本内容实质上都差不多,可以说重复的很多,而且都是一些特定的词,比如: 直达楼层, 板凳,