鱼C论坛

 找回密码
 立即注册
查看: 2268|回复: 2

[已解决]关于网络爬虫爬取小说保存问题

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

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

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

x
代码如下:
  1. import re,urllib,os,html
  2. import requests as req

  3. def url_open(url):#网页打开函数,以防被禁
  4.     req = urllib.request.Request(url)
  5.     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")
  6.     response = urllib.request.urlopen(url)
  7.     ret = response.read()

  8.     return ret



  9. def get_txt_url(url):#获取小说的url
  10.     ret = url_open(url).decode('gbk')
  11.     reg = r'<li><a href="/(.*?)" title=".*?" target="_top">.*?</a></li>'
  12.     book_url = re.findall(reg, ret,re.S)
  13.     return book_url


  14. def get_txt_book(url_1):#获取正文url后缀
  15.     ret = url_open(url_1).decode('gbk')
  16.     reg = r'<li><a href="/.*?/(.*?)">.*?</a></li>'
  17.     char = re.findall(reg,ret,re.S)
  18.     return char

  19. def get_txt_nr(url_z):
  20.     ret = url_open(url_z).decode('gbk')
  21.     ptn_nr = re.compile(br'<div class="nr_con">(.*?)</div>', re.DOTALL)  # 正文
  22.     ptn_p = re.compile(br'</?p>')  # 正文
  23.     rsp = req.get(url_z)#必须要req.get
  24.     nr = ptn_nr.findall(rsp.content)
  25.     nr = ptn_p.sub(b'', nr[0]).decode('gbk')

  26.     nr = html.unescape(nr)
  27.     return nr

  28. def get_name(url_z):#获取书名
  29.     ret = url_open(url_z).decode('gbk')
  30.     reg = r'<a href="/.*?/">(.*?)</a>'
  31.     bookname = re.findall(reg,ret)
  32.     return bookname
  33. def save_book(folder,txt_nr,txt_name):#保存正文函数,问题主要在这里:让小说内容按书名保存到一个txt文件中,不是分章节保存

  34.     file = open(txt_name + '.txt', 'a')

  35.     file.writelines(txt_nr)
  36.     file.close()

  37. def txt_down(folder='gulongtxt'): #主函数,我电脑已经创建了一个叫'gulongtxt'的文件夹
  38.     os.chdir(folder)#让小说在这个文件夹保存
  39.     url = 'http://www.gulongwang.com/'
  40.     txt_url = get_txt_url(url)#获取小说的url
  41.     for i in txt_url:
  42.         url_1 = url + i#拼接小说的url
  43.         txt_book =get_txt_book(url_1)#获取小说正文url后缀
  44.         #print(txt_book)
  45.         for a in txt_book:
  46.             url_z = url_1 +a#拼接小说正文的url
  47.             txt_nr = get_txt_nr(url_z)#获取小说内容
  48.             txt_name = get_name(url_z)#获取小说书名
  49.             for t in txt_name:
  50.                 txt_save =save_book(folder,txt_nr,txt_name)



  51. if __name__ == "__main__":
  52.     txt_down()


复制代码

这是爬取整个网站小说的爬虫,目的是把这个网站全部小说下载,并按照书名保存成一个txt文件(不是分章节保存).
问题如下:
0. 如何让小说内容按照书名保存成一个txt文件?
1. 自我感觉是因为书名获取函数get_name(url_z)写的太后面了,大神们说是不是?
2. 我的代码是不是很丑?运行界面很难看?求轻拍.

