CodeSnippet 抓取代码片段

目标

抓取CodeSnippet中的代码片段

抓取内容

分析

DOM结构

代码

<body>
    <div id="container">
        <div class="content bor round">
            <ul>
                <li class="con-logo bbor">
                    <a href="http://www.codesnippet.cn/index.html" title="分享你的世界"></a>
                </li>
                <li class="con-code bbor">
                    <pre class="brush:php;">
                    <!--代码块-->
                    </pre>
                </li> 
                <li class="con-btn bbor">
                    <ul>
                        <li><a href="http://www.codesnippet.cn/pcode.html" class="button">发布代码片段</a></li>
                        <li><a href="http://www.codesnippet.cn/list.html" class="button">片段列表</a></li> 
                    </ul>
                    <br class="clearfloat" />
                </li>
                <li class="con-motto bbor">
                    <div>一个线程如果是个人英雄主义,那么多线程就是集体主义,你不再是一个独行侠,而是一个指挥家。</div>
                </li>
                <li class="con-count bbor">
                    <div>
                        共有<span> {15106} </span>个代码片段 
                    </div>  
                </li> 
                <li class="con-copyright">
                    <div>京ICP备13038605号 
                        <script src="http://s14.cnzz.com/stat.php?id=4720394&web_id=4720394" language="JavaScript"></script> 
                    </div>  
                </li> 
            </ul>
        </div>
    </div> 
</body>

我们想要抓取的内容在为 li class="con-code bbor" 所以 BeautifulSoup find()方法获取到该标签然后获取其文本内容

准备

准备我们爬虫比用的两个模块

from urllib2 import urlopen

from bs4 import BeautifulSoup

编写抓取代码

# 抓取http://www.codesnippet.cn/index.html 中的代码片段

def GrapIndex():
    html = "http://www.codesnippet.cn/index.html"
    bsObj = BeautifulSoup(urlopen(html), 'html.parser')
    return bsObj.find("li",  {"class":"con-code bbor"}).get_text()

当我们抓取到我们想要的数据之后接下来要做的就是把数据写到数据库里,由于我们现在抓取数据简单,所以只写文件即可!

def SaveResult():
    codeFile=open("code.txt", "a") # 追加
    for list in GrapIndex():
        codeFile.write(list)
    codeFile.close()

当我们在写文件的时候出现了以下错误,而下面这个错误的造成原因则是由于python2.7是基于ascii去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128))

UnicodeEncodeError: 'ascii' codec can't encode character u'u751f' in position 0: ordinal not in range(128)

分析

python2.7是基于ascii去处理字符流,当字符流不属于ascii范围内,就会抛出异常(ordinal not in range(128))

解决办法

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

完整代码展示

from urllib2 import urlopen

from bs4 import BeautifulSoup

import os
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

def GrapIndex():
    html = "http://www.codesnippet.cn/index.html"
    bsObj = BeautifulSoup(urlopen(html), 'html.parser')
    return bsObj.find("li",  {"class":"con-code bbor"}).get_text()

def SaveResult():
    codeFile=open("code.txt", "a")
    for list in GrapIndex():
        codeFile.write(list)
    codeFile.close()

if __name__ == '__main__':
    for i in range(0,9):
        SaveResult()

_DangJin
127 声望12 粉丝

PHP