avatar

爬取三国演义1.0

最近在学习《Python网络爬虫从入门到实践》——庄培杰,这本书别看是入门,对Python的基础语法以及基础的http知识的要求还是挺高的,由于我没学过urllib库,本书的第一实例又是用urllib爬取三国演义。
我就想着用requests库用同样的程序流程来实现三国演义的爬取,介于我也是刚入门,所以requests只懂一点,urllib也只懂一点。就写下了三国演义1.0版本,该版本有许多的不足:

  1. 与小说内容所不相干的内容未解决
  2. 段落并没有空格与自动换行
    希望随着学习的深入,我能写出较为完美的三国演义爬虫

1.0版本代码如下:

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
import requests
from bs4 import BeautifulSoup
import os
import re
import time
import sys

chapter_url_list=[]
urllist=[]
novel_save_dir= os.path.join(os.path.abspath(os.path.dirname(__file__)),'novel_cache/') # 获取当前目录的上级文件夹,并创建novel_cache
print('当前执行的脚本文件路径为'+ os.path.abspath(__file__))
print('小说下载的文件夹路径为' + os.path.abspath(os.path.dirname(__file__)) + '/novel_cache')

def getHTMLText(url):
try:
headers= {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36 Edg/80.0.361.69'
}
res= requests.get(url,headers=headers,timeout=30)
res.raise_for_status()
res.encoding='gbk'
return res.text
except:
return ''

def getnovelurl(html): # 获取小说章节url
soup= BeautifulSoup(html,'html.parser')
hrefs= soup.find_all('a')
for href in hrefs[41:]:
href= href.get('href')
if href:
chapter_url_list.append(href)
for href in chapter_url_list: # 章节url的拼接
url= 'https://www.biqukan.com' + href
urllist.append(url)

def getnoveltext(url): # 获取小说章节正文
html= getHTMLText(url)
soup= BeautifulSoup(html,'html.parser')
titles= soup.find('h1')
title= titles.string
contents= soup.find('div',attrs={'class':'content'})
content= contents.get_text()
save_novel(title,content)

def save_novel(name,content): # 将正文写入本地
try:
with open(novel_save_dir + name +'.txt','w+',encoding='utf-8')as f:
f.write(content)
except:
print('')
else:
print('下载完成:' + name)

if __name__ == "__main__":
if not os.path.exists(novel_save_dir): # 判断文件夹是否存在,不存在则创建
os.mkdir(novel_save_dir)
url= 'https://www.biqukan.com/50_50096/' # 小说的url
html= getHTMLText(url)
getnovelurl(html)
for chapter in urllist:
time.sleep(1) # 间隔1s防止ip被ban
getnoveltext(chapter)
文章作者: Techoc
文章链接: https://techoc.xyz/posts/db08ce65/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Techoc's

评论