美文网首页计算机杂谈Python学习日志Java-Python-Django社区
Python网络数据采集之数据清洗|第06天

Python网络数据采集之数据清洗|第06天

作者: 你好我是森林 | 来源:发表于2018-04-03 22:24 被阅读130次

    User:你好我是森林
    Date:2018-04-03
    Mark:《Python网络数据采集》

    网络采集系列文章

    Python网络数据采集之创建爬虫
    Python网络数据采集之HTML解析
    Python网络数据采集之开始采集
    Python网络数据采集之使用API
    Python网络数据采集之存储数据
    Python网络数据采集之读取文件

    说个题外话,昨天有朋友在微信问我怎么没有更新,昨天回家整理了一些相关的东西,没来得及写文章。今天一个朋友听说我在简书分享,也和我一同加入了简书,很喜欢这样的感觉。之前军哥(公众号Python之禅作者)跟我说过,慢慢尝试去写,然后会有一部分人会被你影响,我发现是真的,真的能够影响到一部分人。闲话少说,开始今天的内容。

    数据清洗

    从本章开始,内容稍微复杂一点,但也不是那么难。

    记得之前我在爬去boss网站的招聘信息的时候,抓取的数据并非我们所理想的样式,后面经过处理后,成为一个自己想要的样子,这个过程可以理解为数据清洗。这里的处理是在代码处理的,不是手工完成。

    编写代码清洗数据

    在此之前需要了解一下n-gram模型,它表示文字或语言中的n 个连续的单词组成的序列。在进行自然语言分析时,使用 n-gram或者寻找常用词组,可以很容易地把一句话分解成若干个文字片段。更多详情可以去维基查看一下,或者自行搜索。

    下面通过代码将返回维基百科词条“Python programming language”2-gram列表:

    from urllib.request import urlopen
    from bs4 import BeautifulSoup
    
    def getNgrams(content, n):
      content = content.split(' ')
      output = []
      for i in range(len(content)-n+1):
        output.append(content[i:i+n])
      return output
    
    html = urlopen('http://en.wikipedia.org/wiki/Python_(programming_language)')
    bs = BeautifulSoup(html, 'html.parser')
    content = bs.find('div', {'id':'mw-content-text'}).get_text()
    ngrams = getNgrams(content, 2)
    print(ngrams)
    print('2-grams count is: '+str(len(ngrams)))
    

    ngrams 函数把一个待处理的字符串分成单词序列(假设所有单词按照空格分开),然后增加到 n-gram 模型(本例中是 2-gram)里形成以每个单词开始的二元数组。

    我们得到的数据部分如下:

    [['\nPython\n\n\n\n\nParadigm\nObject-oriented,', 'imperative,'], ['imperative,', 'functional,'], ['functional,', 'procedural,'], ['procedural,', 'reflective\n\n\nDesigned\xa0by\nGuido'], 
    

    显然,是需要处理的。

    首选处理通过正则移除\n,再把 Unicode 字符过滤掉。先把内容中的换行符(或者多个换行符)替换成空格,然后把连续的多个空格替换成一个空格,确保所有单词之间只有一个空格。最后,把内容转换成 UTF-8 格式以消除转义字符。函数初步如下:

    def ngrams(input, n):
        content = re.sub('\n+', " ", content) 
        content = re.sub(' +', " ", content)
        content = bytes(content, "UTF-8")
        content = content.decode("ascii", "ignore") 
        print(content)
        input = input.split(' ')
        output = []
        for i in range(len(input)-n+1):
            output.append(input[i:i+n])
        return output
    

    Python获取所有的标点符号:

    ➜  url python
    Python 3.6.4 (default, Mar  1 2018, 18:36:50)
    [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import string
    >>> string.punctuation
    '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
    

    我们还要去除一些维基引用的标记、标点符号等;进一步进行清洗的函数:

    from urllib.request import urlopen 
    from bs4 import BeautifulSoup 
    import re
    import string
    
    def cleanInput(input):
        input = re.sub('\n+', " ", input) 
        input = re.sub('\[[0-9]*\]', "", input) 
        input = re.sub(' +', " ", input)
        input = bytes(input, "UTF-8")
        input = input.decode("ascii", "ignore") cleanInput = []
        input = input.split(' ')
        for item in input:
            item = item.strip(string.punctuation)
            if len(item) > 1 or (item.lower() == 'a' or item.lower() == 'i'):
                cleanInput.append(item) return cleanInput
        
    def ngrams(input, n):
        input = cleanInput(input) 
        output = []
        for i in range(len(input)-n+1):
            output.append(input[i:i+n]) 
        return output
    

    这样处理后,我们的结果就稍微好点。

    ['Linux', 'Foundation'], ['Foundation', 'Mozilla'], ['Mozilla', 'Foundation'], [
         'Foundation', 'Open'], ['Open', 'Knowledge'], ['Knowledge', 'Foundation'], ['Fou
         ndation', 'Open'], ['Open', 'Source']
    

    数据存储后再清洗

    对于编写代码清洗数据,你能做或想做的事情只有这些。除此之外,你可能还需要处理一些别人创建的数据库,或者要对一个之前没接触过的数据库进行清洗。

    主要额方法有编写脚本或者第三方工具。例如OpenRefine。本小节主要是介绍一下该软件的安装和使用。也可以理解为一个图形化的应用,对于工具类的东西我一直有一个观点:点点点,就会了;何况还是图形化的。所以我不做介绍,看一下官网的三个视频就会了。

    如果本文对你有所帮助,欢迎喜欢或者评论;如果你也对网络采集感兴趣,可以点击关注,这样就能够收到后续的更新。感谢您的阅读。

    原文地址:https://chensenlin.cn/posts/48792/

    欢迎你免费加入我的星球,一起分享,共同成长。

    知识星球

    相关文章

      网友评论

      本文标题:Python网络数据采集之数据清洗|第06天

      本文链接:https://www.haomeiwen.com/subject/lxchhftx.html