2019年4月26日

Python爬虫如何处理不同来源的数据?

一直在做采集方面的工作,有时候我们是采集不同类型的数据,比如采集图书信息和电影信息,这类信息你不需要怎么做处理,制定好相关字段,直接存数据库就可以了;但是有时候我们需要处理不同来源的同类型数据,比如你需要采集不同来源的图书信息,来源一是淘宝的图书,来源二是京东的图书,来源三是亚马逊的图书,这个时候你就需要在采集前就把相关工作做好,不然到了后期数据清洗,数据同步会非常的麻烦。而要做好这些就需要我们对爬虫有一个清晰的认识!

爬取数据的方式

一般情况下,我们采集下来的数据都存成 json格式,也就是 Python 字典类型(Dict),字典里面的数据最好采取平铺的格式,尽量不用嵌套格式,即使要嵌套也只嵌套一层或者两层。 因为嵌套好几层,到了后面你会发现对数据的操作会变得无比麻烦,切记,切记!(如洗库等操作)

API 请求

现在稍微大一点的网站一般都会有自己的 api 接口,比如豆瓣 api,谷歌api 等等。通过 api 请求下来的数据一般都是官方定制好的,相对比较规范,但是也有例外,有的 api 请求下来的数据也会比较杂乱,需要我们自己筛选符合自己需求的数据。但是通常而言,通过 api 请求下来的数据我们不会做大的处理,根据自己的情况存库即可!

requests 请求

有些网站就不会提供自己的 api 接口,像这种情况,我们就只有通过 rquests 请求把 网页 HTML 爬取下来,自己在本地做解析。方法有很多,你可以直接通过 Pthon 的 requests 包请求或者 selenium 包模拟浏览器请求,解析数据的方式也有很多种,你可以直接用 xpath 或者 Python 的 Beautifuasoup 解析!
这种采集有个很麻烦的点就是需要你自己定数据字段,字段的格式、字段类型,这些你都需要考虑,你考虑的越全面,后面需要做的工作就越少!比如我们采集亚马逊的数据,自定义的数据格式可能如下(可以参考网页上面显示的内容定制字段):

字段名称 字段含义 字段类型
book_name 图书名字 str
book_price 图书价格 float

处理不用来源数据

说了这么多,那当我们需要采集不同来源的同类型数据时应该怎么做呢,下面我以采集不同来源的图书信息为例。

制定不同来源的数据格式

  1. 淘宝
字段名称 字段含义 字段类型
tb_name 图书名字 str
tb_price 图书价格 float
tb_desc 图书简介 str
  1. 京东
字段名称 字段含义 字段类型
jd_name 图书名字 str
jd_price 图书价格 int
jd_desc 图书简介 str
jd_author 作者 list
  1. 亚马逊
字段名称 字段含义 字段类型
awa_name 图书名字 str
awa_price 图书价格 float
awa_desc 图书简介 str
awa_pub 出版商 str

这时候你可能会发现,三个不同来源的数据不但字段名不同,字段类型也不同,这个时候我们就需要自己定一个标准,把不同来源的数据格式统一起来。

制定统一的数据格式

比如我们可以这样定制:

字段名称 字段含义 字段类型
name 图书名字 str
price 图书价格 float
desc 图书简介 str
pub 出版商 str
author 作者 list

可能有人会问,为什么不一开始就定制好统一的数据格式。如果你能预见未来会有多来源数据,你一开始就定制是没有问题的,然后按照你定制的数据格式规范后面不同来源的数据。但是大多时候,在实际开发中,我们自己是并不会知道后面会不会再继续添加新的数据来源,而且一般一开始也并不知道后面会不会添加新的字段,这些都是需要随着项目推进慢慢完善的,并不能一撮而就!

数据对照表

这个时候你就可以写一个数据对照表,以后再有新的来源,新的字段来的时候直接往数据对照表里面添加字段就可以了!下面我用一段伪代码展示下,以亚马逊图示为例:

# 亚马逊图书数据对照表
AWA_BOOK = {
    'name': 'awa_name',
    'price': 'awa_price',
    'desc': 'awa_desc',
    'pub': 'awa_pub',
}


def crawl_awa_book():
    # 采集亚马逊图书
    return result


def awa_book_operation():
    # 把亚马逊图书字段处理为自定义的标准字段格式
    data = crawl_awa_book()
    result = {}
    for awa_k, awa_v in data.items():
        for k, v in AWA_BOOK.items():
            if v==awa_k:
                result[k] = awa_v
    return result

这样是不是特别方便,如果亚马逊图书需要添加新的字段,我们只要往网亚马逊图书数据对照表添加新的字段就可以了;如果需要添加新的数据来源的话,只需要再写一个对照表就可以了,如淘宝数据对照表,京东数据对照表等等!

最后啰嗦两句,数据标准一旦定下就不要轻易更改,还有就是千万千万不要一个字段存不同的数据类型,比如同样是 name 字段,一个存的是 str 类型,一个存的是 list 类型!还有就是制定数据标准格式的时候,可以参考一些 api 是怎么制定数据格式的,一般 api 返回的数据格式都是相对标准的!

You may also like...

1 Response

  1. Frances说道:

    Hi, very nice website, cheers!
    ——————————————————
    Need cheap and reliable hosting? Our shared plans start at $10 for an year and VPS plans for $6/Mo.
    ——————————————————
    Check here: https://www.good-webhosting.com/

发表评论

电子邮件地址不会被公开。 必填项已用*标注