查看原文
其他

R与Python手牵手:多格式文件导入与爬虫

黄天元 R语言中文社区 2019-04-22


作者黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。

邮箱:huang.tian-yuan@qq.com


在实际操作中,数据的收集与导入往往是整个过程的开始。如果大家用过其他软件处理文件,应该都有“转格式”的不良体验。所幸,R与Python已经有大量的工具能够帮助我们直接将不同类型的数据格式直接导入到工作环境中。这次我们将要介绍怎么把外部数据导入Python和R中,主要涉及csv/json/xml三种格式,最后将会简要介绍如何进行爬虫。部分数据可以在以下网页获得:

https://github.com/dipanjanS/practical-machine-learning-with-python/tree/master/notebooks/Ch03ProcessingWrangling_andVisualizingD

Python

读取csv

#加载pandas模块 import pandas as pd


#文件路径 prefix = "G:/Py/practical-machine-learning-with-python-master/notebooks/Ch03ProcessingWranglingandVisualizingData/" surfix = "samplecsv.csv" file_name = prefix + surfix df = pd.readcsv(filename) df

读取json

#加载json模块 import json surfix = "samplejson.json" filename = prefix + surfix jsonfiledata = open(filename).read() jsondata = json.loads(jsonfiledata) json_data

得:

{'outer_col_1': [{'nested_inner_col_1': 'val_1', 'nested_inner_col_2': 2},  {'nested_inner_col_1': 'val_2', 'nested_inner_col_2': 2}], 'outer_col_2': {'inner_col_1': 3}, 'outer_col_3': 4}

感兴趣的不妨看一下json_filedata里面放的是什么形式的数据

读取xml

import xml.etree.ElementTree as ET import xmltodict surfix = "samplexml.xml" filename = prefix + surfix xmlfiledata = open(filename).read() ordereddict = xmltodict.parse(xmlfiledata) ordered_dict

得:

OrderedDict([('records',              OrderedDict([('@attr', 'sample xml records'),                           ('record',                            [OrderedDict([('@name', 'rec_1'),                                          ('sub_element',                                           OrderedDict([('detail1',                                                         'Attribute 1'),                                                        ('detail2', '2')])),                                          ('sub_element_with_attr',                                           OrderedDict([('@attr', 'complex'),                                                        ('#text',                                                         'Sub_Element_Text')])),                                          ('sub_element_only_attr',                                           OrderedDict([('@attr_val',                                                         'only_attr')]))]),                             OrderedDict([('@name', 'rec_2'),                                          ('sub_element',                                           OrderedDict([('detail1',                                                         'Attribute 1'),                                                        ('detail2', '2')])),                                          ('sub_element_with_attr',                                           OrderedDict([('@attr', 'complex'),                                                        ('#text',                                                         'Sub_Element_Text')])),                                          ('sub_element_only_attr',                                           OrderedDict([('@attr_val',                                                         'only_attr')]))]),                             OrderedDict([('@name', 'rec_3'),                                          ('sub_element',                                           OrderedDict([('detail1',                                                         'Attribute 1'),                                                        ('detail2', '2')])),                                          ('sub_element_with_attr',                                           OrderedDict([('@attr', 'complex'),                                                        ('#text',                                                         'Sub_Element_Text')])),                                          ('sub_element_only_attr',                                           OrderedDict([('@attr_val',                                                         'only_attr')]))])])]))])

pd的read_csv,json的json.loads,xmltodict的parse.针对不同的数据类型,python不同的包可谓各显神通。尽管都是一键式傻瓜操作,我们可以观察到读出数据的形式各不相同,因此后续的处理也会大相径庭,不过我们这次内容只针对导入这一步。

爬虫初步

这里讲爬虫将会针对“爬”来讲,也就是如果给大家一个网址(URL),怎么把这个网页上的所有信息都载入到我们的软件里面呢?

加载requests模块

import requests

请求网页数据

response = requests.get("http://www.apress.com/in/blog/all-blog-posts/wannacry-how-to-prepare/12302194")

就现在而言,我们已经对http://www.apress.com/in/blog/all-blog-posts/wannacry-how-to-prepare/12302194 这个网页进行请求,并把内容放在了response里面。我们先看看请求是否成功:

response.status_code

得:

200

