python小试牛刀之爬取网页文本内容保存到本地

看完了《简明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,还有许多不完美的地方,哈哈,不过可以自动化保存文档的内容是实现了。欣喜。依稀想起一位大神说过的话:懒惰是人类进步的源泉。

  • 9
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值