携程ホテルデータ爬取(新)

5231 ワード

携程ホテルデータ爬取(新)
前言:携程のホームページの変化と絶えず爬虫類に反撃するため、現在多くの携程の爬虫類コードがデータを取得できない.本文の核心:cookiesを交換する価値のある携程ホテルのデータによると、主に以下の4つの部分が含まれている.
  • headers
  • data
  • json解析
  • 完全コード
  • 前言
    環境:python 3.6+requestsファイルの書き込み操作の一部を含む
    1、headers
    爬虫類プログラムはブラウザの真似をしてアクセスする必要があるので、headersのプロパティは少なくなく、Webページで簡単に見つけることができます.
    headers = {
            "Connection": "keep-alive",
            "Cookie":cookies,
            "origin": "https://hotels.ctrip.com",
            "Host": "hotels.ctrip.com",     
            "referer": "https://hotels.ctrip.com/hotel/qamdo575",
            "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36",
            "Content-Type":"application/x-www-form-urlencoded; charset=utf-8"
        }
    

    重要な部分はcookiesです.cookiesがないと検証に直接失敗し、空のデータが取得され、cookiesにログインしたcookiesが必要になります.
    2、data属性
    データインタフェースを使用してデータを抽出するため、正確な戻り値を得るには、対応するdata属性を主に組み合わせます.ブラウザ検索では、ヘッダから必要なdataプロパティを見つけることができます.
    data = {
                "StartTime": "2020-10-09",
                "DepTime": "2019-10-10",
                "RoomGuestCount": "1,1,0",
                "cityId": 575,
                "cityPY": "qamdo",
                "cityCode": "0895",
                "page": page
            }
    

    3、json解析
    正確なデータインタフェースを見つけた後、requestsライブラリを利用してgetまたはpostリクエストを送信し、前のheadersとdataパラメータをつなぎ、対応するjsonデータを得る必要があります.得られたjsonデータは、リンク、スコア、アドレスなど、スライスを用いて様々な属性値を得ることができる.
     html = requests.post(url, headers=headers, data=data)
     hotel_list = html.json()["hotelPositionJSON"]
    

    4、完全なコード
    # coding=utf8
    import numpy as np
    import pandas as pd
    from bs4 import BeautifulSoup
    import requests
    import random
    import time
    import csv
    import json
    import re
    from tqdm import tqdm
    # Pandas display option
    pd.set_option('display.max_columns', 10000)
    pd.set_option('display.max_rows', 10000)
    pd.set_option('display.max_colwidth', 10000)
    pd.set_option('display.width',1000)
    
    url = "https://hotels.ctrip.com/Domestic/Tool/AjaxHotelList.aspx"
    filename = "F:\\aaa\\changdu.csv"
    print(requests.post(url))
    def Scrap_hotel_lists():
        cookies = ''' ......"'
        headers = {
            "Connection": "keep-alive",
            "Cookie":cookies,
            "origin": "https://hotels.ctrip.com",
            "Host": "hotels.ctrip.com",     
            "referer": "https://hotels.ctrip.com/hotel/qamdo575",
            "user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36",
            "Content-Type":"application/x-www-form-urlencoded; charset=utf-8"
        }
        id = []
        name = []
        hotel_url = []
        address = []
        score = []
        star = []
        stardesc=[]
        lat=[]
        lon=[]
        dpcount=[]
        dpscore=[]
        for page in tqdm(range(1,13) ,desc='   ',ncols=10):
            data = {
                "StartTime": "2020-10-09",
                "DepTime": "2019-10-10",
                "RoomGuestCount": "1,1,0",
                "cityId": 575,
                "cityPY": "qamdo",
                "cityCode": "0895",
                "page": page
            }
            html = requests.post(url, headers=headers, data=data)
            hotel_list = html.json()["hotelPositionJSON"]
            for item in hotel_list:
                print(item)
                id.append(item['id'])
                name.append(item['name'])
                hotel_url.append(item['url'])
                address.append(item['address'])
                score.append(item['score'])
                stardesc.append(item['stardesc'])
                lat.append(item['lat'])
                lon.append(item['lon'])
                dpcount.append(item['dpcount'])
                dpscore.append(item['dpscore'])
                if(item['star']==''):
                    star.append('NaN')
                else:
                    star.append(item['star'])
            time.sleep(random.randint(3,5))
        hotel_array = np.array((id, name, score, hotel_url, address,star,stardesc,lat,lon,dpcount,dpscore)).T
        list_header = ['id', 'name', 'score', 'url', 'address',
                       'star','stardesc','lat','lon','dpcount','dpscore']
        array_header = np.array((list_header))
        hotellists = np.vstack((array_header, hotel_array))
        with open(filename, 'w', encoding="utf-8-sig", newline="") as f:
            csvwriter = csv.writer(f, dialect='excel')
            csvwriter.writerows(hotellists)
    if __name__ == "__main__":
        Scrap_hotel_lists()
        df = pd.read_csv(filename, encoding='utf8')
        print(df)
    

    備考:xiechengのウェブサイトはよく改版が発生して、このプログラムは学習にのみ使用します