要做一个项目,所以先学习熟练应用爬虫。
在此记录学习过程,供他人参考,也督促自己坚持学习。
目标:
用爬虫实现小说爬取!
背景:
1.已掌握一些基础的相关知识
2.运行环境为vs code
3.安装一些爬虫所用的库文件:可以在cmd中,使用pip获取,例如按照如下指令安装requests库文件::pip install requests
大致路线:
此篇为第一部分:模仿学习
参照这篇文章 来逐步练习小说爬取。过程很清楚完整,很适合初学者熟悉大致过程。不知道为什么评论有很多人出现了问题,但是我做完后只出现了文字乱码的问题。
文字乱码解决方案【三种】:对文字进行转码即可
def get_download_url(self): req=requests.get(url=self.target) #解决中文乱码问题! #这三种任选一种即可,推荐最后一种 req.encoding = 'GB2312' #req.encoding = 'utf-8' #Response.encoding=Response.apparent_encoding #自动识别响应体的编码 html=req.text
以下为详细代码+注释:
import requests import sys from bs4 import BeautifulSoup class downloader(object): def __init__(self): self.server='http://www.biqukan.com/' #是提取内容时所用的固定前缀 self.target='http://www.biqukan.com/1_1094/' #用于目录页 self.names=[] #存放章节名 self.urls=[] #存放章节链接 self.nums=0 #存放章节数 """ 函数说明:获取下载链接 """ def get_download_url(self): req=requests.get(url=self.target) req.encoding = 'utf-8' #解决中文乱码问题! html=req.text #创建一个Beautiful Soup对象 div_bf=BeautifulSoup(html) #获得html信息中所有class属性为listmain的div标签 #因为python中class是关键字,为防止冲突,使用class_表示标签的class属性 div=div_bf.find_all('div',class_='listmain') a_bf=BeautifulSoup(str(div[0])) a=a_bf.find_all('a') self.nums=len(a[15:]) #剔除不必要的章节,此处从第16个章节开始下载。并统计章节数 for each in a[15:]: self.names.append(each.string) self.urls.append(self.server+each.get('href')) """ 函数说明:获取章节内容 """ def get_contents(self,target): req=requests.get(url=target) req.encoding = 'utf-8' #解决中文乱码问题! html=req.text #创建一个Beautiful Soup对象 bf=BeautifulSoup(html) #获得html信息中所有class属性为showtxt的div标签 #因为python中class是关键字,为防止冲突,使用class_表示标签的class属性 texts=bf.find_all('div',class_='showtxt') texts=texts[0].text.replace('\xa0'*8,'\n\n') #将空格替换成两次提行 return texts """ 函数说明:将爬取的文章内容写入文件 """ def writer(self,name,path,text): write_flag=True with open(path,'a',encoding='utf-8') as f: f.write(name+'\n') #小说名字 f.writelines(text) #小说内容 f.write('\n\n') """ 主函数 """ if __name__=="__main__": dl=downloader() #创建类 dl.get_download_url() print('《一念永恒》开始下载:') print(dl.nums) for i in range(dl.nums): dl.writer(dl.names[i],'一念永恒.txt',dl.get_contents(dl.urls[i])) print(" 已下载第"+str (i+1)+ "章:%.3f%%" % float(i/dl.nums)+'\r') #改进 sys.stdout.write(" 已下载:%.3f%%" % float(i/dl.nums)+'\r') sys.stdout.flush() print("《一念永恒》下载完毕")