python爬取网络小说

一、环境说明
1.IDE
python 3.6 ,vs 2017
网上大多数人都是在使用PYCHARM ,关于VS 2017或者其他版本下使用PYTHON的内容较少,还有很多地方需要摸索,有不足的地方请指正
2.操作系统
64位 window 10 专业版
二、程序说明
1.本程序是入门级爬虫 程序,本人初次尝试python爬虫,代码有不足的地方请指正
2.程序本身采用三种方式完成爬虫功能,分别是:
单页面固定值爬取
变量页面循环爬取功能
函数体循环爬取
3.所使用的莫跨
urllib 网络通讯主要模块
re 正则表达式

上述两个模块的使用请自行查阅相关资料,在CSDN上很容易就能搜索到,目前网络爬虫网上的例子基本分为两种,一种就是用urllib进行细节化爬取,另一种就是使用一个名叫beautifulsoup的包,按网上的例子来看,这个包功能很强大,貌似可以直接对地址下的所有内容进行直接下载,也就是说将网站理解为FTP,对路径下所存在的内容直接下载,省去很多繁琐的工作,但是具体没有尝试过,需要读者自己去尝试

三、代码内容

from urllib import request
import re
#定义本体程序
#if __name__ == "__main__":
    #单页面常量运行
    #response = request.urlopen("https://www.7kshu.com/41/41319/12622232.html")
    #html = response.read()
    #html = html.decode("gbk")
    #title_re = re.compile(r'<h1>(.*?)</h1>')
    #text_re = re.compile(r'<br /><br />([\s\S]*?)</div>')
    #title = str(re.findall(title_re,html))
    #text = str(re.findall(text_re,html))
    #textend = title + text
    #textend = textend.replace('<br />','')
    ##print(textend)
    #f = open("E:\\dssytest.txt","w")                                           
    #f.write(textend)
    #f.close()
    #print(title + '保存完毕')
    #response = request.urlopen("https://www.7kshu.com/41/41319/" + m +".html")

    #变量循环运行
    #打开文本,如果没有则创建
#    f = open("E:\\dssy.txt","w") 
#    #设定地址变量
#    for m in range(12622130 , 23269694):
#        #设定下载地址
#        url = 'https://www.7kshu.com/41/41319/' + str(m) + '.html'
#        #response = request.urlopen("https://www.7kshu.com/41/41319/" + str(m) +".html")
#        #打开地址
#        response = request.urlopen(url)
#        #加载地址
#        html = response.read()
#        #编码格式转换
#        html = html.decode("gbk")
#        #正则检索标题
#        title_re = re.compile(r'<h1>(.*?)</h1>')
#        #正则检索正文
#        text_re = re.compile(r'<br /><br />([\s\S]*?)</div>')
#        #对标题进行匹配
#        title = str(re.findall(title_re,html))
#        #对正文进行匹配
#        text = str(re.findall(text_re,html))
#        #拼接正文和标题
#        textend = title +"\n"+ text
#        #将正文中的回车符等符号进行修正替换
#        textend = textend.replace('<br />',"\n")
#        textend = textend.replace("['",'')
#        textend = textend.replace("']",'')
#        #print(textend)
#        #f = open("E:\\dssy.txt","w")                                          
#        #写入文件
#        f.write("\n" + textend)
#        #f.close()
#        #print(url)
#        print(title + '保存完毕')
#f.close()
#print('下载完成')
#    #print(html)



#函数实现
def download(url):
    response = request.urlopen(url)
    #加载地址
    html = response.read()
    #编码格式转换
    html = html.decode("gbk")
    #正则检索标题
    title_re = re.compile(r'<h1>(.*?)</h1>')
    #正则检索正文
    text_re = re.compile(r'<br /><br />([\s\S]*?)</div>')
    #对下一章序号进行检索
    p1 = (r"<a\s[^>]*id=[\"\"]nextpage[\"\"][^>]*>")
    pattern1 = re.compile(p1)
    matcher1 = re.search(pattern1,html)
    #print(matcher1.group())
    p2 = (r"(?<=(href=\")).+?(?=(\.html))")
    pattern2 = re.compile(p2)
    matcher2 = re.search(pattern2,matcher1.group())
    title_next = str(matcher2.group())
    #print(title_next)
    #对标题进行匹配
    title = str(re.findall(title_re,html))
    #对正文进行匹配
    text = str(re.findall(text_re,html))
    #拼接正文和标题
    textend = text
    #将正文中的回车符等符号进行修正替换
    textend = textend.replace('<br />',"\n")
    textend = textend.replace("['",'')
    textend = textend.replace("']",'')
    #print(title,'下载完成')
    #print(title_next)
    #返回处理过的正文和下一章地址代码
    return textend,title_next,title

def save_txt(x):
    if x != '':
        #f.write("\n")
        f.write("\n" + x)
    else:
       print('保存错误,当前'+ download(url)[2])
    return  
#测试用常量
#url = 'https://www.7kshu.com/41/41319/12622232.html'
#download(url)
#byte = download(url)
#print('下一章',download(url)[1])
if __name__ == "__main__":
    #定义初始值
    m = '12623030'
    #数据爬取地址初始值
    url = 'https://www.7kshu.com/41/41319/' + str(m) + '.html'
    #打开保存文本
    f = open("E:\\dssy.txt","w")
    #初始下载
    download(url)
    #定义下载返回数组
    result1 = download(url)
    #定义初始下载正文变量
    x = result1[0]
    #初始正文保存
    save_txt(x)
    print(result1[2],'保存完成')
    #定义下一章初始值
    m = str(result1[1])
    #开始循环调用
    while m != 'index':
        #m = str(result1[1])
        #下一章下载地址
        url2 = 'https://www.7kshu.com/41/41319/' + str(m) + '.html'
        #开始下载下一章
        download(url2)
        #对下载函数的返回赋值给result2
        result2 = download(url2)
        x = result2[0]
        #保存下一章
        save_txt(x)
        print(result2[2],'保存完成')
        #M值为下一章页码
        m = str(result2[1])
    f.close()
print('下载完成')

四、代码说明:

上面代码内容都是常规性函数和方法,较为简单,结构相对清晰,唯一的问题就是正则表达式,这块笔者也是初学者,各位读者还需要自行去掌握相关内容,最简单的方法就是对照正则表达式字典逐个字符去看,这样能快速理解代码含义

上述代码总共分三部分内容,各部分可独立运行,取消掉注释即可,第一部分为单页面功能及网络测试代码,第二部分为普通循环爬取功能代码,第三部分为函数体运行代码
目前这个程序存在几点问题:
1.程序没有增加网络出现故障或者中断情况下的处理,一旦网络出现问题程序就直接崩溃退出
2.程序总体效率不高,原因主要是单线程,单模块运行模式,这块缺陷后期有时间了再进行优化

本内容为原创内容,严禁转载,且不接受任何形式的修改

猜你喜欢

转载自blog.csdn.net/weixin_42844694/article/details/81326140