爬取携程和蚂蜂窝的景点评论数据\携程评论数据爬取\旅游网站数据爬取

前言

  为了获取多源数据须要到各个网站获取一些景点的评论信息和图片,首先选到了携程和蚂蜂窝这两个网站,将一些爬取过程记录下来 php

  PS:(本人长期出售超大量微博数据、旅游网站评论数据,并提供各类指定数据爬取服务,Message to YuboonaZhang@Yahoo.com。同时欢迎加入社交媒体数据交流群:99918768)html

携程

分析数据

  首先咱们去携程的鼓浪屿景点速览看一下咱们要爬取的页面,大概发现有几十个景点,每一个景点的结构应该都是差很少的,因此咱们选择第一个景点进去看看具体的页面应该怎么爬取。python

鼓浪屿评论分析

咱们须要的是红圈的部分,很容易能够知道这个评论页面是动态加载的,因此不能直接用bs4或者正则直接提取元素,咱们须要分析一下页面动态传输的接口。打开chrome审查元素,切换到network查看一下传输的内容,首先清空内容避免干扰,而后点击下一页,咱们能够获得mysql

鼓浪屿审查元素

经过查看传回的数据咱们能够获得这就是咱们所要的接口,使用的是post进行传输,传输的Form Data 有不少字段,大体能够猜想出来git

poiID 是景点的poiID pagenow 是当前的页数 star 是评分1-5,0表明所有 resourceId 是一个每一个资源对应的值

爬取的时候只须要改变这些值就能够根据本身的需求爬取内容了,可是须要注意的事携程的pagenow最多只能获取100页,并且poiID和resourceId的值是没有规律的,须要咱们逐个景点查看...我本身依次找了鼓浪屿全部景点的值,并存在文本中,文末有github的共享。github

建库

  咱们要作的第一件事就是想好数据库的结构,我选择的仍是使用mysql,具体的结构以下:ajax

携程建库

获取数据

  这个我就不具体分析了,也不难,就是有几个坑要注意一下。sql

第一,不是全部评论都有景色,性价比之类的评分,因此这里要加一个判断。 第二,原来是有出行时间这一项的,如今好像没有了额。 第三,评论文本可能会出现单引号,插入数据库会出现错误,要转义或者替代一下。 第四,抓取速度不要太快,携程反扒仍是比较厉害的。

蚂蜂窝

分析数据

  一样,蚂蜂窝的数据也是动态加载的,用相同的方法查看分析数据接口。chrome

蚂蜂窝

能够看到蚂蜂窝的数据获取方式是get,咱们能够找出请求的url的规律。通过比较不一样景点和不一样页面的数据,咱们发现参数的改变主要在两个地方,一个是poiid我用href代替,一个是页数我用num代替。获取景点的评论数据只要改变这两个值就能够了数据库

url=' http://pagelet.mafengwo.cn/po...{href}%22%2C%22page%22%3A{num}%2C%22just_comment%22%3A1%7D'

获取每一个景点的poi

这个不是post请求咱们就没必要一个个景点去获取参数了,咱们能够访问这个站点来发现全部的用户,然而这个站点的数据也是动态加载的

蚂蜂窝

蚂蜂窝

蚂蜂窝

根据上面的图片咱们能够清晰的看到咱们只须要传入页码数就能够获得全部的景点的poiid,而后根据这些poiid咱们就能够获得全部的评论数据,这一部分咱们用一个函数来处理

def get_param():
    # 获取全部景点的参数
    total = []
    router_url = 'http://www.mafengwo.cn/ajax/router.php'
    for num in range(1, 6):
        params = {
            'sAct': 'KMdd_StructWebAjax|GetPoisByTag',
            'iMddid': 12522,
            'iTagId': 0,
            'iPage': num
        }
        pos = requests.post(url=router_url, data=params, headers=headers).json()
        soup_pos = BeautifulSoup(pos['data']['list'], 'lxml')

        result = [{'scenery': p['title'], 'href': re.findall(re.compile(r'/poi/(\d+).html'), p['href'])[0]} for p in
                  soup_pos.find_all('a')]
        total.extend(result)

    return total

  其他部分类似,再也不过多说明。

下面附上个人代码

撒一波广告

本人长期出售抓取超大量微博数据的代码,并提供微博数据打包出售,Message to YuboonaZhang@Yahoo.com

我的博客

8aoy1.cn

相关文章
相关标签/搜索