本文开发环境:
- python环境:python3
- 安装的库:request、re、pymongo
背景
首先,要知道我们此次的任务是抓取还未出版的小说《龙族》(第五部)。虽然这本书还未出版,但是已经在很多网站上连载,相信喜欢龙族系列的人都曾在网站上在线看过,但是有的网站广告太多,不方便阅读,所有我就想用python爬虫的知识将其爬取下来,方便阅读,以下是实现步骤。
实现步骤
一、选取目标网页
目前正在连载龙族五的网站很多,这里我选取的网页是: 努努书坊,
网页如下图:
其实其他网站也行,不过这个网站的广告比较少,爬取起来也比较简单。下面开始上代码,看看利用python是如何爬取的。
二、 使用request爬取目标网页
代码设计
代码主要分成三步:下载网页—>解析网页内容—>存储到本地txt文件,下面开始上代码。
def parse_page(url, t):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Connection': 'close'
}
time.sleep(random.randint(1, 5))
response = requests.get(url, headers)
print("第" + str(t) + "章请求正常")
# 网站的格式是gbk格式
text = response.content.decode('gbk')
# 这里是获取小说正文部分的正则表达式
base_content = re.findall(r'<div class="text"\salign="justify">.*?<p>(.*?)</p>', text, re.DOTALL)
print("第" + str(t) + "章解析正常")
# 这里是获取小说的章节名称
page_name = re.findall(r'<div id="Article">.*?<h1>(.*?)<br>', text, re.DOTALL)
# 这里是获取小说的下一章节的网址
next_page = re.findall(r'<p align="center">.*?<a href=.*?>.*?</a>.*?<a href=.*?>.*?</a>.*?<a href=(.*?)>.*?</a>', text, re.DOTALL)[1]
for content in base_content:
x = re.sub(r'<p>', "", content)
p = re.sub(r' |\n', "", x)
# 这里采用追加的方式写入
with open("E:/workspace/python-ws/littl_robot/poetry_spider/龙族第五部.txt", 'a', encoding='utf-8') as fp:
# 这里是去除空格和换行符
p = p.strip()
fp.write(str(page_name) + "\n" + '='*100 + "\n")
fp.write(p + "\n" + "="*100 + "\n")
print("第" + str(t) + "章写入文件正常")
print("第" + str(t) + "章抓取正常")
next_page = next_page.replace('\'', '')
# 这里是返回下一章节的网址,方便爬取
return next_page
接下来是主函数部分的代码:
def main():
original_url = "https://www.kanunu8.com/book2/10943/194884.html"
base_url1 = "https://www.kanunu8.com/"
base_url2 = "book2/10943/"
next_page_url_1 = parse_page(original_url, 1)
real_url = original_url
for t in range(2, 180):
next_page_url_2 = base_url2 + next_page_url_1
real_url = parse.urljoin(base_url1, next_page_url_2)
print('Url打印正确: ' + real_url)
next_page_url_1 = parse_page(real_url, t)
if next_page_url_1 == './':
break
print("已经全部爬取完,结束爬取")
if __name__ == '__main__':
main()
三、目标完成
最后,我们会得到一个txt文件,可以采用其他工具将其转换为PDF文件,实际效果如下图:
这样我们就可以在手机上阅读还未出版的龙族五了,是不是很方便呢?
四、感想
首次采用python爬虫完成了自己的一个小想法,因为是新手,代码还有很多不规范的地方,我会继续改进的,最后,欢迎各路大神评论指出,我会虚心学习的。