本人是做java开发的,闲来无事学习了python觉得挺有意思,然后使用python写了一个小爬虫来获取自己喜欢的小说跟大家分享一下过程!(学习中有疑问可以下方留言,大家一起谈论学习)
声明:以下代码仅供参考学习,如果利用代码造成目标网站故障或者其他问题,本人概不负责,特此声明!!!
引入相关包(我是做java的习惯这么描述,往下看吧)
import requests
import re
import traceback
爬取目标网站路径
url = 'http://www.xbiquge.la/10/10489/'
模拟浏览器请求
respone = requests.get(url)
设置编码
respone.encoding = 'utf-8'
获取请求内容
从respone对象里获取网站内容(我们是从网站内容里取出想要的东西的)
html = respone.text
小说标题从html中获取章节标题
tittle = re.findall(r'<dd>(.*?)</dd>', html)
新建文件保存小说内容
这里将获取的到内容写入到本地了
fb =open('三寸天堂.txt', 'w',encoding='utf-8')
解析a标签内部文字的正则
res = r'<a .*?>(.*?)</a>'
下面看完整代码吧
import requests
import re
import traceback
#获取资源路径
url = 'http://www.xbiquge.la/10/10489/'
#模拟浏览器请求
respone = requests.get(url)
#设置编码
respone.encoding = 'utf-8'
#获取请求内容
html = respone.text
#小说标题从html中获取章节标题
tittle = re.findall(r'<dd>(.*?)</dd>', html)
#新建文件保存小说内容
fb =open('三寸天堂.txt', 'w',encoding='utf-8')
count = 0
#len()是python函数,计算集合长度,计算出总共有多少章节
num = len(tittle)
try:
for i in tittle:
#计数,控制循环
count+=1
#解析a标签内部文字的正则表达式
res = r'<a .*?>(.*?)</a>'
#获取a标签文字
content = re.findall(
res, i, re.S | re.M)[0]
#解析a标签内部链接的正则表达式
res_url = r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')"
link = re.findall(res_url, i, re.I | re.S | re.M)[0]
#拼接章节链接
allLink = 'http://www.xbiquge.la'+link
#print(allLink+content)
#模拟GET请求
# 模拟浏览器请求务必加入timeout,防止影响目标网站速度
contentRespone = requests.get(allLink,timeout=8)
# 设置编码
contentRespone.encoding = 'utf-8'
# 获取请求内容
contentHtml = contentRespone.text
state = contentRespone.status_code
#处理异常情况,防止程序中断
if state != 503:
contentDiv = re.findall(r'<div id="content">(.*?)</p></div>', contentHtml)[0]
dr = re.compile(r'<[^>]+>',re.S)
dd = dr.sub('', contentDiv)
nbspStr = re.compile(r'[ ]',re.S)
nbsp = nbspStr.sub('', dd)
# 持久化
print('写入文件开始 章节:'+content)
fb.write(content)
fb.write('\n')
fb.write(nbsp)
fb.write('\n\n\n')
fb.write('*******************************************'
'分割符'
'*******************************************')
fb.write('\n\n\n')
if count == num:
break
except Exception as e:
fb.close()
print(e)
print('写入文件异常')
traceback.print_stack()
finally:
fb.close()
print('写入文件结束')