最后感谢@BngThea @SixPy @Teagle  @wyp02033  (排名不分先后)的指导让我写出的第一条爬虫,虽然每次只能爬取一部小说,而且里面还有html的标签但我很高兴能写出来.
最佳答案
2017-11-11 11:49:57
你这里用到了requests类,所以建议全都用requests类来操作即可。
修改后的代码:
  1. import re, os
  2. import requests

  3. def url_open(url):  # 网页打开函数,以防被禁   
  4.     headers = {'User-Agent':"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36"}
  5.     req = requests.get(url, headers=headers)
  6.     req.encoding = 'gbk'
  7.     return req.text

  8. def get_txt_url_name(url):  # 获取小说的url和书名
  9.     ret = url_open(url)
  10.     reg = r'<li><a href="/(.*?)" title="(.*?)" target="_top">.*?</a></li>'
  11.     book_url = re.findall(reg, ret,re.S)
  12.     return book_url

  13. def get_txt_book(url_1):    # 获取正文url后缀
  14.     ret = url_open(url_1)
  15.     reg = r'<li><a href="/.*?/(.*?)">.*?</a></li>'
  16.     char = re.findall(reg,ret,re.S)
  17.     return char

  18. def get_txt_nr(url_z):
  19.     ret = url_open(url_z)
  20.     ptn_nr = re.compile(r'<div class="nr_con">(.*?)</div>', re.DOTALL)  # 正文
  21.     ptn_p = re.compile(r'</?p>')  # 正文   
  22.     nr = ptn_nr.findall(ret)
  23.     nr = ptn_p.sub('', nr[0])
  24.     return nr

  25. def save_book(txt_name, txt_nr):    #   保存正文函数,问题主要在这里:让小说内容按书名保存到一个txt文件中,不是分章节保存
  26.     with open(txt_name + '.txt', 'a') as f:
  27.         f.writelines(txt_nr)


  28. def txt_down(folder='gulongtxt'):   # 主函数,我电脑已经创建了一个叫'gulongtxt'的文件夹
  29.     os.chdir(folder)    # 让小说在这个文件夹保存
  30.     url = 'http://www.gulongwang.com/'
  31.     txt_url_name = get_txt_url_name(url)    # 获取每部小说的url和书名
  32.     for i in txt_url_name:
  33.         url_1 = url + i[0]  # 拼接每部小说的url
  34.         txt_book =get_txt_book(url_1) # 获取每部小说正文url后缀
  35.         for a in txt_book:
  36.             url_z = url_1 + a   # 拼接每部小说每章节正文的url
  37.             txt_nr = get_txt_nr(url_z)  # 获取小说内容            
  38.             txt_save =save_book(i[1], txt_nr)   # 按书名保存内容
  39.    

  40. if __name__ == "__main__":
  41.     txt_down()
  42.    


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-11 08:53:08 | 显示全部楼层
0.没细看
1.函数在调用前定义就可以了
2.能跑能下就行,还要啥自行车
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-11 11:49:57 | 显示全部楼层    本楼为最佳答案   
你这里用到了requests类,所以建议全都用requests类来操作即可。
修改后的代码:
  1. import re, os
  2. import requests

  3. def url_open(url):  # 网页打开函数,以防被禁   
  4.     headers = {'User-Agent':"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36"}
  5.     req = requests.get(url, headers=headers)
  6.     req.encoding = 'gbk'
  7.     return req.text

  8. def get_txt_url_name(url):  # 获取小说的url和书名
  9.     ret = url_open(url)
  10.     reg = r'<li><a href="/(.*?)" title="(.*?)" target="_top">.*?</a></li>'
  11.     book_url = re.findall(reg, ret,re.S)
  12.     return book_url

  13. def get_txt_book(url_1):    # 获取正文url后缀
  14.     ret = url_open(url_1)
  15.     reg = r'<li><a href="/.*?/(.*?)">.*?</a></li>'
  16.     char = re.findall(reg,ret,re.S)
  17.     return char

  18. def get_txt_nr(url_z):
  19.     ret = url_open(url_z)
  20.     ptn_nr = re.compile(r'<div class="nr_con">(.*?)</div>', re.DOTALL)  # 正文
  21.     ptn_p = re.compile(r'</?p>')  # 正文   
  22.     nr = ptn_nr.findall(ret)
  23.     nr = ptn_p.sub('', nr[0])
  24.     return nr

  25. def save_book(txt_name, txt_nr):    #   保存正文函数,问题主要在这里:让小说内容按书名保存到一个txt文件中,不是分章节保存
  26.     with open(txt_name + '.txt', 'a') as f:
  27.         f.writelines(txt_nr)


  28. def txt_down(folder='gulongtxt'):   # 主函数,我电脑已经创建了一个叫'gulongtxt'的文件夹
  29.     os.chdir(folder)    # 让小说在这个文件夹保存
  30.     url = 'http://www.gulongwang.com/'
  31.     txt_url_name = get_txt_url_name(url)    # 获取每部小说的url和书名
  32.     for i in txt_url_name:
  33.         url_1 = url + i[0]  # 拼接每部小说的url
  34.         txt_book =get_txt_book(url_1) # 获取每部小说正文url后缀
  35.         for a in txt_book:
  36.             url_z = url_1 + a   # 拼接每部小说每章节正文的url
  37.             txt_nr = get_txt_nr(url_z)  # 获取小说内容            
  38.             txt_save =save_book(i[1], txt_nr)   # 按书名保存内容
  39.    

  40. if __name__ == "__main__":
  41.     txt_down()
  42.    


复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 02:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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