Python3爬取小说《昆仑》

来源:互联网 发布:js计算购物车总金额 编辑:程序博客网 时间:2024/04/26 23:10

最近迷上小说,网上下载下来,发现章节缺少,重复等问题。严重影响了阅读体验,决定自己学着自己写代码爬一本小说来看。
武侠小说《昆仑》
第一章网址: http://www.kanunu8.com/wuxia/201102/1718/38407.html
最后一章网址: http://www.kanunu8.com/wuxia/201102/1718/38506.html
talk is cheap, show your code!

# -*- coding: utf-8 -*-# 第一行注释很重要,没有的话出现汉字会报错"""Created on Thu Mar 16 21:27:59 2017@author: fangding"""#导入模块import requestsimport reimport urllib.request as requestfrom bs4 import BeautifulSoupcount_error = []    #记录无效的网址def setSrr(url):    #判断网址是否有效,如果无效就打印错误并返回。    if(requests.get(url).status_code == 404):        print('error')        global count_error        count_error.append(url)    #把错误网址加入到列表        return []    print('开始下载……')    l = []    #定义列表用来保存小说内容    html = request.urlopen(url).read()    #读取网页中所有的内容    soup = BeautifulSoup(html)    item = soup.findAll('h2')    #h2里面是章节标题    #这一步的根据是查看网站源码,找到所需要爬去的内容    print('this......', str(item))    #打印章节标题处的源码    title = re.match(r'.*<h2><font color="#dc143c">(.*)</font></h2>.*', str(item) ,re.M|re.I)    #用正则表达式提取出章节标题    print('title:', title.group(1))    #打印标题,看是否正确    l.append(title.group(1))    #标题加入到列表    #提取本章节小说内容部分源码,然后剔除源码部分<p>和</p>    strings = soup.findAll('p')[0].__str__().strip('<p>').strip('</p>')    #print(strings)    '''    a = True    for string in strings:        st = string.__str__()        if a==True:            print(st)            a = False        if(len(st.split('<br/>')) <= 2):            pass        l.append(st)    print(len(l))    print(l[0])    '''    #提取出来的字符串按段落切分,然后加到列表中    l += map(lambda x: x.rstrip(), strings.split('<br/>'))    #返回爬去到的内容    return l#内容写到文件上def setDoc(l, file):    if len(l) < 2:        return    #追加方式打开文件,并写入文件。    with open(file, 'a', encoding='utf-8') as f:        for i in l:            f.write('\t' + i)        f.write('\n')def setNewUrl():    urls = []    #所有要爬取的网址    #《昆仑》中第一章和最后一章网址数字的差是109,所以有110个网址,生成网址列表返回。    for s in range(0, 110):        url = "http://www.kanunu8.com/wuxia/201102/1718/" + str(38407 + s) + ".html"        urls.append(url)    return urlsif __name__ == '__main__':    urls = setNewUrl()    file = '昆仑3.txt'    #setSrr(urls[0])    #爬取每一个网址里面的内容    for url in urls:        l = setSrr(url)        setDoc(l, file)    #打印不存在的网址数量和网址    print(len(count_error))    print(count_error)    #最后发现110个网址,有30个无法访问,《昆仑》正好80章。

一个简单的小说爬虫完成了。
刚学写爬虫,虽然觉得简单,但是高质量,鲁棒性强的爬虫还是不容易。
写的时候一些测试代码都删除了。遇到问题要google,而且stackoverflow是非常好的,一般问题都会有。多看看官网就解决了。

1 0
原创粉丝点击