python爬小说案例
最近小熙在学习python,都说用他写爬虫比较方便。小熙就吸取了下前辈们的经验,尝试了下。
小熙的环境是python3、pycharm、win10
1.导入bs4模块
由于我们使用到了BeautifulSoup,所以需要导入bs4模块
在pycharm的终端输入:
pip3 install Beautifulsoup4
如图:
也可以使用win的命令行输入,注意是管理者
如果没有request的,和上面同理。把命令中的Beautifulsoup4 修改成request就好了。
2.案例
话补多说,直接上代码,小熙已经把每一步都标记好了。
from urllib import request
from bs4 import BeautifulSoup
# 163小说网的爬取免费案例
class BookCrawler():
# url是下载小说的章节目录页地址,down_location是下载到本地保存的地址
def download_book(self, url, down_location):
# 在请求头中添加用户代理
head = {
'User-Agent':'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
}
req = request.Request(url, headers=head)
response = request.urlopen(req)
# 读取到浏览器中对应的html页面
html = response.read()
# 解析html页面(乱码)
soup = BeautifulSoup(html, 'lxml')
# 获取目录内容外一层的div,返回的是list
soup_texts = soup.find('div', id='book_detail', class_='box1').find_next('div')
# 打开文件,保存的本地地址
f = open(down_location, 'w')
# 循环解析链接地址,操作每一个章节下载完全本
for link in soup_texts.ol.children:
# 去除换行
if link != '\n':
# 获取章节列表中的url地址(页面结构不同,获取操作不同)
download_url = link.a.get('href')
# 发出跳转到对应章节的url地址请求
download_req = request.Request(download_url, headers=head)
# 获取响应内容
download_response = request.urlopen(download_req)
# 根据章节url地址获取到对应章节的页面
download_html = download_response.read()
# 解析html页面(乱码)
download_soup = BeautifulSoup(download_html, 'lxml')
# 去除js广告
[s.extract() for s in download_soup('script')]
# 根据页面结构获取内容文本外的div
download_soup_texts = download_soup.find('div', id='content')
# 根据获取的div抓取其中的小说文本
download_soup_texts = download_soup_texts.text
# print(download_soup_texts)
# 写入章节标题
f.write(link.text + '\n\n')
print("已下载:"+link.text)
# 写入章节内容
f.write(download_soup_texts)
f.write('\n\n')
# 最后一步关流,不要忘了
f.close()
if __name__ == '__main__':
bc = BookCrawler()
# 输入章节目录的地址,根据输入保存的地址下载全部内容到本地
bc.download_book('http://www.136book.com/duidishijianduidiren/', 'F:/duidishijianduidiren.txt')
3. 结果
-
控制台下载进度
-
本地文件
小熙用《对的时间对的人》这本小说举例的,本网站其他的同理。如果转换网站的话,就需要根据不同网站的内容结构修改代码了。
如果经济充裕还是提倡购买正版,毕竟创作不易,本文仅供学习交流。