这里以爬取小说《梦里花落知多少为例》
昨天帮同学爬的一部小说,现在把代码放在博客上希望也能帮到其他人
# -*- 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() # 执行主函数