鱼C论坛

 找回密码
 立即注册
查看: 1725|回复: 10

[已解决]关于Python爬虫保存全本小说的问题

[复制链接]
发表于 2017-11-7 13:14:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import urllib.request
  2. import os
  3. import re

  4. def url_open(url):#网页打开函数,以防被禁
  5.     req = urllib.request.Request(url)
  6.     req.add_header('User-Agent',"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36")
  7.     response = urllib.request.urlopen(url)
  8.     html = response.read()

  9.     return html

  10. def get_url(url):#获得章节数
  11.     html = url_open(url).decode('gbk')

  12.     reg = r'<a href="/cang/(.*?).html">.*?</a>'
  13.     html = re.findall(reg, html)

  14.     return html




  15. def txt_book(chapter):#正文函数
  16.     html = url_open(chapter).decode('gbk')
  17.     reg = r'<div class="nr_con">(.*?)<div class="syz">'
  18.     txtbook = re.findall(reg, html, re.S)
  19.     print(txtbook)
  20.     return txtbook

  21. def save_book(folder,getbook):#保存正文函数
  22.     os.mknod("cang.txt")
  23.     file = open("cang.txt", 'w')
  24.     file.writelines(getbook)#个人感觉这里应该是少了个参数,但找不到该用什么来保存全本小说。
  25.     file.close()
  26. def down_txt(folder='txtbook',page=1):#这是主函数
  27.     os.mkdir(folder)
  28.     os.chdir(folder)
  29.     url = 'http://www.gulongwang.com/cang/'
  30.     txt_num = get_url(url)#获得章节数
  31.     i=0
  32.     while True:
  33.         i += 1
  34.         if i>int(len(txt_num)):#如果i小于章节长度,则继续运行
  35.             for a in txt_num:

  36.                 print(a)


  37.                 chapter = url + a +'.html'#拼接小说正文url

  38.                 print(chapter)#打印小说url,测试程序
  39.                 getbook = txt_book(chapter)
  40.                 save_book(folder, getbook)
  41.         else:
  42.             break



  43. if __name__ == "__main__":
  44.     down_txt()

复制代码


0. 程序运行后保存的小说只有第一章,我想打印全本小说到一个txt文件中,该如何解决?个人感觉是在save_book(folder,getbook):#保存正文函数,这里出问题了,但没有思路了,求各位大神提点一下需要修改的地方。谢谢
最佳答案
2017-11-7 15:33:21
wongyusing 发表于 2017-11-7 15:03
其实我一开始的初衷是写一个爬取整个网站的爬虫,想着可以首页加书名的标签,然后加上小说的页码,拼接成 ...

哈哈 怎么样 我的头像是不是很帅 哈哈

我用的bs4这个包 专门解析html xml的模块

呃,也没法说太多

推荐你学习一下BeautifulSoup,真的很爽

建议先撸一遍BeautifulSoup的文档

还有,老哥,给我设置最佳吧,设置完就成已经解决了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-11-7 13:53:56 | 显示全部楼层





  1. import urllib.request
  2. import os
  3. import re

  4. def url_open(url):#网页打开函数,以防被禁
  5.     req = urllib.request.Request(url)
  6.     req.add_header('User-Agent',"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36")
  7.     response = urllib.request.urlopen(url)
  8.     html = response.read()

  9.     return html

  10. def get_url(url):#获得章节数
  11.     html = url_open(url).decode('gbk')

  12.     reg = r'<a href="/cang/(.*?).html">.*?</a>'
  13.     html = re.findall(reg, html)

  14.     return html




  15. def txt_book(chapter):#正文函数
  16.     html = url_open(chapter).decode('gbk')
  17.     reg = r'<div class="nr_con">(.*?)<div class="syz">'
  18.     txtbook = re.findall(reg, html, re.S)
  19.     print(txtbook)
  20.     return txtbook

  21. def save_book(folder,getbook):#保存正文函数

  22.     file = open("cang.txt", 'a')

  23.     file.writelines(getbook)#个人感觉这里应该是少了个参数,但找不到该用什么来保存全本小说。
  24.     file.close()
  25. def down_txt(folder='txtbook',page=1):#这是主函数
  26.     os.mkdir(folder)
  27.     os.chdir(folder)
  28.     os.mknod("cang.txt")
  29.     url = 'http://www.gulongwang.com/cang/'
  30.     txt_num = get_url(url)#获得章节数
  31.     i=0
  32.     while True:
  33.         i += 1
  34.         if i>int(len(txt_num)):#如果i小于章节长度,则继续运行
  35.             for a in txt_num:

  36.                 print(a)


  37.                 chapter = url + a +'.html'#拼接小说正文url

  38.                 print(chapter)#打印小说url,测试程序
  39.                 getbook = txt_book(chapter)
  40.                 save_book(folder, getbook)





  41. if __name__ == "__main__":
  42.     down_txt()

复制代码

