鱼C论坛

 找回密码
 立即注册
查看: 866|回复: 8

爬小说时遇到问题求助

[复制链接]
发表于 2018-10-20 12:01:18 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 罗同学 于 2018-10-20 12:03 编辑

最近在图书馆看了马伯庸的四海鲸骑、图书馆只有第一部、第二部网上找不到资源、在线能看的网站也只有这一个、就写了个爬虫爬下来、但是发现有的章节能爬到全文、有的章节只能爬一部分内容,看网站的代码都是一样的、在下愚钝没有发现问题所在,请各位大神帮忙。另外每一章正文前面还会有一些别的字也没有找到去掉的办法。。。
请运行前在同目录下创建“四海鲸骑”文件夹。为了方便各位大神测试。代码已经修改成不用输入任何参数,运行即可下载前三章,第二章就会出现少内容的问题。而且每次出现问题的章节都是固定的、请各位大神看看

小说连接:http://www.jjwxc.net/onebook.php?novelid=2872142

代码如下:

  1. import requests
  2. from bs4 import BeautifulSoup as bs
  3. import lxml
  4. import os, time


  5. def open_url(url):
  6.     headers = {
  7.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'}
  8.     res = requests.get(url, headers=headers)
  9.     # with open('res.txt','w',encoding='utf-8') as f :
  10.     #     f.write(res)
  11.     return res


  12. def get_txt(number, begin):
  13.     i = 1
  14.     for page in range(111, 114):  #小说第二部代码的连接编码从111开始,到175,本段代码只下载前三章,第二章就会出现问题
  15.         url = 'http://www.jjwxc.net/onebook.php?novelid=2872142&chapterid=%d' % page
  16.         print(url)
  17.         res = open_url(url)
  18.         soup = bs(res.content, 'lxml')
  19.         #title = soup.find(align="center").get_text()
  20.         #print(title)
  21.         text = soup.find('div',class_="noveltext").get_text('\n')
  22.         

  23.         file = open('第%03d章.txt' % i, 'w', encoding='utf-8')
  24.         #file.write(title + '\n')
  25.         file.write(text)
  26.         file.close()
  27.         time.sleep(3)
  28.         i += 1


  29. if __name__ == '__main__':
  30.     os.chdir('四海鲸骑')
  31.     i = 1
  32.     begin = 111
  33.     get_txt(i, begin)
复制代码


每章前面出现的乱码如下图:不知道是不是取的标签有问题,也一并求教
QQ截图20181020120212.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-10-20 12:10:57 From FishC Mobile | 显示全部楼层
你用bs4的strings方法啊,不要用find就好了,现在在外面,回来再看一下吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-20 12:12:20 From FishC Mobile | 显示全部楼层
你可以看一下我倒数第二篇帖子,gitbook 上有教你怎么用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-20 13:17:24 | 显示全部楼层
get_txt函数改为
  1. def get_content(url,req_start,req_end,items):
  2.     response = get_response(url)

  3.     # 把获取到的文本信息用html的解析器解析
  4.     soup = bs(response.text, 'html.parser')
  5.     # 通过传入的解析式解析小说正文,这里的写法最好用肉眼观察
  6.     # 这里有两个解析式,是因为获取一大段内容需要 开始 和 结束 标记

  7.     content = soup.find(req_start,class_=req_end).strings
  8.     # 把书名、章节名、小说正文内容传入writeFile函数进行保存
  9.     with open(book_name + '.txt','a',encoding='utf-8')as txt_file:
  10.         #设置文件编码,避免写入时乱码
  11.         # 每一次写入章节名时进行换行
  12.         txt_file.write('\n'+title+'\n')
  13.         for line in content:
  14.             #content是一个生成器,采用for循环逐次写入文件
  15.             txt_file.write(line)
  16.     print(f'{ title } 写入到{ book_name }.txt 完成')      
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-20 13:19:47 | 显示全部楼层
主要是解析哪里,  
在解析正文时采取'html.parser'而不是lxml
我看了一下这个小说网站,你说的格式采取列表的形式索引的方式解决一下就好了。  
以第一个章节为例:
前4个内容不要,取后面的即可
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-20 13:41:39 | 显示全部楼层
wongyusing 发表于 2018-10-20 13:19
主要是解析哪里,  
在解析正文时采取'html.parser'而不是lxml
我看了一下这个小说网站,你说的格式采取 ...

刚试了一下、html.parser解析出来的都是乱码了。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-20 14:02:49 | 显示全部楼层
wongyusing 发表于 2018-10-20 12:12
你可以看一下我倒数第二篇帖子,gitbook 上有教你怎么用

看了您的帖子、看懂了、也改用了strings的方法、但是还是第二章会缺失一部分内容的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-20 14:32:05 | 显示全部楼层
罗同学 发表于 2018-10-20 13:41
刚试了一下、html.parser解析出来的都是乱码了。。。

这个网站是gbk编码,用bs4会缺斤短两。  
pq解析吧。解析式是一样的。  
语法上稍微不同
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-20 19:17:12 | 显示全部楼层
wongyusing 发表于 2018-10-20 14:32
这个网站是gbk编码,用bs4会缺斤短两。  
用pq解析吧。解析式是一样的。  
语法上稍微不同

虽然不知道pq是什么、bs也没有用明白、但还是谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-23 03:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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