Python爬虫 --爬取京东酒店旅行信息

在之前学习爬虫的过程中,发现这个网址拿来练习是非常的舒服。现在将这个爬取的过程写下来分享给大家。

网址:https://hotel.jd.com/list.html?cityId=36&cityName=北京&star=2&checkInDate=2019-04-02&checkOutDate=2019-04-03
在这里使用了第三方库 requests 2.19.1

爬虫的思路还是一样:一、请求访问服务器(获取网页字符串);二、解析数据;三、数据存储(本地文本操作)。

现在我们开始操作啦!

一、请求访问服务器,获取网页字符串

我们用谷歌浏览器进入到该网址界面,按键盘上的F12就会显示出开发者工具。
Python爬虫 --爬取京东酒店旅行信息
不按F12也可以通过Ctrl + Shift + I 显示出,再或者点浏览器右上方人像图形旁边的三个点找到更多工具再找到开发者工具。
接下来我们按F5来刷新页面通过开发者工具获取网页的详情信息。
Python爬虫 --爬取京东酒店旅行信息
通过开发者工具的功能发现网页的数据存放在XHR下的getHotelList中。
获取访问getHotelList的访问方式
Python爬虫 --爬取京东酒店旅行信息
从上图我们获取了url和**访问的方法(post)**则可以写:

response = requests.post(url,data)

来访问该网页。

二、解析数据

Python爬虫 --爬取京东酒店旅行信息
从Response中我们可以看到我们即将获取的网页数据长什么样子。这里的数据是json数据所以我们用json来解析

res = json.loads(response.text)

提取json中的数据有个小技巧,就是将它复制粘贴下来通过pycharm格式化来分析。类似下图这样:
Python爬虫 --爬取京东酒店旅行信息

三、数据存储,本地文本操作

到这里基本已经可以爬到数据了。关于存储,我之前查阅了关于打开本地文本open函数with open的区别,相比之下还是用with open会比较好一点。(你们也可以去查阅一下,这里就不多做说明了)。

  with open('F:\\酒店.txt', 'w', encoding='utf-8') as fp:
      fp.write(items)

结合上面爬取的思路整理代码…
好了,接下来就是展示代码的时间了

import requests
import json


