整個分享分為下面幾個部分:
目錄
1.導(dǎo)入所需的庫
2.設(shè)定三個變量存儲從爬取的評論數(shù)據(jù)中提取的信息
3.爬取指定頁面數(shù)(total_pages)的評論數(shù)據(jù)。
4.設(shè)定postURL
6.找到景點的poild并填寫在代碼中
問題1:有時候Poild會被隱藏,所以可能需要多試幾次。(或者新開一個瀏覽器窗口復(fù)制打開)
7.發(fā)送POST請求到指定的postUrl,并加載響應(yīng)的JSON數(shù)據(jù)。
8.爬取評論接口數(shù)據(jù),提取評論信息。
9.將評論數(shù)據(jù)轉(zhuǎn)換為DataFrame格式,再保存為Excel文件
問題2:有955條評論的,但是只能爬到700多條,現(xiàn)下只能解決到這種程度了,求教希望知道怎么做的小伙伴)
下面為全部代碼,如果你著急運行請直接點到這里。
1.導(dǎo)入所需的庫
requests處理HTTP請求,json庫處理JSON數(shù)據(jù)。導(dǎo)入數(shù)據(jù)分析工具Pandas,用于創(chuàng)建和操作DataFrame。導(dǎo)入tqdm用于創(chuàng)建進(jìn)度條,提供可視化的進(jìn)度顯示。
import requests
import json
import pandas as pd
from tqdm import tqdm
2.設(shè)定三個變量存儲從爬取的評論數(shù)據(jù)中提取的信息
userNames:存儲評論中的用戶名信息。
commentDetails:存儲評論的具體內(nèi)容。
commentTimes:存儲評論的時間信息。
在代碼執(zhí)行的過程中,針對每一條評論,程序會從評論數(shù)據(jù)中提取相應(yīng)的用戶名、評論內(nèi)容和評論時間,然后將這些信息分別添加到對應(yīng)的列表中。循環(huán)結(jié)束后,列表中將包含所有評論頁面中提取的用戶名、評論內(nèi)容和評論時間的信息。
userNames = []
commentDetails = []
commentTimes = []
3.爬取指定頁面數(shù)(total_pages)的評論數(shù)據(jù)。
total_pages=14:設(shè)置了要爬取的總頁數(shù)為14頁,即爬取14次評論頁面。
total_pages = 14
forpagenintqdm(range(0,total_pages),desc='爬取進(jìn)度',unit='頁')使用for循環(huán)迭代爬取評論頁面,range(0,total_pages)生成了一個包含0到total_pages-1的整數(shù)序列,每次迭代爬取一頁評論。
payload:請求的參數(shù),包含爬取評論所需的各種信息,如評論所屬頻道類型、是否折疊、評論標(biāo)簽等。參數(shù)會在每次循環(huán)中被傳遞給請求,以獲取對應(yīng)頁面的評論數(shù)據(jù)。
postUrl:設(shè)置評論數(shù)據(jù)的請求鏈接。
這樣,通過循環(huán)遍歷,每次發(fā)送一個帶有不同頁碼的請求,從而獲取每頁的評論數(shù)據(jù)。整個過程中,進(jìn)度條顯示當(dāng)前爬取的進(jìn)度。
for pagen in tqdm(range(0, total_pages), desc='爬取進(jìn)度', unit='頁'):
payload = {
"arg": {
"channelType": 2,
"collapseTpte": 0,
"commentTagId": 0,
"pageSize": 50,#需要自己更改的地方:自己設(shè)定每頁爬多少條
"poiId": 81011,#需要自己更改的地方:為景點的信息,其他都可以直接復(fù)制
"sourseType": 1,
"sortType": 3,
"pageIndex": pagen,
"starType": 0
},
"head": {
"cid": "09031062417234242897",
"ctok": "",
"cver": "1.0",
"lang": "01",
"sid": "888",
"syscode": "09",
"auth": "",
"xsid": "",
"extension": []
}
}
4.設(shè)定postURL
postUrl是設(shè)定的評論數(shù)據(jù)請求鏈接,它是個URL。包含一些查詢參數(shù),用于定制請求的行為。
https://m.ctrip.com/restapi/soa2/13444/json/getCommentCollapseList指定請求路徑和資源路徑,告訴服務(wù)器我們想要獲取評論的折疊列表,以JSON格式返回。
這里提供其他用途的url(某處截圖到的,忘記來源了,侵刪)
綜合起來,postUrl指定了請求的服務(wù)端資源路徑,并攜帶了一些參數(shù),以獲取攜程網(wǎng)站上指定景點評論的折疊列表。
這里在(開Fn 按F12打開開發(fā)者工具)
網(wǎng)絡(luò)——>找到第二個這個包 ——>負(fù)載內(nèi)有一些我們需要的信息
6.找到景點的poild并填寫在代碼中
關(guān)鍵來了?。。。。。。。。。。∥覀円业骄包c的poild,這是我們找到那個景點的關(guān)鍵?。。╬oild需要填寫的地方在上面那段代碼里,已標(biāo)注)
那么我們?nèi)绾握业絇oild呢?
如果直接打開攜程網(wǎng)站,找到景點黃龍溪,其頁面會是這樣的:
點開點評,發(fā)現(xiàn)點評的頁面的網(wǎng)址是不改變的(翻頁了也無法看到變化,那么就麻煩了,這個頁面我無法實現(xiàn)爬取,所以另辟蹊徑了哈)
回歸到我們說找Poild的問題,請打開下面這個網(wǎng)址:
攜程旅行-酒店預(yù)訂,機(jī)票預(yù)訂查詢,旅游度假,商旅管理-攜程無線官網(wǎng)
打開是這樣的頁面:
請在搜索框輸入黃龍溪,點開這個鏈接(黃龍溪 熱門景點)
頁面是這樣的,這里就出現(xiàn)了該景點的poild為81011。
點開點評鏈接。
點開之后呈現(xiàn)的頁面如圖,然后你往下翻之后發(fā)現(xiàn)是動態(tài)頁面,向下滑動評論才會一條條蹦出來。
第二個可以獲得poild的地方(有時要多試幾次)(上面的看了,這里可以不看)
看到上面那行網(wǎng)址了吧,poild值在那段里面,你復(fù)制一下它:
【攜程攻略】攜程旅游攻略,自助游,自駕游,出游,自由行攻略指南 (ctrip.com)
它有點亂糟糟的,我們打開站長來解下碼:
解碼網(wǎng)址:UrlEncode編碼/UrlDecode解碼 - 站長工具
成功的情況:
恭喜你完成主線任務(wù)!
問題1:有時候Poild會被隱藏,所以可能需要多試幾次。(或者新開一個瀏覽器窗口復(fù)制打開)
這種是被隱藏的情況,url中沒有出現(xiàn)poild:
主要講解部分結(jié)束了,后面基本不需要做改動了。
7.發(fā)送POST請求到指定的postUrl,并加載響應(yīng)的JSON數(shù)據(jù)。
requests.post(postUrl,data=json.dumps(payload)):使用requests庫發(fā)送POST請求到指定的postUrl。
data=json.dumps(payload)將Python字典payload轉(zhuǎn)換成JSON格式的字符串,并將其作為請求的數(shù)據(jù)發(fā)送給服務(wù)器。
.text:獲取服務(wù)器響應(yīng)的內(nèi)容,這里是評論數(shù)據(jù)的JSON字符串。
html_1=json.loads(html):將獲取的JSON字符串轉(zhuǎn)換為Python對象。json.loads()函數(shù)用于解析JSON字符串,將其轉(zhuǎn)換為相應(yīng)的Python數(shù)據(jù)結(jié)構(gòu),存儲在變量html_1中。
綜合起來,向指定的攜程網(wǎng)站評論數(shù)據(jù)接口發(fā)送請求,并將得到的JSON數(shù)據(jù)加載為Python對象。
html = requests.post(postUrl, data=json.dumps(payload)).text
html_1 = json.loads(html)
8.爬取評論接口數(shù)據(jù),提取評論信息。
檢查攜程網(wǎng)站評論數(shù)據(jù)接口返回的JSON數(shù)據(jù)中是否包含名為'items'的鍵。如果存在,說明有評論數(shù)據(jù)可供提取。接著,通過遍歷commentItems列表,將每一條評論的相關(guān)信息提取并添加到對應(yīng)的列表中(userNames、commentDetails和commentTimes)。
代碼解析:
if'items'inhtml_1["result"]檢查JSON數(shù)據(jù)中是否包含"items"鍵。如果存在,說明有評論數(shù)據(jù)可供提取,進(jìn)入下一步處理。
commentItems=html_1["result"]["items"]:將評論數(shù)據(jù)提取出來,存儲在commentItems變量中。這是一個列表,每個元素代表一條評論。
foriinrange(0,len(commentItems))遍歷評論數(shù)據(jù)列表,處理每一條評論。
ifcommentItems[i]isnotNoneand'userInfo'incommentItems[i]and'userNick'incommentItems[i]['userInfo']::在訪問元素之前檢查當(dāng)前評論項是否不為None,并且該評論項包含'userInfo'鍵和'userNick'鍵。這是為了確保評論數(shù)據(jù)中包含用戶信息,并且該用戶信息中包含用戶名。將提取的用戶名、評論內(nèi)容和評論時間分別添加到userNames、commentDetails和commentTimes列表中。
# 檢查響應(yīng)中是否存在'items'
if 'items' in html_1["result"]:
commentItems = html_1["result"]["items"]
for i in range(0, len(commentItems)):
# 在訪問元素之前檢查當(dāng)前項是否不為None
if commentItems[i] is not None and 'userInfo' in commentItems[i] and 'userNick' in commentItems[i]['userInfo']:
userName = commentItems[i]['userInfo']['userNick']
commentDetail = commentItems[i]['content']
commentTime = commentItems[i]['publishTypeTag']
userNames.append(userName)
commentDetails.append(commentDetail)
commentTimes.append(commentTime)
9.將評論數(shù)據(jù)轉(zhuǎn)換為DataFrame格式,再保存為Excel文件
# 創(chuàng)建 DataFrame
df = pd.DataFrame({
'用戶評論內(nèi)容': commentDetails,
'用戶名': userNames,
'用戶評論時間': commentTimes
})
# 保存到 Excel 文件
df.to_excel('只爬黃龍溪評論1223url.xlsx', index=False, encoding='utf-8')
獲得的信息有700條,保存為excel文件。
問題2:有955條評論的,但是只能爬到700多條,現(xiàn)下只能解決到這種程度了,求教希望知道怎么做的小伙伴)
文章來源:http://www.zghlxwxcb.cn/news/detail-766622.html
下面為全部代碼,如果你著急運行請直接點到這里。
import requests
import json
import pandas as pd
from tqdm import tqdm
userNames = []
commentDetails = []
commentTimes = []
total_pages = 14
for pagen in tqdm(range(0, total_pages), desc='爬取進(jìn)度', unit='頁'):
payload = {
"arg": {
"channelType": 2,
"collapseTpte": 0,
"commentTagId": 0,
"pageSize": 50,
"poiId": 81011,#需要自己更改的地方 為景點的信息 其他都可以直接復(fù)制
"sourseType": 1,
"sortType": 3,
"pageIndex": pagen,
"starType": 0
},
"head": {
"cid": "09031062417234242897",
"ctok": "",
"cver": "1.0",
"lang": "01",
"sid": "888",
"syscode": "09",
"auth": "",
"xsid": "",
"extension": []
}
}
postUrl = "https://m.ctrip.com/restapi/soa2/13444/json/getCommentCollapseList"
html = requests.post(postUrl, data=json.dumps(payload)).text
html_1 = json.loads(html)
# 檢查響應(yīng)中是否存在'items'
if 'items' in html_1["result"]:
commentItems = html_1["result"]["items"]
for i in range(0, len(commentItems)):
# 在訪問元素之前檢查當(dāng)前項是否不為None
if commentItems[i] is not None and 'userInfo' in commentItems[i] and 'userNick' in commentItems[i]['userInfo']:
userName = commentItems[i]['userInfo']['userNick']
commentDetail = commentItems[i]['content']
commentTime = commentItems[i]['publishTypeTag']
userNames.append(userName)
commentDetails.append(commentDetail)
commentTimes.append(commentTime)
# 創(chuàng)建 DataFrame
df = pd.DataFrame({
'用戶評論內(nèi)容': commentDetails,
'用戶名': userNames,
'用戶評論時間': commentTimes
})
# 保存到 Excel 文件
df.to_excel('只爬黃龍溪評論1223url.xlsx', index=False, encoding='utf-8')
小白寫文,有問題請多多指教。文章來源地址http://www.zghlxwxcb.cn/news/detail-766622.html
到了這里,關(guān)于Python爬攜程指定景點評論的用戶、評論內(nèi)容及時間(景點黃龍溪為例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!