python小试牛刀之爬取网页文本内容保存到本地
程序员文章站
2024-02-23 08:09:52
...
看完了《简明python教程》这本书,顿觉手痒,欲磨刀大干一番。
刚好今天看到一个人网站上的资料挺不错的,想要保存下来。可是文章又特别得多,要是我一次一次的去复制粘贴,这还不得累死人。于是乎就想放弃。但突然灵光一闪,之前一直听说python写爬虫什么的,便自己也一直想尝试着用python写一次,这不是正是一个好机会使用爬虫将文本爬下来的时候吗?(按照程序员的逻辑,哈哈)
于是便有了以下的工作。
因为我想爬的是一篇写作素材网站的内容,所以以下以这个网站为例:http://www.mx-xz.com/sc-zl/fenlei/。
当然首先要现获取这个网址的代码:
url="http://www.mx-xz.com/sc-zl/fenlei/";
htmlr=requests.get(url);
首先我们看一下网站代码:
<li>
<div class="title">
<div class="l"><a href="http://www.mx-xz.com/show_4097.html" title="【江湖宝典】一些江湖术语及常见的名词解析" target="_blank" style="color:#e36c09">【江湖宝典】一些江湖术语及常见的名词解析</a><span>顶</span><span>荐</span></div>
<div class="r">该写作素材对 <span>11906</span> 个作者有用</div>
</div>
<div class="intro">十二经脉指人身手足三阴三阳十二经,包括手阳明、手少阳、手太阳、手太阴、手厥阴、手少阴、足阳明、足少阳、足太阳、足阴、足厥阴、足少阴共十二经脉。十二经脉运行于一身内外,遍布各处,不论是四肢、躯干、内脏无所…</div>
<div class="tagstime">
<div class="l">关键词:</div>
<div class="r">2013.06.08入库</div>
</div>
</li>
在网站代码中有这样的代码块,我们需要从中分割出二级网址(http://www.mx-xz.com/show_4097.html)和title内容。
然后使用BeautifulSoup分离出每一个以上的单独的代码块:
bsObjHtml=BeautifulSoup(htmlr.text);
for titlelist in bsObjHtml.findAll("div",{"class":"title"}):
再根据每一个单独的部分获取网址和标题:
urltext=titlelist.a["href"];
filename=titlelist.a["title"];
根据获得的二级网址继续爬:
rtext=requests.get(urltext);
bsObjtext=BeautifulSoup(rtext.text);
filetext=bsObjtext.find("div",{"id":"sdcms_content"});
接着就是打开本地文件,然后保存内容了:
fp=open(filepath+filename+".txt","w");
fp.write(tool.replace(filetext.__str__()));
当然还有一部重要的内容,也就是tool。因为网页代码会有很多标签如<p>
,所以保存之前要删除掉这些标签,于是就有了tool:
class Tool:
removeImg = re.compile('<img.*?>| {7}|')
removeAddr = re.compile('<a.*?>|</a>')
replaceLine = re.compile('<tr>|<div>|</div>|</p>')
replaceTD= re.compile('<td>')
replacePara = re.compile('<p.*?>')
replaceBR = re.compile('<br><br>|<br>')
removeExtraTag = re.compile('<.*?>')
def replace(self,x):
x = re.sub(self.removeImg,"",x)
x = re.sub(self.removeAddr,"",x)
x = re.sub(self.replaceLine,"\n",x)
x = re.sub(self.replaceTD,"\t",x)
x = re.sub(self.replacePara,"\n ",x)
x = re.sub(self.replaceBR,"\n",x)
x = re.sub(self.removeExtraTag,"",x)
return x.strip()
下面放上全部代码:
"""
Created on 2017/12/15
@author: manbu
"""
# coding:utf-8
import re
import requests
from bs4 import BeautifulSoup
filepath="F:/temp_xiaoshuo/";
class Tool:
removeImg = re.compile('<img.*?>| {7}|')
removeAddr = re.compile('<a.*?>|</a>')
replaceLine = re.compile('<tr>|<div>|</div>|</p>')
replaceTD= re.compile('<td>')
replacePara = re.compile('<p.*?>')
replaceBR = re.compile('<br><br>|<br>')
removeExtraTag = re.compile('<.*?>')
def replace(self,x):
x = re.sub(self.removeImg,"",x)
x = re.sub(self.removeAddr,"",x)
x = re.sub(self.replaceLine,"\n",x)
x = re.sub(self.replaceTD,"\t",x)
x = re.sub(self.replacePara,"\n ",x)
x = re.sub(self.replaceBR,"\n",x)
x = re.sub(self.removeExtraTag,"",x)
return x.strip()
tool=Tool()
url="http://www.mx-xz.com/sc-zl/fenlei/";
htmlr=requests.get(url);
bsObjHtml=BeautifulSoup(htmlr.text);
for titlelist in bsObjHtml.findAll("div",{"class":"title"}):
if (titlelist.a != None):
urltext=titlelist.a["href"];
filename=titlelist.a["title"];
fp=open(filepath+filename+".txt","w");
rtext=requests.get(urltext);
bsObjtext=BeautifulSoup(rtext.text);
filetext=bsObjtext.find("div",{"id":"sdcms_content"});
fp.write(tool.replace(filetext.__str__()));
fp.close();
总算大功告成,由于第一次接错python,还有许多不完美的地方,哈哈,不过可以自动化保存文档的内容是实现了。欣喜。依稀想起一位大神说过的话:懒惰是人类进步的源泉。