Python+Selenium爬坑记录——煮机网爬虫

现在的目标是使用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")
 到这里可以实现把煮机网上所有文章都爬下来的功能了,不过如果网络不太好的话就会停止爬虫了,比较麻烦,后期再考虑怎么改了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据