ITPub博客

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

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

作者:浪花小雨滴 时间:2018-11-03 15:24:51 0 删除 编辑

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

Python

简易读取

#读取csv

#加载pandas模块
import pandas as pd

#文件路径
prefix = "G:/Py/practical-machine-learning-with-python-master/notebooks/Ch03_Processing_Wrangling_and_Visualizing_Data/"
surfix = "sample_csv.csv"
file_name = prefix + surfix

df = pd.read_csv(file_name)

df

apple, 0 banana, 1 mango, 2 orange, 3 kiwi, 4 pineapple, 5 guava

#读取json

#加载json模块
import json

surfix = "sample_json.json"
file_name = prefix + surfix

json_filedata = open(file_name).read()
json_data = json.loads(json_filedata)

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 = "sample_xml.xml"
file_name = prefix + surfix


xml_filedata = open(file_name).read()
ordered_dict = xmltodict.parse(xml_filedata)

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")

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

response.status_code
200
#或者直接用
response
<Response [200]>

相信大家对“404”都非常熟悉,但是“200”就不常见,因为“200”代表我们已经请求成功,自动进入了网页。那么我们爬到了什么内容呢?看一下:

response.text

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

R

简易读取

#读csv

prefix = "G:/Py/practical-machine-learning-with-python-master/notebooks/Ch03_Processing_Wrangling_and_Visualizing_Data/"
surfix = "sample_csv.csv"
file_name = paste0(prefix,surfix)

df = read.csv(file_name)

df

apple.banana, mango, orange, kiwi, pineapple,guava

#读json

pacman::p_load("rjson")  #没有安装pacman包的请先安装,用install.packages("pacman")

surfix = "sample_json.json"
file_name = paste0(prefix,surfix)

df = fromJSON(file = file_name)

df

$outer_col_1

  1. $nested_inner_col_1 'val_1' $nested_inner_col_2 2
  2. $nested_inner_col_1 'val_2' $nested_inner_col_2 2

$outer_col_2$inner_col_1 = 3$outer_col_34

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

#读xml

pacman::p_load(XML)

surfix = "sample_xml.xml"
file_name = 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)

$category'Success'$reason'OK'$message'Success: (200) OK'

#提取爬取内容
content(response,"text")


分析

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

原文作者:;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-05-16

  • 博文量
    4259
  • 访问量
    39944