携程ホテルデータ爬取(新)
携程ホテルデータ爬取(新)
前言:携程のホームページの変化と絶えず爬虫類に反撃するため、現在多くの携程の爬虫類コードがデータを取得できない.本文の核心:cookiesを交換する価値のある携程ホテルのデータによると、主に以下の4つの部分が含まれている. headers data json解析 完全コード 前言
環境:python 3.6+requestsファイルの書き込み操作の一部を含む
1、headers
爬虫類プログラムはブラウザの真似をしてアクセスする必要があるので、headersのプロパティは少なくなく、Webページで簡単に見つけることができます.
重要な部分はcookiesです.cookiesがないと検証に直接失敗し、空のデータが取得され、cookiesにログインしたcookiesが必要になります.
2、data属性
データインタフェースを使用してデータを抽出するため、正確な戻り値を得るには、対応するdata属性を主に組み合わせます.ブラウザ検索では、ヘッダから必要なdataプロパティを見つけることができます.
3、json解析
正確なデータインタフェースを見つけた後、requestsライブラリを利用してgetまたはpostリクエストを送信し、前のheadersとdataパラメータをつなぎ、対応するjsonデータを得る必要があります.得られたjsonデータは、リンク、スコア、アドレスなど、スライスを用いて様々な属性値を得ることができる.
4、完全なコード
備考:xiechengのウェブサイトはよく改版が発生して、このプログラムは学習にのみ使用します
前言:携程のホームページの変化と絶えず爬虫類に反撃するため、現在多くの携程の爬虫類コードがデータを取得できない.本文の核心:cookiesを交換する価値のある携程ホテルのデータによると、主に以下の4つの部分が含まれている.
環境: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のウェブサイトはよく改版が発生して、このプログラムは学習にのみ使用します