使用python+selenium爬小说

图片来源网络

写在前面

最近在学习python,总想着自己动手弄一个简单一点的程序。于是想到了使用python和selenium爬小说

说起小说,想起了自己的一段“过往”。

我以前不太喜欢看书,但是从高中的时候开始接触了言情小说,并且一发不可收拾,很是沉迷。可能是青春期吧...... (〃'▽'〃)

那时候看言情小说都是同学之间相互借阅着看的,小说、杂志。杂志像是《花火》一类的。高中时代,也没有什么钱天天买这些,都是些零花钱省下来买的

到了大学,有了手机以后都是从网上下载到手机上看的。算了一下,大学的时候看的小说比较多,感觉有100多本....还不止。因为我有一个专门放小说的U盘,保存着我觉得好看的小说,里面的言情小说就有70多本

当时觉得好看的小说,现在都被拍成了电视剧。比如《步步惊心》、《何以笙箫默》、《三生三世十里桃花》等等,感觉挺好的


目标网站

这次要爬的网站是晋江文学城的小说,晋江文学城有免费的小说,可以在线看。但是如果要下载下来是需要晋江币的

现在的目标就是,下载已经完结的免费小说。这是免费小说的地址

网站截图

爬小说思路

总的思路为:

1、打开免费小说页面

2、新建文件夹,用于保存爬取的小说,路径为D:\novel

3、获取所有免费已完结小说的名字、小说链接地址,结果保存到数组

4、打开步骤3中获取的小说名,通过小说名,在路径D:\novel下创建对应的txt文件,用于保存小说。通过小说链接,获取当前小说的所有章节名称、章节链接地址,结果保存到数组

5、打开步骤4中的每一章节,将小说内容保存到对应的txt文件中

6、判断有没有下一页小说列表,有的话从执行步骤3,直到没有下一页的小说列表为止


编写代码

以下是我编写的python代码,仅供参考...... ヽ( ̄▽ ̄)ノ

#coding=utf-8
from selenium import webdriver
import os

#设置浏览器驱动,chromedriver.exe为我本机下载好的浏览器驱动
driver = webdriver.Chrome('C:\Users\yangbizhen\AppData\Local\Google\Chrome\Application\chromedriver.exe')

#最大化窗口
driver.maximize_window()

currentPage = 'http://www.jjwxc.net/bookbase_slave.php?booktype=free'


dirPath = 'D:\\novel\\'
path=dirPath.strip()
path=path.rstrip("\\")
if not os.path.exists(path):
    os.makedirs(path) 

def getChapters(driver):
    chapter_name_list = []
    chapter_link_list = []
    chapter_tr_list = driver.find_element_by_class_name('cytable').find_elements_by_tag_name("tr")  
    for i in range(len(chapter_tr_list)): 
        chapter_tr = chapter_tr_list[i]
        if len(chapter_tr.find_elements_by_tag_name('td'))< 2 or chapter_tr.find_elements_by_tag_name('td')[0].text=='章节':
            continue
        chapterName = chapter_tr.find_elements_by_tag_name('td')[1].text
        try:
            chapterUrl = chapter_tr.find_elements_by_tag_name('td')[1].find_element_by_xpath('span').find_element_by_xpath('div').find_element_by_xpath("a").get_attribute("href")
        except:
            i = i - 1
            continue
        chapter_name_list.append(chapterName)
        chapter_link_list.append(chapterUrl)
        #print (chapterName+' '+chapterUrl+'\n')
    return chapter_name_list ,chapter_link_list

#获取小说列表
def getNovels(driver):
    novel_name_list = []
    novel_link_list = []
    novel_tr_list = driver.find_element_by_class_name('cytable').find_elements_by_tag_name("tr")  
    for i in range(len(novel_tr_list)): 
        novel_tr = novel_tr_list[i]
        if  novel_tr.find_elements_by_tag_name('td')[4].text == '已完成':
            novelName = novel_tr.find_elements_by_tag_name('td')[1].text
            try:
                novelUrl = novel_tr.find_elements_by_tag_name('td')[1].find_element_by_xpath("a").get_attribute("href")
            except:
                i = i - 1
                continue
            novel_name_list.append(novelName)
            novel_link_list.append(novelUrl)
            #print (novelName+' '+novelUrl+'\n')
    return novel_name_list, novel_link_list

#获取每一页小说
def getPageNovel(driver):
    novel_name_list, novel_link_list = getNovels(driver)
    for i in range(len(novel_link_list)):
        fileName = dirPath + novel_name_list[i] +'.txt'
        file = open(fileName,'w')
        file.write(novel_name_list[i] +'\n')
        print ('open url: '+novel_name_list[i]+' '+novel_link_list[i])
        driver.get(novel_link_list[i])
        chapter_name_list ,chapter_link_list = getChapters(driver)
        for j in range(len(chapter_link_list)):
            #print ('open chapter: '+chapter_name_list[j]+' '+chapter_link_list[j])
            try: 
                driver.get(chapter_link_list[j])
                novelText = driver.find_element_by_xpath('//*[@id="oneboolt"]/tbody/tr[2]/td[1]/div')
                text = novelText.text
                text = text.strip('[收藏此章节] [下载]  [免费得晋江币] [举报] ') 
                text = text.strip('插入书签') 
                file.write(text)
                file.write('\n')
            except:
                print ('超时重试')
                j = j - 1
        file.close()

def haveNextPage():
    if is_element_exist('/html/body/div[10]/span[2]/a'):
        return True
    return false
    
    
while True:
    driver.get(currentPage)
    getPageNovel(driver)
    if haveNextPage:
        driver.get(currentPage)
        currentPage = driver.find_element_by_xpath('/html/body/div[10]/span[2]/a').get_attribute("href")
    else:
        break

#driver.quit()



运行结果

在家用无线总是会断网,于是在公司找了一台空闲的机器,有线网络的情况下,大约从下午2点运行到下午5点半的爬取结果如下:

运行结果

写在最后

包括建议以及接下来的学习方向:

1、需要注意的地方是,chromedriver与chrome版本是有关系的,具体可以参考博客selenium之 chromedriver与chrome版本映射表(更新至v2.40)

2、现在用的是单线程的方式爬小说,是否可以考虑多线程的方式?

3、这个例子用的是selenium框架,是否可以考虑使用Scrapy?

4、程序运行过程中的健壮性?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容