美文网首页Python编程语言Python
使用python+selenium爬小说

使用python+selenium爬小说

作者: 西西的博客 | 来源:发表于2018-06-22 19:01 被阅读150次
    图片来源网络

    写在前面

    最近在学习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、程序运行过程中的健壮性?

    相关文章

      网友评论

      • ba63635ca305:为啥要加selenium,用requests不行吗?
        西西的博客:因为当时在学习selenium。就比如系统有自带的排序函数,为什么还要自己写冒泡排序、希尔排序、堆排序,一个意思

      本文标题:使用python+selenium爬小说

      本文链接:https://www.haomeiwen.com/subject/wdhkyftx.html