赞
踩
项目背景
最近的全职高手在腾讯视频开播了,这本童年的小说被拍成电视剧,我还是比较喜欢的。这也让我有了回去刷一遍《全职高手》小说的冲动,但是当我看到网上小说基本都要收费,不收费的一堆广告的时候,作为一名业余程序员,当然就想办法,最后做出了这个python的小项目,在这里分享给大家!!!
项目准备
需要安装python的编辑环境
找一个自己舒服的编辑器:VS,pycharm,sublime Text,由于代码简单甚至IDE也可以
这里我就选择pycharm进行分享
我们python中需要的库有:requests(获取网页),lxml(解析HTML),chardet(自动检测页面文件的编码格式)
项目效果
项目代码
如果想直接体验,在桌面上直接新建名字叫全职高手的空文件夹,然后复制代码在pycharm上运行。
#导入requests(获取网页),lxml(解析HTML),chardet(自动检测页面文件的编码格式)库 import requests from lxml import html etree = html.etree #(因为这里lxml库中没有etree,所有用lxml中html中的etree) import chardet #1.获取单页html def get_one_page(url): headers={'User-Agent':'Mozilla/5.0'}#做伪装用户操作 response=requests.get(url,headers=headers) response.encoding=chardet.detect(response.content)['encoding']#用Chardet调整合适的文字 #print(response.text) #这里可以测试是否爬下网页的html return response.text #2.解析HTML a=[1]#利用数组标记数组,方便电脑自动排序,方便自己阅读小说 def parse_one_page(html,path): global a result=etree.HTML(html) title =result.xpath('//div[@class="content"]/h3/text()')#文章标题 title = "".join(title) #将列表转换为str类型 name = path + str(a[0]) +title + '.txt' a[0] = a[0] + 1 content = result.xpath('//*[@id="fontsize"]/text()')#文章内容 with open(name,"w",encoding="utf-8") as f:#创建文件 for i in content: f.write(i) #3.函数回调 def main(p): path=r'C:\Users\PC\Desktop\全职高手\ ' #这里是我自己电脑桌面建了一个名字叫“全职高手”空文件夹 url='https://www.dulaidw.com/read/159116/'+str(p)+'.html' #这是我在百度上找的全职高手小说网页的链接 html=get_one_page(url) parse_one_page(html,path) #4.回调主函数,完成分页 if __name__ == '__main__': for p in range(36909092,36910896): try: main(p) except (OSError, TypeError,NameError,IndexError) as reason: print('出错了T_T') print('出错原因是%s' % str(reason)) finally: p= p+1
代码解析
如何导入库
方法一:
1.在pycharm中左下角找到Terminal点击输入pip install requests
2.输入pip install lxml
3.输入pip install chardet
方法二:
1 在键盘上按Ctrl+R输入cmd进入输入pip install requests
2 输入pip install lxml
3 输入pip install chardet
第一步导入库
#导入requests(获取网页),lxml(解析HTML),chardet(自动检测页面文件的编码格式)库
import requests
from lxml import html
etree = html.etree
#(因为这里lxml库中没有etree,所有用lxml中html中的etree)
import chardet
可以试一下
from lxml import etree
如果不行就用回这段代码
from lxml import html
etree = html.etree
(因为这里lxml库中没有etree,所有用lxml中html中的etree)
第二步上网找小说
进入找到第一章看到网页结构看到最后面是36909092最后一章是36910896这里可以用循环对所有小说章节进行爬取,当然一些网站也会对爬虫做出反爬措施比如这个网站就有反爬措施,他部分章节是不显示的这个时候一般人可能会选择换个网站进行爬取,但是作为一名优秀的业余程序员,当然就要想办法绕过这些反爬措施。下面会讲如何进行绕过反爬措施。
第三步获取网页html
#1.获取单页html
def get_one_page(url):
headers={'User-Agent':'Mozilla/5.0'}#做伪装用户操作
response=requests.get(url,headers=headers)
response.encoding=chardet.detect(response.content)['encoding']#用Chardet调整合适的文字
#print(response.text)
#这里可以测试是否爬下网页的html
return response.text
第四步解析html
这里会有一些小技巧,比如一般爬下来的文件是乱的,因为计算机无法对中文进行排序(第一章,第二章),让文件名带序号就可以让计算机自动排序,这里利用数组标记数组,可以方便电脑自动排序,方便自己阅读小说
我们先进入要爬取网页的第一章按F12可以进入开发者模式,看到网页的html代码,找到需要获取的东西
第一个是标题
找到标题右键找到copy点击copy Xpath
会自动获取Xpath
然后在title =result.xpath(‘粘贴在这里’)#文章标题
第二个是内容
同样的方法
然后在content=result.xpath(‘粘贴在这里’)#文章内容
#2.解析HTML
a=[1] #利用数组标记数组,方便电脑自动排序,方便自己阅读小说
def parse_one_page(html,path):
global a
result=etree.HTML(html)
title =result.xpath('//div[@class="content"]/h3/text()')#文章标题
title = "".join(title) #将列表转换为str类型
name = path + str(a[0]) +title + '.txt'
a[0] = a[0] + 1
content = result.xpath('//*[@id="fontsize"]/text()')#文章内容
with open(name,"w",encoding="utf-8") as f:#创建文件
for i in content:
f.write(i)
第五步回调函数
#3.函数回调
def main(p):
path=r'C:\Users\PC\Desktop\全职高手\ ' #这里是我自己电脑桌面建了一个名字叫“全职高手”空文件夹
url='https://www.dulaidw.com/read/159116/'+str(p)+'.html' #这是我在百度上找的全职高手小说网页的链接
html=get_one_page(url)
parse_one_page(html,path)
代码中 url=‘https://www.dulaidw.com/read/159116/’+str(p)+’.html’
原本是url=‘https://www.dulaidw.com/read/159116/36909092.html’
我们前面分析了第一章是36909092最后一章是36910896我们要用循环用p这个字符串每分析完一个网页就加一
第六步回调主函数
#4.回调主函数,完成分页
if __name__ == '__main__':
for p in range(36909092,36910896):
try:
main(p)
except (OSError, TypeError,NameError,IndexError) as reason:
print('出错了T_T')
print('出错原因是%s' % str(reason))
finally:
p= p+1
这里前面说到网站有一些反爬措施,每个网站的反爬措施不同,要根据每个网站的措施自定方案,像这个网站的反爬措施就是他中间的会跳数字比如第一章是36909092那他为了反爬第二章就是36909094而不是36909093,这样的话python会收到IndexError报错,而停止运行,所以我们这里就会用到异常处理跳过它的报错继续爬取!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。