Python用面向物件的方式爬取小說
阿新 • • 發佈:2018-12-01
這裡以爬取小說《夢裡花落知多少為例》
昨天幫同學爬的一部小說,現在把程式碼放在部落格上希望也能幫到其他人
# -*- coding:utf-8 -*- # @time: 2018/11/25 22:28 # @Author: cen import requests, re from bs4 import BeautifulSoup class NovelSpider: '''這是個爬取夢裡花落知多少小說的類''' def __init__(self): self.index_url = 'http://www.xiaoshuo77.com/view/38/38672/' # 小說主頁 # 請求頭,模擬瀏覽器登陸網站 self.headers = { 'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36' } def GetUrlList(self, html): '''這是一個構造url列表的函式''' # 小說主頁裡每個章節對應著每節的url,把這些章節的url存放到一個列表中 reg = '<dd><a href="(.*?)">(.*?)</a></dd>' hrefs = re.findall(reg, html) # 用正則表示式匹配小說每節的標題和url, url_list = [] # 先建立一個空列表 for href in hrefs: url_list.append(href) # 利用for迴圈把每節標題和url依次存放在列表中 return url_list # 函式最後返回一個url列表 def GetHtml(self, url): '''這是一個獲取url的html頁面內容的函式''' # 這裡直接返回html頁面內容,網頁的編碼格式是gbk,所以我們解碼也應使用gbk return requests.get(url, headers=self.headers).content.decode('gbk') # 主函式 def main(self): html = self.GetHtml(self.index_url) # 呼叫GetHtml函式並賦給變數html,從而獲取小說主頁頁面內容 url_list = self.GetUrlList(html) # 將頁面內容html傳給函式GetUrlList,函式執行即生成的url列表存放在url_list這個變數中 # 因為url_list中每個元素是一個元祖,像這樣('/view/38/38672/10577600.html', '文學小青年') for url in url_list: # 用for迴圈遍歷列表,得到一個個元組 title = url[1] # 標題在元組第二個位置,url在第一個位置 # 因為得到的url並不是完整的,所以我們要拼接成完整的url full_url = "http://www.xiaoshuo77.com" + url[0] # print(title, full_url) # 這裡是列印一下標題和url,看下效果 novel_html = self.GetHtml(full_url) # 這裡是獲取小說的章節頁面內容 soup = BeautifulSoup(novel_html, 'html.parser') # 用BeautifulSoup解析頁面 content = soup.find(id='content').getText() # 找到小說內容位置,獲取小說文字 # 儲存 print('正在儲存...%s' % title) with open('《夢裡花落知多少》全集.doc', 'a', encoding='utf-8') as f: f.write(title + content + '\n\n') if __name__ == '__main__': novel_spider = NovelSpider() # 例項化類為一個物件 novel_spider.main() # 執行主函式