本文实例讲述了Python实现的爬取小说爬虫功能。分享给大家供大家参考,具体如下:
想把顶点小说网上的一篇持续更新的小说下下来,就写了一个简单的爬虫,可以爬取爬取各个章节的内容,保存到txt文档中,支持持续更新保存。需要配置一些信息,设置文档保存路径,书名等。写着玩,可能不大规范。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# coding=utf-8
import requests
from lxml import etree
from urllib.parse import urljoin
import re
import os
# 获取页面,并返回解析整理好的文本
def get_page(url):
response = requests.get(url, headers = header)
set_encoding(response)
text = parse_page(response.text)
return text
# 解析页面,将当前页面中的文字筛选出来
def parse_page(html):
title = re.findall( '<div class="bookname">\s+<h1>(.+?)</h1>' , html)[ 0 ]
content = re.findall( 'div id="content">(.*?)</div>' , html, re.S)[ 0 ]
content = content.replace( '<br />' , ' ').replace(' ', ' ').replace(' \r\n\r\n ', ' \r\n')
content = title + '\r\n' + content + '\r\n\r\n'
return content
# 将文本追加到file_path对应的txt中
def save_page(path, text):
with open (path, 'a' , encoding = 'utf-8' ) as f:
f.write(text)
# 设置对response得到文本的解析编码为'gbk'
def set_encoding(response):
response.encoding = 'gbk'
# 从配置文件中获取当前保存的链接总数
def get_current_chapters_count(path):
# (1)第一次读配置文件可能没有创建,所以要支持没有文件创建文件的功能(2)如果文件存在,则不能清空,参考http://www.zzvips.com/article/158740.htm
with open (path, 'a+' ) as f:
f.seek( 0 )
res = f.read()
if res = = '':
return 0
else :
return int (res)
# 将保存的链接总数保存到配置文件中
def set_current_chapters_count(path, count):
with open (path, 'w' ) as f:
f.write( str (count))
# 需要配置的字典
config_dic = dict (start_url = 'http://www.booktxt.net/2_2220/' , # 待下载小说的章节首页
latest_item = 9 , # 列出的所有章节链接中,前面几个链接为最新章节,一般为9个,爬取时避免与最后部分重复,所以前面9个链接不爬取
bookname = '赘婿' , # 待下载的小说名
folder_path = 'D:\\' ) #保存位置
domain = 'http://www.booktxt.net' # 顶点网域名
if __name__ = = '__main__' :
chapter_url_list = []
response = requests.get(config_dic[ 'start_url' ], headers = header)
set_encoding(response)
html = etree.HTML(response.text)
chapters = html.xpath( '//dd' )
print ( '所有链接' + str ( len (chapters)))
chapters = chapters[config_dic[ 'latest_item' ]:] # 前9章为最新章节,后面还会重复,这里去掉
print ( '不重复有效章节链接' + str ( len (chapters)))
folder_path = config_dic[ 'folder_path' ] + config_dic[ 'bookname' ]
if not os.path.exists(folder_path):
os.mkdir(folder_path)
file_path = folder_path + '\\' + config_dic[' bookname '] + ' .txt'
config_file_path = folder_path + '\\' + ' config.txt'
print ( '小说存储路径为:' + file_path)
print ( '配置文件存储路径为:' + config_file_path)
saved_count = get_current_chapters_count(config_file_path) # 获取目前保存的小说中已经包含的章节数
print ( '当前' + file_path + '中已经保存的章节总数' + str (saved_count))
if saved_count < len (chapters): # 说明有更新
set_current_chapters_count(config_file_path, len (chapters))
print ( '共更新 ' + str ( len (chapters) - saved_count) + ' 章' )
for c in chapters[saved_count:]: # 从上次保存的位置开始继续保存
url = c.xpath( 'a/@href' )[ 0 ]
url = urljoin(domain, url)
txt = c.xpath( 'a/text()' )[ 0 ]
chapter_url_list.append(url)
print (url)
print (txt)
save_page(file_path, get_page(url))
else :
print ( '小说还没有更新哦' )
|
希望本文所述对大家Python程序设计有所帮助。
原文链接:https://blog.csdn.net/SunCherryDream/article/details/79070687