python爬取365好書中小說

Tynam.Yang發表於2018-03-27

需要轉載的小夥伴轉載後請註明轉載的地址

 

需要用到的庫

from bs4 import BeautifulSoup

import requests

import time

 

365好書連結:http://www.365haoshu.com/   爬取《我以月夜寄相思小說

首頁進入到目錄:http://www.365haoshu.com/Book/Chapter/List.aspx?NovelId=3026

獲取小說的每個章節的名稱和章節連結

  開啟瀏覽器的開發者工具,查詢一個章節:如下圖,找到第一章的名稱和href(也就是第一章節內容頁面的連結),開始寫程式碼

  

from bs4 import BeautifulSoup 
import requests
import time
# 分別匯入time、requests、BeautifulSoup庫

url = 'http://www.365haoshu.com/Book/Chapter/'
# 連結地址url,這兒url章節連結沒全寫出來是因為下面獲取章節連結時要用到這些url
req = requests.get(url+'List.aspx?NovelId=0326')
# 開啟章節頁面,
req_bf = BeautifulSoup(req.text,"html.parser")
print(req_bf)
# 將開啟的頁面以text列印出來
div = req_bf.find_all('div',class_='user-catalog-ul-li')
# 分析頁面,所需要的章節名和章節連結是在div標籤,屬性class為user-catalog-ul-li下
# 找到這個下的內容,並列印
s = []
for d in div:
    s.append(d.find('a'))
print(s)
# 獲取div下面的a標籤下的內容
names=[] # 儲存章節名
hrefs=[] # 儲存章節連結
for i in s:
    names.append(i.find('span').string)
    hrefs.append(url + i.get('href'))
# 將所有的章節和章節連結存入的列表中

觀察href後的連結和開啟章節內容頁面的連結是不完全的相同的, 所以要拼接使得瀏覽器能直接開啟章節內容

獲取到連結和章節名後開啟一個章節獲取文字內容;

和獲取章節名方法一致,一步一步查詢到內容的位置

txt = requests.get(hrefs[0])

div_bf = BeautifulSoup(txt.text,'html.parser')
div = div_bf.find_all('div',class_='container user-reading-online pos-rel')
#print(div)
ps = BeautifulSoup(str(div),"html.parser")
p=ps.find_all('p',class_='p-content')
print(p)
txt=[]
for i in p:
    txt.append(i.string+'\n')
print(txt)

獲取單一章節完成

接下來整理程式碼,獲取整個小說的內容,程式碼如下:

# --*-- coding=utf-8 --*--

from bs4 import BeautifulSoup
import requests
import time


class spiderstory(object):

    def __init__(self): # 初始化
        self.url = 'http://www.365haoshu.com/Book/Chapter/'
        self.names = []  # 存放章節名
        self.hrefs = []  # 存放章節連結

    def get_urlAndName(self):
        '''獲取章節名和章節連結'''
        req = requests.get(url=self.url+'List.aspx?NovelId=0326') # 獲取章節目錄頁面
        time.sleep(1) # 等待1秒
        div_bf = BeautifulSoup(req.text,"html.parser") # req後面跟text和html都行
        div = div_bf.find_all('div', class_='user-catalog-ul-li') # 查詢內容,標籤為div,屬性為class='user-catalog-ul-li'
        a_bf = BeautifulSoup(str(div))
        a = a_bf.find_all('a') # # 查詢內容,標籤為a
        for i in a:
            self.names.append(i.find('span').string) # 獲取內容直接string就行
            self.hrefs.append(self.url + i.get('href')) # 獲取連結

    def get_text(self,url):
        '''獲取章節內容'''
        req = requests.get(url=url)
        div_bf = BeautifulSoup(req.text,"html.parser")
        div = div_bf.find_all('div', class_='container user-reading-online pos-rel') # 查詢內容
        ps = BeautifulSoup(str(div), "html.parser")
        p = ps.find_all('p', class_='p-content')
        text = []
        for each in p:
            text.append(each.string)
        print(text)

        return text # 將獲得的內容返回

    def writer(self, name, path, text):
        '''寫入text文件中'''
        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)
            f.write('\n\n')


if __name__ == "__main__": # 執行入口
   s = spiderstory()
   s.get_urlAndName()
   le = len(s.names)
   for i in range(le): # 利用for迴圈獲得所有的內容
       name = s.names[i]
       text = str(s.get_text(s.hrefs[i]))
       s.writer(name,"我以月夜寄相思.txt",text)
   print('下載完畢!!!')

 

相關文章