或者直接用

response

得:

<Response [200]>

相信大家对“404”都非常熟悉,但是“200”就不常见,因为“200”代表我们已经请求成功,自动进入了网页。

爬到的是html,大家动手运行后会发现看起来有点像乱码,但是其实都具有一定的规则,只要按照规则进行提取,就能够得到我们的目标信息。


R

#读csv prefix = "G:/Py/practical-machine-learning-with-python-master/notebooks/Ch03ProcessingWranglingandVisualizingData/" surfix = "samplecsv.csv" file_name = paste0(prefix,surfix) df = read.csv(file_name) df

#读json pacman::p_load("rjson") #没有安装pacman包的请先安装,用install.packages("pacman") surfix = "samplejson.json" filename = paste0(prefix,surfix) df = fromJSON(file = file_name) df

得:

注意一定要定义参数file,否则默认条件下,fromJSON会把输入当成是json文本然后进行转化,而不是按照路径去找文件,读取文件后再转化。

读xml

pacman::p_load(XML) surfix = "samplexml.xml" filename = paste0(prefix,surfix) df = xmlParse(file_name) df


得:

<?xml version="1.0"?> <records attr="sample xml records"> <record name="rec_1"> <sub_element> <detail1>Attribute 1</detail1> <detail2>2</detail2> </sub_element> <sub_element_with_attr attr="complex"> Sub_Element_Text </sub_element_with_attr> <sub_element_only_attr attr_val="only_attr"/> </record> <record name="rec_2"> <sub_element> <detail1>Attribute 1</detail1> <detail2>2</detail2> </sub_element> <sub_element_with_attr attr="complex"> Sub_Element_Text </sub_element_with_attr> <sub_element_only_attr attr_val="only_attr"/> </record> <record name="rec_3"> <sub_element> <detail1>Attribute 1</detail1> <detail2>2</detail2> </sub_element> <sub_element_with_attr attr="complex"> Sub_Element_Text </sub_element_with_attr> <sub_element_only_attr attr_val="only_attr"/> </record> </records>

这里可以指明file = file_name,因为内置函数会判断字符串是文件路径还是URL。

爬虫初步

其实我个人经常用rvest,静态网页的爬取更像是傻瓜式的操作。但是,这里我还是使用httr包,作为对网络请求的处理,我认为这个包更加专业一些。

pacman::p_load(httr) response = GET("http://www.apress.com/in/blog/all-blog-posts/wannacry-how-to-prepare/12302194")

看状态

response$status_code

得:

200

或者用

http_status(response)

得:

提取爬取内容

content(response,"text")

(具体运行结果大家可以自己操作下,在此不展示了)

分析

首先要注意的是,python中的字符串处理,可以直接用加号,而R语言里面,必须用paste函数。读取大家都是傻瓜式一步到位,但是大家要注意导入不同的数据需要加载不同的安装包,其次是要查清楚函数参数的具体含义,否则容易报错。我们把数据加载进来之后,其实还有更多的操作提取我们需要的有效数据,大家需要了解csv/json/xml数据结构的特征,才能够用相应的技术进行操作。 讲到爬虫,其实是一门大学问,这里就只讲了静态网页如何直接爬取。其实还有动态内容的爬虫。以及爬了之后,后面还需要用xpath/CSS/正则表达式等多元化方法对需要的内容进行结构化,才能够直接使用。这里先做一个小小的启蒙,有兴趣的同学可以深入学习,其乐无穷!

大家都在看

R语言二分类问题案例分析:以泰坦尼克号沉船为例

无缝对接Spark与R:Sparklyr系列—探讨属于数据科学家的Spark

R与Python手牵手:数据的分组排序

R与Python手牵手:数据框的构建、读取与基本描述

R与Python手牵手:数据科学导论系列(包的载入)

R与Python手牵手:数据探索性分析案例展示


公众号后台回复关键字即可学习

回复 爬虫             爬虫三大案例实战  
回复 
Python        1小时破冰入门

回复 数据挖掘      R语言入门及数据挖掘
回复 
人工智能      三个月入门人工智能
回复 数据分析师   数据分析师成长之路 
回复 机器学习      机器学习的商业应用
回复 数据科学      数据科学实战
回复 常用算法      常用数据挖掘算法

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存