欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

相关标签: 爬虫 python