python爬虫之一:爬取网页小说(魂破九天)

近期做一个项目需要用到python,只懂皮毛的我花了三天时间将python重新拾起啃一啃,总算对python有了一定的认识。
然后有根据爬虫基本原理爬取了一本小说,其他爬取小说的方法类似,结果见个人资源下载(本想下载分设置为0,结果CSDN设置最低为2分,没有积分的可以加我qq要该小说)。
**爬虫原理:1、模拟人打开一页小说网页
2、将网页保存下来
3、将网页关键字保存下来
4、循环**
环境:python2.7,安装BeautifulSoup,win7-64bit,sublime text3
需要的基本知识(这些基本的网页知识我后面有时间会总结下,现在不知道可以先百度下):HTML5基本知识(标签,属性),BeautifulSoup基本知识。
小说首页地址:http://www.xinshubao.net/0/927/45819.html (魂破九天)
爬取该页内容进行分析:通过分析网页地址分为两段,地址头为:http://www.xinshubao.net/0/927/ 地址尾为45819.html(可以通过网页获取到)
代码如下:

#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from bs4 import BeautifulSoup
import urllib

def getHtmlCode(url):      #输入为网页地址,输出为网页源码
    page = urllib.urlopen(url)
    html = page.read()
    return html
urlHead = 'http://www.xinshubao.net/0/927/'
urlEnd = '45819.html'
url = urlHead + urlEnd
def parser(url):          #输入为网页地址,输出为解析后网页的结构
    str1 = getHtmlCode(url)
    soup = BeautifulSoup(str1,"html.parser")
    temp = soup.prettify()
    print temp
    return soup
parser(url)

通过爬取连续的几页分析可知,每章节分为两页,两章内容连在一起就是一章。
1、小说主要内容在<div id="content">标签中

    <div id="content">
      第一章 狼心狗肺
      <br />
      <br />
      纵横帝国,清风镇。
      <br />
      <br />
      “头好痛!”
      <br />
      <br />
      秦朗感觉大脑一阵刺痛,无数的信息涌进脑海!
      <br />
      <br />
      十年前,秦家族山!
      <br />
      <br />
      同年,秦战海之子,只有五岁的秦朗觉醒武魂,而且是百年难得一见的六星火龙武魂,被誉为清风镇数百年来的第一天才!
      <br />
      <br />
      叶家更是锦上添花,将家主之nv叶可清许配给了秦朗!
      <br />
      <br />
      但让人大跌眼镜的是,不知为何,天赋绝佳的秦朗足足用了十年时间,实力依然停留在武徒一重!秦朗更是被废除了少族长之位!
      <br />
      <br />
      而反观与秦朗订婚的叶可清,不但出落的越来越漂亮,被称为清风镇第一美nv!
      <br />
      <br />
      而且仅用十年时间便修炼到了武徒九重,乃是清风镇数一数二的天才,与秦朗形成了鲜明对比!
      <br />
      <br />
      清风镇人人都在叹息,真是一朵鲜花cha在了牛粪上!
      <script>
       s3();
      </script>
      <br />
      不过,让所有人不解的是,叶家似乎丝毫没有要与秦朗解除婚约的意思……
      <br />
     <!--省略-->
      秦朗激动的发现
      <br />
      <br />
     </div>

2、获取该标签内容并通过正则表达式(需要导入re),代码:

def resolve(url):
    html=parser(url)
    content = html.find_all('div',id='content')
    content = str(content[0])
    content = content.replace('<br />','')
    print content
resolve(url)

结果:
这里写图片描述
可以看到这个中间还有其他标签<script>s3();</script>这些标签不是小说的内容应该删除,
2.1、将标签内容替换为空:

def resolve(url):
    html=parser(url)
    content = html.find_all('div',id='content')
    content = str(content[0])
    content = content.replace('<br />','')
    # print content
    match = re.compile('<(.*)>')
    taglist = match.findall(content)
    for tag in taglist:
        tag = '<' + tag +'>'
        content = content.replace(tag,'')
    content = content.replace('\n','')
    print content
resolve(url)

结果:

这里写图片描述
3、找到下一页地址
根据网页源代码可以找到下一页的地址:

def nextUrl(url):
    html = str(parser(url))
    pattern = re.compile('<a href="(.*).html')
    chapterList = pattern.findall(html)
    url = urlHead + chapterList[1] + '.html'
    print url
    return url
nextUrl(url)

运行结果:http://www.xinshubao.net/0/927/45819_2.html
4、将两页连在一起

def resolve(url):
    html = parser(url)
    content = html.find_all('div',id='content')
    content = str(content[0])
    # print content
    content = content.replace('<br />','')
    # print content
    pattern = re.compile('<(.*)>')
    text = pattern.findall(content)
    # print text
    for line in text:
        line = '<' + line +'>'
        content = content.replace(line,'')
    content = content.replace('\n','')
    tmp = nextUrl(url)
    index = tmp.find('_2')
    if -1 == index:    #如果是不同章节之间就空一行
        content = content + '\n\n'
    print content
    return content

5、抓取整篇小说

def main(url):
    flag = True
    txt = ''
    count = 0 #防止网页吊死
    while flag:
        try:
            index = url.find('9316313_2') #最后一页
            f = open(u'魂破九天.txt','a+')   #追加
            tempTxt = resolve(url)
            f.write(tempTxt)
            f.close()
            url = nextUrl(url)
            if -1 != index or count == 2000:
                flag = False
        except Exception as e:
            raise
        else:
            pass
        finally:
            count = count + 1
            print u'第%0.1f章 网页地址 %s'% (count/2.0,url)

好了整个爬取网页小说的教程到此结束!
全部代码如下:

#coding:utf-8
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from bs4 import BeautifulSoup
import urllib

def getHtmlCode(url):
    page = urllib.urlopen(url)
    html = page.read()
    return html
urlHead = 'http://www.xinshubao.net/0/927/'
urlEnd = '45819.html'
url = urlHead + urlEnd
def parser(url):
    str1 = getHtmlCode(url)
    soup = BeautifulSoup(str1,"html.parser")
    temp = soup.prettify()
    return soup
def nextUrl(url):
    html = str(parser(url))
    pattern = re.compile('<a href="(.*).html')
    chapterList = pattern.findall(html)
    url = urlHead + chapterList[1] + '.html'
    return url
def resolve(url):
    html=parser(url)
    content = html.find_all('div',id='content')
    content = str(content[0])
    content = content.replace('<br />','')
    # print content
    match = re.compile('<(.*)>')
    taglist = match.findall(content)
    for tag in taglist:
        tag = '<' + tag +'>'
        content = content.replace(tag,'')
    content = content.replace('\n','')
    urlNext = nextUrl(url)
    isSameChapter = urlNext.find('_2')
    if -1 == isSameChapter:
        content = content + '\n\n'
    # print content
    return content
def main(url):
    flag = True
    txt = ''
    count = 0 #防止网页吊死
    while flag:
        try:
            index = url.find('9316313_2') #最后一页
            f = open(u'魂破九天.txt','a+')   #追加
            tempTxt = resolve(url)
            f.write(tempTxt)
            f.close()
            url = nextUrl(url)
            if -1 != index or count == 2000:
                flag = False
        except Exception as e:
            raise
        else:
            pass
        finally:
            count = count + 1
            print u'第%0.1f章 网页地址 %s'% (count/2.0,url)

main(url)

结果图:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_37608398/article/details/80115327