1. 程式人生 > >R與Python手牽手:多格式檔案匯入與爬蟲

R與Python手牽手:多格式檔案匯入與爬蟲

640?wx_fmt=gif

作者黃天元,復旦大學博士在讀,目前研究涉及文字挖掘、社交網路分析和機器學習等。希望與大家分享學習經驗,推廣並加深R語言在業界的應用。

郵箱:[email protected]


在實際操作中,資料的收集與匯入往往是整個過程的開始。如果大家用過其他軟體處理檔案,應該都有“轉格式”的不良體驗。所幸,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

640?wx_fmt=png

讀取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,大家動手執行後會發現看起來有點像亂碼,但是其實都具有一定的規則,只要按照規則進行提取,就能夠得到我們的目標資訊。


640?wx_fmt=gif

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

640?wx_fmt=png

#讀json
pacman::p_load("rjson") #沒有安裝pacman包的請先安裝,用install.packages("pacman")
surfix = "samplejson.json" filename = paste0(prefix,surfix)
df = fromJSON(file = file_name)
df 

得:

640?wx_fmt=png

注意一定要定義引數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)

得:

640?wx_fmt=png

提取爬取內容

content(response,"text")

(具體執行結果大家可以自己操作下,在此不展示了)

分析

首先要注意的是,python中的字串處理,可以直接用加號,而R語言裡面,必須用paste函式。讀取大家都是傻瓜式一步到位,但是大家要注意匯入不同的資料需要載入不同的安裝包,其次是要查清楚函式引數的具體含義,否則容易報錯。我們把資料載入進來之後,其實還有更多的操作提取我們需要的有效資料,大家需要了解csv/json/xml資料結構的特徵,才能夠用相應的技術進行操作。 講到爬蟲,其實是一門大學問,這裡就只講了靜態網頁如何直接爬取。其實還有動態內容的爬蟲。以及爬了之後,後面還需要用xpath/CSS/正則表示式等多元化方法對需要的內容進行結構化,才能夠直接使用。這裡先做一個小小的啟蒙,有興趣的同學可以深入學習,其樂無窮!

640?wx_fmt=gif

大家都在看

R語言二分類問題案例分析:以泰坦尼克號沉船為例

無縫對接Spark與R:Sparklyr系列—探討屬於資料科學家的Spark

R與Python手牽手:資料的分組排序

R與Python手牽手:資料框的構建、讀取與基本描述

R與Python手牽手:資料科學導論系列(包的載入)

R與Python手牽手:資料探索性分析案例展示


640?wx_fmt=jpeg

公眾號後臺回覆關鍵字即可學習

回覆 爬蟲             爬蟲三大案例實戰  
回覆 
Python        1小時破冰入門

回覆 資料探勘      R語言入門及資料探勘
回覆 
人工智慧      三個月入門人工智慧
回覆 資料分析師   資料分析師成長之路 
回覆 機器學習      機器學習的商業應用
回覆 資料科學      資料科學實戰
回覆 常用演算法      常用資料探勘演算法