class Spider(object):
    def response(self, url, data, headers):
        response = requests.post(url, data=data, headers=headers)
        return response

    def parse(self, response):
        res = json.loads(response.text)
        items = {}
        for i in res['body']['list']:
            items[i['name']] = i['price']
        return items

    def download(self, items):
        with open('F:\\酒店.txt', 'w', encoding='utf-8') as fp:
            for k, v in items.items():
                fp.write('%s:%d' % (k, v) + '\n')

    def crawl(self):
        crawl_headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
            'Referer': 'https://hotel.jd.com/list.html?cityId=36&cityName=%E5%8C%97%E4%BA%AC&star=2&checkInDate=2019-04-02&checkOutDate=2019-04-03',
            'Cookie': '__jdu=1400597153; areaId=19; ipLoc-djd=19-1607-3155-0; PCSYCityID=1607; shshshfpa=5dc91bd4-558f-f05e-0845-711a63bc9670-1553655263; shshshfpb=e7IhDHUS%2FucDWZ7ll4X239A%3D%3D; 3AB9D23F7A4B3C9B=SQRMRAYUZJC4KNRTNFQ7FA36BPXYZ3HJKC7LLPKD23I2HEMPF2QZ3ERGRWZ7THUD2RKOASDYEG4ZFDZUNFGIORW2NI; mt_xid=V2_52007VwMXU1xcWlwfTRtsDW8GFQEJW1BGT0ERCRliBRNRQQtUUhZVSl8BZVYQBllcU1wbeRpdBW8fE1BBW1pLHkESXgxsBhZiX2hSah1OGF0NZgcRU21bWlo%3D; shshshfp=a74e852b8be88478a1d6cbb925e7b451; _gcl_au=1.1.1474258592.1553823527; unpl=V2_ZzNtbRFVQRImC0BUe0wIDGIAQQlKAkQWfQETUSkRXgA1UEFYclRCFX0UR1FnGFwUZwYZXUJcQxRFCEdkeBBVAWMDE1VGZxBFLV0CFSNGF1wjU00zQwBBQHcJFF0uSgwDYgcaDhFTQEJ2XBVQL0oMDDdRFAhyZ0AVRQhHZHscXQRjCxRdRlVzJXI4dmR8G10AYgYiXHJWc1chVEBScxldBSoDF1xDU0sTdQxEZHopXw%3d%3d; CCC_SE=ADC_HagcdTdLh6Bd%2b9Dbuc4H1XOsneKL5%2fvGmGzPeeXT0aCVcHuXI9SA2gOKoLHZoQWEFekJJJYGaARh8NOCcJmKVDKtj3Ld%2f3IF1ob3VDZ79YIgYfYBB8jY6vJ7P4JmaPx0IwDkFXTMLW2MYlBNyJM2PPHbW5dRG%2fwB8x8xBtvT9GjwStShfLrRAzwLQPXft7PZpbIskOHjVWmguQsMTouHM4JuMzC2u0sonszJM3AtyPWMYRIw9xbhIhoEZxIEJ12N8VUH8iiNRBl8V5ow1VdzA2f3zCDkK3aruOXaReW3BsxdWQZLfEC0ChOUC73ixD8N3SPSWKFi%2b0w74COGGYV0V4k1tReagX0Mbbk5%2bS4CfzVbwmwUL5Q16698F%2fmY8oXXpyd6X6ewXZMTZmSVqOt2W%2f7sk8iWOcuQSuBli94G%2bgXCph9AVYgAbgMOd7A50YGhdQsHxCqfI%2fb1fMh3nfRCcxCOzlv7XrRAswEG1Hm5d9aq2n0g5xf7Mx4%2fubxaFVNsKTSbKIEoHkvOL%2f01uRnabLWJBTfROEe6SMpwGEwB3h8L1LWO88k%2b5gGwnYXxb0dsNYt%2fAmhv2K1BaPP7XATtQXZ0XL8KmUFXx9NKdBQsFQnegtDvKE7RC7awQxjgvx4vN%2fBwaY2oWaFTNzx9MTjh0dcDFbTI4wSLS7L%2fAkXGMOkxLPLtz%2fqHNlxKpGjbiZWIc1PWpgq8U8ijVYV3A9PlSw6svP7JWzT5bJ8CrbteLrbtRVp8vXNc2Ih%2bOXaMwfaE; __jda=122270672.1400597153.1553655131.1554091098.1554099071.6; __jdc=122270672; __jdv=122270672|baidu-pinzhuan|t_288551095_baidupinzhuan|cpc|0f3d30c8dba7459bb52f2eb5eba8ac7d_0_b336b2711de842be9d6298d4c934cbb4|1554099071187; __jdb=122270672.7.1400597153|6.1554099071',
            'Content-Length': '196'}
        crawl_url = 'https://hotel.jd.com/api/json/getHotelList'
        crawl_data = {'cityId': '36',
                      'checkInDate': '2019-04-02',
                      'checkOutDate': '2019-04-03',
                      'pageSize': '30',
                      'pageNum': '1',
                      'poi': '%5B%5D'}
        response = self.response(crawl_url, crawl_data, crawl_headers)
        items = self.parse(response)
        self.download(items)


if __name__ == '__main__':
    c = Spider()
    c.crawl()

在这份代码中我获取的是城市cityId为36的北京市,pageNum为第一页的数据。
如果小伙伴看懂了这个只爬了一个城市一页的代码,那可以再尝试爬取该市全部页数的数据。
该市有1179页数据。做到这两个的功能一个是控制pageNum变量,另一个是控制cityId变量。

只一页存储结果展示:
Python爬虫 --爬取京东酒店旅行信息
它原本的json数据中提供的信息有很多,为了观看的简洁度,这里我只提取了name和price。
如发现可以改进的地方或者哪里做得不好,希望大家能够提出多多交流。