python爬取小说内容_python爬取小说详解(一)

整理思路:

首先观察我们要爬取的页面信息。如下:

1401386-20180531092935114-1604265452.png

1401386-20180531093059504-349518844.png

1401386-20180531094332675-522391543.png

自此我们获得信息有如下:

♦1.小说名称链接小说内容的一个url,url的形式是:http://www.365haoshu.com/Book/Chapter/ +href="detail.aspx?NovelId=3026&s=1527731727&t=DgV6NiFxdi8bOQ40DikZJQ0HCnYMBwZyDikgcA45BnAOKSB.&r=4298" #其中:&r=4298这个变化对小说章节顺序没有发生变化,你可以在后面改一下试一下

♦2.小说的链接和小说名称都在同一个标签下面。

至此我有了简单的思路了:

根据以上条件特点我有了一个总体思路,我分别用两个列表一个存放小说名字,一个存放列链接,然后然依次同时取出小说名字对应链接然后写在一个文件里面。

♦1.根据难度性,我们先把所有的这个HTML内容响应出来放到一个类集合里面

♦2.再根据这个集合在检索小说名字和链接所在所在的tag行,形成一个新的集合

♦3.然后再在这个集合里面检索小说名称和小说链接,再形成一个新的类集合

♦4.在检索的同时就把这些检索出来的东西分别存放在两个字符串里面

♦5,按照顺序依次遍历出来并把对应小说的内用写在text文件里面

我们需要用到的库:

♦from bs4 import BeautifulSoup

♦import requests

小说章节链接:

♦http://www.365haoshu.com/Book/Chapter/List.aspx?NovelId=6686

♦小说名称:为你倾心,为我倾城

接下来开始代码部分:

from bs4 import BeautifulSoup#导入BeautifulSoup这个模块爬虫中很关键在第二篇中讲

importrequests#我们大概分三个步骤#1.获取章节和章节对应的链接信息#2.获取对应章节的内容#3.把章节名字已经对应章节的内容写进text文件里面

classspiderstory(object):def __init__(self):

self.url= 'http://www.365haoshu.com/Book/Chapter/'self.names= []#存放章节名称

self.hrefs = []#存放章节链接

defget_urlandname(self):

response= requests.get(url=self.url + 'List.aspx?NovelId=6686')#回去章节目录类型为

req_parser = BeautifulSoup(response.text,"html.parser")#req后面跟text和html都行,固定写法,BeautifulSoup默认支持Python的标准HTML解析库数据类型:

#print(req_parser)

#print(type(req_parser))

div = req_parser.find_all('div',class_='user-catalog-ul-li')#查找内容,标签为div,属性为class='user-catalog-ul-li',这里 是找到名字和链接所在的标签,数据类型:

#print(div)

#print(type(div))

a_bf = BeautifulSoup(str(div))#进行进一步的字符解析因为获取要素类型的值时必须进行这一步

#print(type(a_bf))#

#print(len(a_bf))#1

a = a_bf.find_all('a') ## 查找内容,标签为a#下面需要获取a标签下的href,所以这里首先要精确到a标签下。才能从a标签下获取属性的值

#print(len(a))

#print(a)

for i in a:#注意class类型和列表等一样也是一个一个元素的,所以他可以用for遍历,你可以用len查看一下

#print(i.find('span',class_='fl').string)#查找所有span和属性class='fi'的字符类型的内容,注意因为class和类一样了所写成class_

#print(i)

#print(i['href'])

#print(type(i))

#print(len(i))

#print(i.find('span',class_='fl'))

self.names.append(i.find('span',class_='fl').string)#str只获取指定的文本类型

#print(i.get('href'))#获取有两种方法:1.i.get('href' 2.i['href']

self.hrefs.append(self.url + i['href'])#注意如果TypeError: must be str, not NoneType,所以这里追加到字符串里面必须以字符的形式加

print(self.names)print(self.hrefs)defget_text(self,url):#print(self.hrefs[0])

respons2 =requests.get(url=url)#print(respons2)

c = BeautifulSoup(str(respons2.text),'html.parser')#print(c)

b = c.find_all('p', class_='p-content')

text=[]for temp in b:#获取标签里面的文本只能进行遍历每个满足条件的文本才能获取

text.append(temp.string)#b.string#获取解析后的文本,获取所有的文本类型

print(text)returntextdefwriter(self,name,path,text1):'''写入TXT文档'''with open(path,'a',encoding='utf-8') as f:

f.write(name+ '\n')#写入名字并换行

f.writelines(text1)#追加内容

f.write('\n\n')#换两行

if __name__ == "__main__": #运行入口

a=spiderstory()

a.get_urlandname()#a.get_text()

for i inrange(len(a.names)):

name=a.names[i]

text= str(a.get_text(a.hrefs[i]))#注意TypeError: write() argument must be str, not None,写入文档必须是字符串

a.writer(name,'F:\小说.txt',text)print(a)

以上是我写的整体代码以及一些调试的方法:

代码整理如下:

from bs4 importBeautifulSoupimportrequestsclassspiderstory(object):def __init__(self):

self.url= 'http://www.365haoshu.com/Book/Chapter/'self.names= []#存放章节名称

self.hrefs = []#存放章节链接

defget_urlandname(self):'''获取章节名称和和章节URL'''response= requests.get(url=self.url + 'List.aspx?NovelId=6686')

req_parser= BeautifulSoup(response.text,"html.parser")

div= req_parser.find_all('div',class_='user-catalog-ul-li')

a_bf=BeautifulSoup(str(div))

a= a_bf.find_all('a')for i ina:

self.names.append(i.find('span',class_='fl').string)

self.hrefs.append(self.url+ i['href'])defget_text(self,url):'''获取对应章节内容'''respons2=requests.get(url=url)

c= BeautifulSoup(str(respons2.text),'html.parser')

b= c.find_all('p', class_='p-content')

text=[]for temp inb:

text.append(temp.string)returntextdefwriter(self,name,path,text1):'''写入TXT文档'''with open(path,'a',encoding='utf-8') as f:

f.write(name+ '\n')

f.writelines(text1)

f.write('\n\n')if __name__ == "__main__": #运行入口

a=spiderstory()

a.get_urlandname()for i inrange(len(a.names)):

name=a.names[i]

text=str(a.get_text(a.hrefs[i]))

a.writer(name,'F:\小说.txt',text)print(a)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值