其实改变一下创建txt文件的位置和把保存文本的方法‘a’就好了。
现在要解决运行后停不下来的问题了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-7 14:20:44 | 显示全部楼层
  1. import urllib.request
  2. import os
  3. import re

  4. def url_open(url):#网页打开函数,以防被禁
  5.     req = urllib.request.Request(url)
  6.     req.add_header('User-Agent',"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36")
  7.     response = urllib.request.urlopen(url)
  8.     html = response.read()

  9.     return html

  10. def get_url(url):#获得章节数
  11.     html = url_open(url).decode('gbk')

  12.     reg = r'<a href="/cang/(.*?).html">.*?</a>'
  13.     html = re.findall(reg, html)

  14.     return html




  15. def txt_book(chapter):#正文函数
  16.     html = url_open(chapter).decode('gbk')
  17.     reg = r'<div class="nr_con">(.*?)<div class="syz">'
  18.     txtbook = re.findall(reg, html, re.S)
  19.     print(txtbook)
  20.     return txtbook

  21. def save_book(folder,getbook):#保存正文函数

  22.     file = open("cang.txt", 'a')

  23.     file.writelines(getbook)#个人感觉这里应该是少了个参数,但找不到该用什么来保存全本小说。
  24.     file.close()
  25. def down_txt(folder='txtbook',page=1):#这是主函数
  26.     os.mkdir(folder)
  27.     os.chdir(folder)
  28.     os.mknod("cang.txt")
  29.     url = 'http://www.gulongwang.com/cang/'
  30.     txt_num = get_url(url)#获得章节数
  31.     url_num =int(len(txt_num))
  32.     i=0
  33.     print(url_num)
  34.     while i!=url_num:


  35.         for a in txt_num:

  36.             print(a)


  37.             chapter = url + a +'.html'#拼接小说正文url

  38.             print(chapter)#打印小说url,测试程序
  39.             getbook = txt_book(chapter)
  40.             save_book(folder, getbook)
  41.             i += 1

复制代码

成功了,虽然保存下来的小说带有<p>之类的字符,但仍然很开心,毕竟是自己写出来的第一天爬虫,感谢TVB,感谢鱼C工作室,感谢小甲鱼。
现在就去市场买只甲鱼煲汤去
最后一个问题,怎么把帖子弄成已解决啊???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 14:38:00 | 显示全部楼层
  1. import urllib.request
  2. import os
  3. import re

  4. def url_open(url):#网页打开函数,以防被禁
  5.     req = urllib.request.Request(url)
  6.     req.add_header('User-Agent',"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36")
  7.     response = urllib.request.urlopen(url)
  8.     html = response.read()

  9.     return html

  10. def get_url(url):#获得章节数
  11.     html = url_open(url).decode('gbk')

  12.     reg = r'<a href="/cang/(.*?).html">.*?</a>'
  13.     html = re.findall(reg, html)

  14.     return html




  15. def txt_book(chapter):#正文函数
  16.     html = url_open(chapter).decode('gbk')
  17.     reg = r'<div class="nr_con">(.*?)<div class="syz">'
  18.     txtbook = re.findall(reg, html, re.S)
  19.     print(txtbook)
  20.     return txtbook

  21. def save_book(folder,getbook):#保存正文函数

  22.     file = open("cang.txt", 'a')

  23.     file.writelines(getbook)#个人感觉这里应该是少了个参数,但找不到该用什么来保存全本小说。
  24.     file.close()
  25. def down_txt(folder='txtbook',page=1):#这是主函数
  26.     os.mkdir(folder)
  27.     os.chdir(folder)
  28.     os.mknod("cang.txt")
  29.     url = 'http://www.gulongwang.com/cang/'
  30.     txt_num = get_url(url)#获得章节数
  31.     i=0
  32.     while True:
  33.         i += 1
  34.         if i>int(len(txt_num)):#如果i小于章节长度,则继续运行
  35.             for a in txt_num:

  36.                 print(a)


  37.                 chapter = url + a +'.html'#拼接小说正文url

  38.                 print(chapter)#打印小说url,测试程序
  39.                 getbook = txt_book(chapter)
  40.                 save_book(folder, getbook)





  41. if __name__ == "__main__":
  42.     down_txt()

复制代码


你提出的问题是因为,画蛇添足,滥用循环造成的
会重复13次全文写入

还有因为是linux下,所以累死我了

还有你的代码实在是。。。。惨不忍睹

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 14:40:10 | 显示全部楼层
分享一下我刚才写的
你的代码,会保留部分标签,并没有提取出来真实的string

  1. import requests,os
  2. from bs4 import BeautifulSoup as Soup

  3. def getUrl(page):
  4.     url = 'http://www.gulongwang.com/cang/'
  5.     return url+str(page)+'.html'

  6. def getResponse(url):
  7.     headers = {'User-Agent':"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36"}
  8.     response = requests.get(url,headers=headers)
  9.     response.encoding = 'gb2312'
  10.     #采用网站设置的编码,避免读取时乱码
  11.     return response.text

  12. def getContent(html):
  13.     soup = Soup(html,'html.parser')
  14.     title = soup.find('h1',class_='mulu').contents[-1].string
  15.     content = soup.find('div',class_='nr_con').strings
  16.     #strings属性返回div标签下所有子标签的string
  17.     #content是一个生成器
  18.     return title,content

  19. def writeFile(title,content):
  20.     with open('苍穹神剑.txt','a',encoding='utf-8')as cang_file:
  21.         #设置文件编码,避免写入时乱码
  22.         cang_file.write('\n'+title+'\n')
  23.         for line in content:
  24.             #content是一个生成器,采用for循环逐次写入文件
  25.             cang_file.write(line)
  26.     print('%s was writed ..'%title)

  27. def main():
  28.     ##经过观察,所有的章节是1.html-13.html,所以不需要画蛇添足进行匹配
  29.     for page in range(1,14):
  30.         url = getUrl(page)
  31.         html = getResponse(url)
  32.         title,content = getContent(html)
  33.         writeFile(title,content)

  34. if __name__=='__main__':
  35.     main()
