整理思路:

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

 

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

  ♦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内容响应出来放到一个类集合里面<class \’bs4.BeautifulSoup\’>

  ♦2.再根据这个集合在检索小说名字和链接所在所在的tag行,形成一个新的集合<class \’bs4.element.ResultSet\’>

  ♦3.然后再在这个集合里面检索小说名称和小说链接,再形成一个新的类集合<class \’bs4.element.Tag\’>

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

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

我们需要用到的库:

  ♦from bs4 import BeautifulSoup 

       ♦import requests

小说章节链接:

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

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

接下来开始代码部分:

from bs4 import BeautifulSoup#导入BeautifulSoup这个模块爬虫中很关键在第二篇中讲
import requests
#我们大概分三个步骤
#1.获取章节和章节对应的链接信息
#2.获取对应章节的内容
#3.把章节名字已经对应章节的内容写进text文件里面
class spiderstory(object):

    def __init__(self):
        self.url = \'http://www.365haoshu.com/Book/Chapter/\'
        self.names = []#存放章节名称
        self.hrefs = []#存放章节链接
    def get_urlandname(self):
        response = requests.get(url=self.url + \'List.aspx?NovelId=6686 \')#回去章节目录类型为<class \'requests.models.Response\'>
        req_parser = BeautifulSoup(response.text,"html.parser")
        # req后面跟text和html都行,固定写法,BeautifulSoup默认支持Python的标准HTML解析库数据类型:<class \'bs4.BeautifulSoup\'>
        # print(req_parser)
        # print(type(req_parser))
        div = req_parser.find_all(\'div\',class_=\'user-catalog-ul-li\')
        # 查找内容,标签为div,属性为class=\'user-catalog-ul-li\',这里 是找到名字和链接所在的标签,数据类型:<class \'bs4.element.ResultSet\'>
        # print(div)
        # print(type(div))
        a_bf = BeautifulSoup(str(div))#进行进一步的字符解析因为获取要素类型的值时必须进行这一步
        # print(type(a_bf))#<class \'bs4.BeautifulSoup\'>
        # 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)
    def get_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)
        return text
    def writer(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 in range(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 import BeautifulSoup
import requests
class spiderstory(object):

    def __init__(self):
        self.url = \'http://www.365haoshu.com/Book/Chapter/\'
        self.names = []#存放章节名称
        self.hrefs = []#存放章节链接

def get_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 in a: self.names.append(i.find(\'span\',class_=\'fl\').string) self.hrefs.append(self.url + i[\'href\'])

def get_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 in b: text.append(temp.string) return text

def writer(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 in range(len(a.names)): name = a.names[i] text = str(a.get_text(a.hrefs[i])) a.writer(name,\'F:\小说.txt\',text) print(a)

 

版权声明:本文为insane-Mr-Li原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/insane-Mr-Li/p/9117005.html