美文网首页编程学习
Python爬虫-网络小说

Python爬虫-网络小说

作者: wangjun | 来源:发表于2018-09-25 10:24 被阅读23次

    初识Python,本章主要做一下学习记录,如有错误,欢迎斧正,欢迎大神拍砖

    爬虫步骤:

    • 确定爬取目标
    • 分析页面
    • 抓取页面内容,解析目标字段
    • 保存目标
    1. 确定爬取目标

    如题,今天需要爬取全书网,也就是这个页面

    2. 分析页面

    反向推理一下,需要获取到具体内容,需要拿到正文页面url
    而需要获取到正文页面的url,则需要先拿到章节列表的url
    而章节列表的url,前提有是当前书籍的首页
    总结一下
    小说网书库-->书籍首页-->章节列表-->章节内容-->下载保存

    • 书籍首页
      分析首页,我们需要的就是href里的书籍首页链接
      这里使用正则匹配

    <li><a target="_blank" href="http://www.quanshuwang.com/book_137459.html" class="l mr10"><img onerror="this.src='/modules/article/images/nocover.jpg'" src="http://img.quanshuwang.com/image/137/137459/137459s.jpg" alt="法家高徒" width="120" height="150"></a><img src="/kukuku/images/only2.png" class="topss png_bg"><span class="l"><a target="_blank" title="法家高徒" href="http://www.quanshuwang.com/book_137459.html" class="clearfix stitle">法家高徒</a>作者:<a href="/modules/article/authorarticle.php?author=%CA%FA%D7%D3%B2%BB%BF%C9%BD%CC">竖子不可教</a><em class="c999 clearfix"> 百家争鸣,鬼神显圣,武道昌盛的大争之世。记忆达人司徒刑...<a href="http://www.quanshuwang.com/book_137459.html">更多</a></em><a href="http://www.quanshuwang.com/book_137459.html" class="readTo">马上阅读</a></span></li>

    .*?表示替换,(.*?)表示获取内容,下面这个正则,表示获取所以的<li></li>标签里面的href的内容

    regex = r'<li><a target=".*?" href=".*?" class=".*?"><img onerror=".*?" src=".*?" alt=".*?" width=".*?" height=".*?"></a><img src=".*?" class=".*?"><span class=".*?"><a target=".*?".*?" href="(.*?)" class=".*?">.*?</a>.*?<a href=".*?">.*?<em class=".*?">.*?<a href=".*?">.*?</a></em><a href=".*?".*?">.*?</a></span></li>'

    # 爬取书籍首页
    def getEveryBookHomeURL(pages):
    
        print('正在解析单个图书首页...')
        book_homes =[]
        for page in pages:
            page_response = requests.get(page)
            page_response.encoding = 'gbk'
            if page_response.status_code == 200:
                # print(page_response.text)
                
                regex = r'<li><a target=".*?" href=".*?" class=".*?"><img  onerror=".*?" src=".*?" alt=".*?" width=".*?" height=".*?"></a><img src=".*?" class=".*?"><span class=".*?"><a target=".*?".*?" href="(.*?)" class=".*?">.*?</a>.*?<a href=".*?">.*?<em class=".*?">.*?<a href=".*?">.*?</a></em><a href=".*?".*?">.*?</a></span></li>'
                urls = re.findall(regex, page_response.text)
                for url in urls:
                    book_homes.append(url)
    
    爬取单本书籍
    • 章节列表
      依然通过正则匹配,获取到每一章节的链接
    # 爬取书籍阅读页面(带章节列表)
    def getEveryBookReaderURL(homes):
    
        print('正在解析图书章节列表...')
    
        pages =[]
        for book_home in homes:
    
            book_response = requests.get(book_home)
            book_response.encoding = 'gbk'
            if book_response.status_code == 200:
                # <a href="http://www.quanshuwang.com/book/0/269" class="reader" title="凡人修仙传免费阅读">开始阅读</a>
                regex = r'<a href="(.*?)" class=".*?" title=".*?">.*?</a>'
                urls = re.findall(regex, book_response.text)
                if len(urls) > 0:
                    pages.append(urls[0])
    
    # 解析书籍章节列表
    def getBookContent(book_home_url):
        '''
        book_home_response = urllib.request.urlopen(book_home_url)
        if book_home_response.status == 200:
            print(book_home_response.read().decode('gbk'))
        :return:
        '''
    
        print('正在爬取书籍章节...')
        # 网络请求
        book_home_response = requests.get(book_home_url)
        # 中文编码
        book_home_response.encoding = 'gbk'
        # 判断是否请求成功
        if book_home_response.status_code == 200:
            # 开始解析
            '''
            准备正则表达式
            1: 需要解析的内容结构  <li><a href="http://www.quanshuwang.com/book/0/567/7347707.html" title="第一章 离乡,共2405字">第一章 离乡</a></li>
            2: 需要的内容用通配符 (.*? 匹配所有);用(.*?)括号扩起来的,才是会解析出来的
            3: <li><a href="(.*?)" title=".*?">(.*?)</a></li>
            '''
            regex = r'<li><a href="(.*?)" title=".*?">(.*?)</a></li>'
            # 解析的数据,放到list里面
            urls_titles = re.findall(regex,book_home_response.text)
            book_titles = re.findall(r'<strong>(.*?)</strong>',book_home_response.text)
            book_title = book_titles[0]
    
    爬取单本书籍章节列表
    爬取单张链接
    • 章节内容
    # 下载章节
    def downloadChapter(url, chaper_title, book_title):
    
        # 网络请求
        chaper_response = requests.get(url)
        # 中文编码
        chaper_response.encoding = 'gbk'
        # 判断是否请求成功
        if chaper_response.status_code == 200:
            # 开始解析
            regex = r'</script>&nbsp;&nbsp;&nbsp;&nbsp;(.*?)<script type="text/javascript">'
            regex = re.compile(regex,re.S)
            list_text = re.findall(regex,chaper_response.text)
            chaper_text = list_text[0]
            # 替换文案中的特殊字符
            chaper_text = chaper_text.replace('<br />','')
            chaper_text = chaper_text.replace('&nbsp;&nbsp;&nbsp;&nbsp;','')
            chaper_text = chaper_text.replace(';','')
    
            writerTo(book_title,chaper_title, chaper_text)
    
    爬取单张内容
    • 下载保存
    # 写入本地文件
    def writerTo(book_title, chaper_title, text):
    
        book_path = download_books_dictory_path + '{}.txt'.format(book_title)
        path = pathlib.Path(book_path)
        if path.exists():
            print('{}:已下载'.format(book_title))
        else:
            print('正在下载:' + book_title + ' ' + chaper_title)
            with open(book_path, 'a+') as f:
                f.write(chaper_title)
                f.write('\n\n\n')
                f.write(text)
                f.write('\n\n\n')
    

    相关文章

      网友评论

        本文标题:Python爬虫-网络小说

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