复制代码


TIM截图20171107141907.png

TIM截图20171107141921.png

爬取之前,好好观察规律,那样会省去很多不必要的过程,还有re太重,没必要的时候就别用了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 14:40:49 | 显示全部楼层
Teagle 发表于 2017-11-7 14:40
分享一下我刚才写的
你的代码,会保留部分标签,并没有提取出来真实的string

我是在win下写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 14:55:15 | 显示全部楼层
  1. import requests as req

  2. url = 'http://www.gulongwang.com/cang/'

  3. for i in range(1, 14):
  4.     filename = '%d.html'%i
  5.     rsp = req.get(url+'/'+filename)
  6.     if rsp.status_code==200:
  7.         with open(filename, 'wb')as w:
  8.             sz = w.write(rsp.content)
  9.             print('已下载[%s],%d 字节。'%(filename,sz))
  10.     else:
  11.         print(i,rsp.status_code)
复制代码

  1. 已下载[1.html],39147 字节。
  2. 已下载[2.html],37275 字节。
  3. 已下载[3.html],42573 字节。
  4. 已下载[4.html],31281 字节。
  5. 已下载[5.html],58785 字节。
  6. 已下载[6.html],50375 字节。
  7. 已下载[7.html],45613 字节。
  8. 已下载[8.html],37783 字节。
  9. 已下载[9.html],50279 字节。
  10. 已下载[10.html],35622 字节。
  11. 已下载[11.html],46428 字节。
  12. 已下载[12.html],51919 字节。
  13. 已下载[13.html],50163 字节。
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-7 15:03:52 | 显示全部楼层
Teagle 发表于 2017-11-7 14:40
我是在win下写的

其实我一开始的初衷是写一个爬取整个网站的爬虫,想着可以首页加书名的标签,然后加上小说的页码,拼接成一个url,然后获取正文,保存。
新人上路,心太大,所以才会用那么多正则啊。
然后发现心太大,会导致一事无成的,所以就改变思路,先爬一本小说来练手啊。
求轻打,新人的第一个作品
对了,怎么去除正文中那些<p>之类的便签啊??我看了你的代码,找不到你去除便签的代码?
最后一句,你的头像搞到我要拿本书来挡住。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-7 15:09:16 | 显示全部楼层

我是想把所有正文保存到一个txt文件中啊,姐姐
不是下载网页
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 15:33:21 From FishC Mobile | 显示全部楼层    本楼为最佳答案   
wongyusing 发表于 2017-11-7 15:03
其实我一开始的初衷是写一个爬取整个网站的爬虫,想着可以首页加书名的标签,然后加上小说的页码,拼接成 ...

哈哈 怎么样 我的头像是不是很帅 哈哈

我用的bs4这个包 专门解析html xml的模块

呃,也没法说太多

推荐你学习一下BeautifulSoup,真的很爽

建议先撸一遍BeautifulSoup的文档

还有,老哥,给我设置最佳吧,设置完就成已经解决了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-7 17:42:09 | 显示全部楼层
wongyusing 发表于 2017-11-7 15:09
我是想把所有正文保存到一个txt文件中啊,姐姐
不是下载网页
  1. import requests as req
  2. import html
  3. import re

  4. ptn_lb = re.compile(br'<div class="lb">.*?</ul>',re.DOTALL)
  5. ptn_ml = re.compile(r'<a href="/\w+/(\d+).html">([^<]+)</a>')
  6. ptn_nr = re.compile(br'<div class="nr_con">(.*?)</div>',re.DOTALL)
  7. ptn_p  = re.compile(br'</?p>')
  8.                     
  9. url = 'http://www.gulongwang.com/cang/'
  10. rsp = req.get(url)
  11. ml = ptn_ml.findall(ptn_lb.findall(rsp.content)[0].decode('gbk'))
  12. for i,filename in ml:
  13.     rsp = req.get(url+i+'.html')
  14.     if rsp.status_code==200:
  15.         nr = ptn_nr.findall(rsp.content)
  16.         nr = ptn_p.sub(b'',nr[0]).decode('gbk')
  17.         nr = html.unescape(nr)
  18.         with open(filename+'.txt', 'w')as w:
  19.             sz = w.write(nr)
  20.             print('已下载[%s],%d 字。'%(filename,sz))
  21.     else:
  22.         print('失败:', i, filename, rsp.status_code)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-3 19:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表