Python BeautifulSoup爬取oschina我的blog文章

      前段时间学习了一些python的模块,要熟悉各个功能仍是得写写代码的,因此根据前面掌握的模块知识,写了一个小程序,专门用来爬取oschina的我的博客文章的小工具。常常看到一些大牛的好文章,本着学习的目的把大牛的全部文章爬取到本地,自建一个web网站,就能够在本地访问了,也算是保存一份吧。 python

      本人刚学python,代码比较丑陋,有时我都不忍直视,因为还没看re正则模块,因此在处理文章名转义时还很嫩,爬取的是我的的全部blog文章,因此须要相似这样的URL:http://my.oschina.net/guol/blog web

     代码以下: shell

#!/usr/bin/python
#coding=utf-8
import urllib2,re,sys,json,os
from bs4 import BeautifulSoup
from urllib import urlencode

url=sys.argv[1]
blogname=url.split('/')[3]

def ParsePage(url):
    heard={'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
    rurl=urllib2.Request(url,headers=heard)
    page=urllib2.urlopen(rurl)
    return page

def GetParentPage():
    global url
    pd={}
    page=ParsePage(url)
    soup=BeautifulSoup(page)
    li=soup.find('strong')
    licon=str(li.find_next('ul'))
    soup_t=BeautifulSoup(licon)
    for i in soup_t.find_all('li'):
        ul=i.a['href']
        title=i.a.text
        tcon=title.encode('utf-8')
        pd[ul]=tcon
    return pd

def GetClass():
    pd={}
    cla=GetParentPage()
    for k in cla:
        url=k
        title=cla[k]
        page=ParsePage(url)
        soup=BeautifulSoup(page)
        i=soup.find_all('h2','BlogAccess_true BlogTop_0')
        for index,item in enumerate(i):
            ul=i[index].a['href']
            title=i[index].a.text
            pd[ul]=title
    return pd


def DownPages():
    reload(sys)
    cla=GetClass()
    t=int(len(cla))
    p=int(0)
    global blogname
    blogdir='/var/www/'+blogname
    dircmd='mkdir -p'+' '+blogdir
    os.system(dircmd)
    sys.setdefaultencoding("utf-8")
    for k in cla:
        while p < t:
            page=ParsePage(k)
            soup=BeautifulSoup(page)
            biaoti=str(soup.title.text)
            bcon=biaoti.split(' -')[0]
            bt=bcon.replace('/','-').replace(' ','-').replace('(','').replace(')','')
            tcon=str(soup.find('div','BlogContent'))
            csoup=BeautifulSoup(tcon)
            ctext=csoup.prettify()
            filename=blogdir+'/'+bt
            command='touch' + ' '+filename
            os.system(command)
            fp=open(filename,'w')
            fp.write(ctext)
            fp.close()
            p=p+1
            break

if __name__ == '__main__':
    DownPages()

    安装web服务器,我用的是apache:apt-get install apache2 apache

    开始收集文章,选取如下两个URL    json

http://my.oschina.net/flashsword/blog
http://my.oschina.net/davehe/blog

    假如python脚本保存为getpage.py,以下运行 getpage.py http://my.oschina.net/davehe/blog,没有任何返回即爬取完毕,若是有错误通常都是文章名称中有特殊字符致使的。 小程序

    访问在本地搭建的web站点 安全



       BUG: 服务器

              1 因为blog文章名的规范问题,在web站点下是按照文章的标题创建文件的,因此若是blog名称中有特殊字符会致使爬取失败,解决办法用re模块提早对特殊字符进行转义。 工具

              2 在blog中都会有一些图片以辅助文章,爬取到本地的文章访问不了图片的URL链接,应该是有图片防盗链之类的安全措施吧,解决办法把文章中的图片也爬取到本地的一个资源文件夹中,同时修改文章中的图片url链接指向本地的资源文件夹。 学习


       欢迎大牛完善一下文章名特殊字符的处理,本文主要是学习python模块,没有其余目的。

相关文章
相关标签/搜索