近期做一个项目需要用到python,只懂皮毛的我花了三天时间将python重新拾起啃一啃,总算对python有了一定的认识。
然后有根据爬虫基本原理爬取了一本小说,其他爬取小说的方法类似,结果见个人资源下载(本想下载分设置为0,结果CSDN设置最低为2分,没有积分的可以加我qq要该小说)。
**爬虫原理:1、模拟人打开一页小说网页
2、将网页保存下来
3、将网页关键字保存下来
4、循环**
环境:python2.7,安装BeautifulSoup,win7-64bit,sublime text3
需要的基本知识(这些基本的网页知识我后面有时间会总结下,现在不知道可以先百度下):HTML5基本知识(标签,属性),BeautifulSoup基本知识。
小说首页地址:http://www.xinshubao.net/0/927/45819.html (魂破九天)
爬取该页内容进行分析:通过分析网页地址分为两段,地址头为:http://www.xinshubao.net/0/927/ 地址尾为45819.html(可以通过网页获取到)
代码如下:
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from bs4 import BeautifulSoup
import urllib
def getHtmlCode(url): #输入为网页地址,输出为网页源码
page = urllib.urlopen(url)
html = page.read()
return html
urlHead = 'http://www.xinshubao.net/0/927/'
urlEnd = '45819.html'
url = urlHead + urlEnd
def parser(url): #输入为网页地址,输出为解析后网页的结构
str1 = getHtmlCode(url)
soup = BeautifulSoup(str1,"html.parser")
temp = soup.prettify()
print temp
return soup
parser(url)
通过爬取连续的几页分析可知,每章节分为两页,两章内容连在一起就是一章。
1、小说主要内容在<div id="content">
标签中
<div id="content">
第一章 狼心狗肺
<br />
<br />
纵横帝国,清风镇。
<br />
<br />
“头好痛!”
<br />
<br />
秦朗感觉大脑一阵刺痛,无数的信息涌进脑海!
<br />
<br />
十年前,秦家族山!
<br />
<br />
同年,秦战海之子,只有五岁的秦朗觉醒武魂,而且是百年难得一见的六星火龙武魂,被誉为清风镇数百年来的第一天才!
<br />
<br />
叶家更是锦上添花,将家主之nv叶可清许配给了秦朗!
<br />
<br />
但让人大跌眼镜的是,不知为何,天赋绝佳的秦朗足足用了十年时间,实力依然停留在武徒一重!秦朗更是被废除了少族长之位!
<br />
<br />
而反观与秦朗订婚的叶可清,不但出落的越来越漂亮,被称为清风镇第一美nv!
<br />
<br />
而且仅用十年时间便修炼到了武徒九重,乃是清风镇数一数二的天才,与秦朗形成了鲜明对比!
<br />
<br />
清风镇人人都在叹息,真是一朵鲜花cha在了牛粪上!
<script>
s3();
</script>
<br />
不过,让所有人不解的是,叶家似乎丝毫没有要与秦朗解除婚约的意思……
<br />
<!--省略-->
秦朗激动的发现
<br />
<br />
</div>
2、获取该标签内容并通过正则表达式(需要导入re),代码:
def resolve(url):
html=parser(url)
content = html.find_all('div',id='content')
content = str(content[0])
content = content.replace('<br />','')
print content
resolve(url)
结果:
可以看到这个中间还有其他标签<script>s3();</script>
这些标签不是小说的内容应该删除,
2.1、将标签内容替换为空:
def resolve(url):
html=parser(url)
content = html.find_all('div',id='content')
content = str(content[0])
content = content.replace('<br />','')
# print content
match = re.compile('<(.*)>')
taglist = match.findall(content)
for tag in taglist:
tag = '<' + tag +'>'
content = content.replace(tag,'')
content = content.replace('\n','')
print content
resolve(url)
结果:
3、找到下一页地址
根据网页源代码可以找到下一页的地址:
def nextUrl(url):
html = str(parser(url))
pattern = re.compile('<a href="(.*).html')
chapterList = pattern.findall(html)
url = urlHead + chapterList[1] + '.html'
print url
return url
nextUrl(url)
运行结果:http://www.xinshubao.net/0/927/45819_2.html
4、将两页连在一起
def resolve(url):
html = parser(url)
content = html.find_all('div',id='content')
content = str(content[0])
# print content
content = content.replace('<br />','')
# print content
pattern = re.compile('<(.*)>')
text = pattern.findall(content)
# print text
for line in text:
line = '<' + line +'>'
content = content.replace(line,'')
content = content.replace('\n','')
tmp = nextUrl(url)
index = tmp.find('_2')
if -1 == index: #如果是不同章节之间就空一行
content = content + '\n\n'
print content
return content
5、抓取整篇小说
def main(url):
flag = True
txt = ''
count = 0 #防止网页吊死
while flag:
try:
index = url.find('9316313_2') #最后一页
f = open(u'魂破九天.txt','a+') #追加
tempTxt = resolve(url)
f.write(tempTxt)
f.close()
url = nextUrl(url)
if -1 != index or count == 2000:
flag = False
except Exception as e:
raise
else:
pass
finally:
count = count + 1
print u'第%0.1f章 网页地址 %s'% (count/2.0,url)
好了整个爬取网页小说的教程到此结束!
全部代码如下:
#coding:utf-8
import re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
from bs4 import BeautifulSoup
import urllib
def getHtmlCode(url):
page = urllib.urlopen(url)
html = page.read()
return html
urlHead = 'http://www.xinshubao.net/0/927/'
urlEnd = '45819.html'
url = urlHead + urlEnd
def parser(url):
str1 = getHtmlCode(url)
soup = BeautifulSoup(str1,"html.parser")
temp = soup.prettify()
return soup
def nextUrl(url):
html = str(parser(url))
pattern = re.compile('<a href="(.*).html')
chapterList = pattern.findall(html)
url = urlHead + chapterList[1] + '.html'
return url
def resolve(url):
html=parser(url)
content = html.find_all('div',id='content')
content = str(content[0])
content = content.replace('<br />','')
# print content
match = re.compile('<(.*)>')
taglist = match.findall(content)
for tag in taglist:
tag = '<' + tag +'>'
content = content.replace(tag,'')
content = content.replace('\n','')
urlNext = nextUrl(url)
isSameChapter = urlNext.find('_2')
if -1 == isSameChapter:
content = content + '\n\n'
# print content
return content
def main(url):
flag = True
txt = ''
count = 0 #防止网页吊死
while flag:
try:
index = url.find('9316313_2') #最后一页
f = open(u'魂破九天.txt','a+') #追加
tempTxt = resolve(url)
f.write(tempTxt)
f.close()
url = nextUrl(url)
if -1 != index or count == 2000:
flag = False
except Exception as e:
raise
else:
pass
finally:
count = count + 1
print u'第%0.1f章 网页地址 %s'% (count/2.0,url)
main(url)
结果图: