现在的目标是使用Python+Selenium完成一个本体指导智能爬虫的工具。目标网站为煮机网。
流程如下:
1、把煮机网上所有文章爬取下来,一共2000篇,对每篇文章进行爬取、分词、存储工作。
2、对文章进行打分
3、对打好分的文章进行排序
4、人工分析,多少分以上的文章是可靠的,设定分数标准,将低于标准的文章删除
分词使用的是结巴分词器,使用方法如下:
import jieba header_mode = jieba.cut(header)
对于怎么创建、写入文档,也找了一下方法,最后发现以下代码可以实现:
f = open(header,"w") f.write(str(content_mode)) f.close()
在第二行,一开始写的是f.write(content_mode),出现报错:TypeError: expected a string or other character buffer object
网上搜了一下,是类型问题,要写入的话必须是str类型的,转换一下就OK了。
但是打开看了一下,并没有成功写入,文档里只有一行:<generator object cut at 0x00000000037B1870>
不知道是什么错,尝试改成f.write(str(content)),出现新报错:UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-32: ordinal not in range(128)
在其他人的博客(http://wangye.org/blog/archives/629/)里找到了答案,似乎是因为编码问题,Unicode编码与ASCII编码不兼容,通过以下三行代码可以解决:
import sys reload(sys) sys.setdefaultencoding('utf-8')
同时,再去文档里看,已经解决,文本内容可以成功写入文档。
实现了以上基本的动作,现在我考虑把功能连起来。首先我在想,如何把一整个页面的10篇文章内容都download下来。
这里我写了一个函数,专门用来获取页面上的文本并下载。
def download_text(): elements = driver.find_elements_by_class_name("entry-title") for element in elements: element.click() sleep(2) header = driver.find_element_by_class_name("entry-title").text content = driver.find_element_by_class_name("entry-content").text header_mode = jieba.cut(header) content_mode = jieba.cut(content) print(" ".join(header_mode)) print(" ".join(content_mode)) sleep(2) f = open(header, "w") f.write(str(content)) f.close()
在寻找的方法的时候,发现煮机网上,每篇文章都是存在“下一页”按钮的,可以直接跳转到下一篇文章,大大简化了爬虫步骤,在方法里加个下一步就可以了。于是我把访问第一页和下载文档分开来,这时download_text方法改成了下面的样子:
def download_text(): header = driver.find_element_by_class_name("entry-title").text content = driver.find_element_by_class_name("entry-content").text header_mode = jieba.cut(header) content_mode = jieba.cut(content) print(" ".join(header_mode)) print(" ".join(content_mode)) f = open(header, "w") f.write(str(content)) f.close()
煮机网因为快要倒闭(。。。)所以页面结构比较简单,class单一好爬,所以我定位直接用class_name了。
然后写了个循环:
next_page = driver.find_element_by_class_name("nav-title-icon-wrapper") while (next_page): next_page.click() sleep(5) download_text() sleep(5) next_page = driver.find_element_by_class_name("nav-title-icon-wrapper")
到这里可以实现把煮机网上所有文章都爬下来的功能了,不过如果网络不太好的话就会停止爬虫了,比较麻烦,后期再考虑怎么改了。