一起學爬蟲(Python) — 19 年輕人,進來學自動化
這里呢,還是宣傳一下這個跟自動除錯有關系的一篇博客,為什么呢,因為她能幫你們自動給我的博客點贊!!!

誒嘿嘿,各位一定不會想白嫖吧,
蟬媽媽,嘿嘿
- 前言
- 蟬媽媽
- 何為蟬媽媽
- 今天的目標
- 了解一下cookies
- 了解一下蟬媽媽
- 開沖
- 全部代碼
- 結尾
前言
經過兩到三天的咕咕咕,小澤發現這個瀏覽量是蹭蹭蹭的往上漲,頓時變得無比納悶,為什么我不勤奮更新了反而看的人變多了呢…
難道…
這是大家在用事實告訴我,更新是錯誤的,咕咕咕才是我應該做的嗎!
帶師,我悟了,

當然,拖更是不可能的,這輩子也不可能的,其實這段時間小澤在忙一個大專案,是跟騰訊合作的大專案,具體有多大呢,牽扯到的人數有千萬級別,里面的利于更是千億級別的,沒錯!
這幾天我在努力的打王者榮耀,

然鵝卡在鉆石上不去了T-T
氣啊,贏一局輸一局,這還怎么玩嘛!
只能靠低保過過日子,沒有保級卡就不敢開排位,

所以經過一系列的打擊之后呢,就來給大家更新了,絕對不是因為事業不順哦,完全是心心念念我的小粉絲們好吧!!!
為什么要說這么多廢話呢,你是不是看的津津有味,但是你不知道的是,我已經成功的水了將近一千的字數,啊哈哈哈哈哈哈哈哈哈哈哈哈哈哈…
那,廢話不多說,咱們開干!
蟬媽媽
何為蟬媽媽
神奇の傳送門
蟬媽媽呢,大家可以這么理解,就是一個幫我們統計哪些商品賣的好的一個平臺,通過她我們就可以知道如果想要賣東西可以進那些貨…當然以上都是我亂說的,因為她已經被我摸透了吧,

今天的目標
實作模擬登陸,并且爬取登錄后查詢到的商品資訊,
為什么呢,因為如果不是登錄狀態的話,我們只能獲取前10條資訊,當然登錄后如果不是VIP會員的話也只能獲取前50條哦,不過一開始好像是可以免費領取VIP會員的,具體的你們可以去官網了解一下,
如果今天的內容你掌握了呢,你就可以試著繞過很多網站的登錄,直接獲取登錄后的資訊,
就是不用輸賬號密碼,
了解一下cookies
為什么要了解cookies呢,我們今天主要解決的就是這個cookies的問題哦,
大家想一下,我們對一個網站進行登錄,是不是只需要登錄一遍就可以了!
后續再進行修改用戶資訊,站內查詢等等功能的話,都不需要重新登陸吧,那么她是怎么知道我們在進行這些操作的時候,是已經登錄的了呢,為什么我們在python里面直接發起請求就不可以呢???
這一切的一切的背后,究竟是道德的淪喪,還是人性的扭曲…歡迎收看午夜節目,小澤的爬蟲教學!

其實啊,這背后都是cookies這個玩意在作祟,我們登錄的時候呢,我就會好奇一個問題,到底是登錄還是登陸呢?知道的小伙伴把答案打在留言里,這里我就統一暫時先用登錄好了,因為登陸的話怎么看都像是登陸,對吧,簡直一模一樣,
又水了一波字數,
我們在登錄的時候,本身就有一個cookies吧,這個cookies呢大家可以理解為登錄前的cookies,也就是保存了我們的一些用戶資訊(不是登陸后的用戶資訊哦,是我們這個電腦的用戶資訊),用來跟服務器做互動,然后交配成功的話,服務器就會發給我們一個兩條杠的棒棒,對吧,沒有開車,這個棒棒里呢,就包含了服務器回傳的cookies,也就是聯系方式吧,大家以后再來往哈,
然后呢,我們再對這個網站的其他頁面進行訪問的時候,瀏覽器就會自動的帶上服務器回傳的cookies,服務器呢也就不需要我們進行賬號密碼的輸入,也能知道,原來是熟客鴨,
就直接開始那個了嘛,
你懂吧,

至于cookies里面包含什么呢,大家可以去我的合作伙伴那里,就是百度哦,了解一下,她應該是會告訴你的,如果她也不告訴你,那我再告訴你好了,
這里我們只要知道,我們需要取得登錄成功后回傳的cookies,然后每次訪問的時候把這個cookies戴上去就ok了對吧,那你就要問了,你之前明明說好的用session就行了鴨,怎么這個時候又要手動戴上cookies了呢,無良博主,還我青春!
咳咳,網站的反爬措施也會升級的嘛,別那么講究啦~
還有哦,cookies一定是在請求頭里的,當然你也可以在requests里手動寫上,不過我是直接放到headers里,省事,
說真的,打了這么多cookies,我都快不認識cookies了,看到這里的小可愛們點個贊再繼續看吧,求求了!!!

了解一下蟬媽媽
每一位媽媽都是偉大的…
除了蟬媽媽,

打開一開始給大家的神奇の傳送門,會發現這個網站其實還蠻好看的,大家可以在沒登錄之前,隨便搜索一些東西,看一看效果,
這里我們再進去登錄界面看一看:

應該是沒有驗證碼的,我目前還沒見到過,如果有說明你有問題,
也就是說我們需要在這個界面進行一個模擬登陸,然后獲得服務器給我們回傳的cookies值,再把這個值加到我們的headers里面,就可以進行一個登錄后的資料搜索了,對吧,
沖唄,
開沖
老規矩,先打開抓包工具,然后登錄,這里我們輸入一個錯的密碼就可以了:

發現有兩個包哦,第二個沒有資料的嘛,所以不管,直接看第一個:

點進去看到,里面放著我們的賬號和密碼,還有一個時間戳,針不戳,
而且還是一個post請求吧:

同時回傳的資料也需要json()一下,

在請求頭里呢,也發現了我們登錄前的cookies,因為要互動的嘛,所以就帶上吧,還有一個Referer,如果看到這個的話,大家最好是帶上,這個東西是證明我們不是通過其他鏈接訪問的,
User-Agent,老朋友了,
headers = {
# 登錄前的cookie
'Cookie': 'Hm_lvt_1f19c27e7e3e3255a5c79248a7f4bdf1=1607054172,1607241195,1607485551,1609118533; Hm_lpvt_1f19c27e7e3e3255a5c79248a7f4bdf1=1609118533; Hm_lvt_ce889f3ae5bf6277ca4cbf05b940acbc=1609118534; Hm_lpvt_ce889f3ae5bf6277ca4cbf05b940acbc=1609118534',
# 證明我們不是通過外部鏈接過來的
'Referer': 'https://www.chanmama.com/login',
# 瀏覽器相關的資訊啦
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
不要直接復制我的哦,去復制你那邊的去,哼!
然后我們再把我們的登錄界面的url放進去~
# 登錄頁面
downlod_url = 'https://api-service.chanmama.com/v1/access/token'
還有時間戳!
# 時間戳,先弄成整數型的,再弄成字串
timeStamp = str(int(time.time()))
以及我們發送請求時需要攜帶的引數!當然也不要忘了手動json化一下,需要匯入json的模塊哦,
import json
# 發起請求時攜帶的引數
data = {
'appId': '10000',
'password': password,
'timeStamp': timeStamp,
'username': username,
}
# 對引數json化一下
data = json.dumps(data)
一切都準備好后,就可以對url發起請求啦~
這里為什么是downlod_url呢,因為小澤一開始以為downlod就是登錄,好像不是吧,是下載來的吧,唉,英語差就是這樣啦,

import requests
# 發起一個post請求,回傳的資料也是json型別的,用res接一下
res = requests.post(downlod_url,headers=headers,data=data).json()
大家可以列印一下res,觀察一下回傳了一個什么,
各位會發現里面有個token哦,并不是我們想要的cookies,
這里呢,給大家科普一下token和cookies的區別:
cookies呢,可以理解為是比較高級的身份驗證,需要的東西比較多,光告訴我們是誰還不夠,
而token呢,只要告訴服務器我們是誰就可以了,服務器那邊是不會存我們的相關資訊的,相對應的cookies是需要進一步跟服務器進行互動驗證的,
也就是說,是token的話反而更簡單了,
其實一開始看請求頭的時候,就該知道是token了:

在這個Authorization相對應的鍵值里是空的吧,她就是用來放token的,我們只需要在請求頭里放入這個Authorization并且后面帶上token就ok了,
# 回傳了一個json串,里面有一個鍵值是'errCode',大家可以自己試一下故意輸錯密碼,或者帶錯引數,回傳的都不是0
# 也就是說只有回傳的'errCode'是0的情況下才說明我們登錄成功了!
print(res)
既然進行模擬登錄了,就要知道我們的登錄有沒有成功吧,下面就是驗證的方法哦,
# 進行登錄是否成功的一個驗證,回傳的鍵值里面是數字嘛,所以0就不用帶引號了
if res['errCode'] == 0:
print('登陸成功')
# 處理我們的token,放在請求頭中
headers['Authorization'] = res['data']['token']
# 這里因為小澤是寫在一個函式里的,所以return了一下,你們也可以把上面的都放在函式里
return headers
else:
print('沒了,看看是密碼錯了還是引數帶錯了吧,')
上面的步驟走完之后,我們就拿到了包含有token的請求頭資訊吧,也就是headers,只要我們用這個headers發起請求,服務器一定會乖乖服從吧,開干吧!
def get_data(headers,key,nums):
# 搜索界面的url
url = 'https://api-service.chanmama.com/v1/product/search'
# 發起請求時攜帶的引數
data = {
# 要搜索的東西
"keyword": key,
"keyword_type": "",
"page": 1,
"price": "",
# 數量
"size": nums,
"filter_coupon": 0,
"is_aweme_goods": 0,
"has_live": 0,
"has_video": 0,
"tb_max_commission_rate": "",
"day_pv_count": "",
"day_order_count": "",
"big_category": "",
"first_category": "",
"second_category": "",
"platform": "",
"sort": "day_order_count",
"order_by": "desc"
}
# 這里為什么用json=而不用data=呢,是json可以幫我們跟網頁說這個資料你需要自己弄成json串
# 使用data傳參的話,是支持嵌套字典的,兩者都可以用,當然這里你也可以選擇手動處理一下data
res = requests.post(url, json=data, headers=headers).json()
# 用w的話,如果檔案不存在會自動創建一個檔案,但是每次都會覆寫上一次的內容,也就是說不能累加,如果想追加就用a
with open('蟬媽媽.txt', 'w', encoding='utf-8') as fp:
# 如果不懂可以列印一下res看看
for i in res['data']['list']:
# 這里可以用%,也可以用format等等,甚至可以手動拼接,方法很多
print("商品:%s 價格:%s 原價:%s 昨日瀏覽:%s 昨日銷量:%s" % (
i['title'], i['price'], i['market_price'], i['day_pv_count'], i['day_order_count']))
# 寫入,每一行都要加個換行
fp.write("商品:%s 價格:%s 原價:%s 昨日瀏覽:%s 昨日銷量:%s\n" % (
i['title'], i['price'], i['market_price'], i['day_pv_count'], i['day_order_count']))
盡量的把注釋寫的很明白了,除了一些基礎類的,這方面的url呢,是在登錄后進行搜索商品的時候抓包找到的,相關的知識前面也重復過很多次了,相信各位勤奮好學的小可愛一定能再學一遍,徹底摸透!
加油,編程人!

全部代碼
import requests
import json
import time
# 獲取登錄后的cookie
def get_cookies(username,password):
headers = {
# 登錄前的cookie
'Cookie': 'Hm_lvt_1f19c27e7e3e3255a5c79248a7f4bdf1=1607054172,1607241195,1607485551,1609118533; Hm_lpvt_1f19c27e7e3e3255a5c79248a7f4bdf1=1609118533; Hm_lvt_ce889f3ae5bf6277ca4cbf05b940acbc=1609118534; Hm_lpvt_ce889f3ae5bf6277ca4cbf05b940acbc=1609118534',
# 證明我們不是通過外部鏈接過來的
'Referer': 'https://www.chanmama.com/login',
# 瀏覽器相關的資訊啦
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
# 登錄頁面
downlod_url = 'https://api-service.chanmama.com/v1/access/token'
# 時間戳,先弄成整數型的,再弄成字串
timeStamp = str(int(time.time()))
# 發起請求時攜帶的引數
data = {
'appId': '10000',
'password': password,
'timeStamp': timeStamp,
'username': username,
}
# 對引數json化一下
data = json.dumps(data)
# 發起一個post請求,回傳的資料也是json型別的,用res接一下
res = requests.post(downlod_url,headers=headers,data=data).json()
# 回傳了一個json串,里面有一個鍵值是'errCode',大家可以自己試一下故意輸錯密碼,或者帶錯引數,回傳的都不是0
# 也就是說只有回傳的'errCode'是0的情況下才說明我們登錄成功了!
# print(res)
# 進行登錄是否成功的一個驗證,回傳的鍵值里面是數字嘛,所以0就不用帶引號了
if res['errCode'] == 0:
print('成功取得cookies!')
# 處理我們的cookies
headers['Authorization'] = res['data']['token']
return headers
else:
print('沒了,看看是密碼錯了還是引數帶錯了吧,')
def get_data(headers,key,nums):
# 搜索界面的url
url = 'https://api-service.chanmama.com/v1/product/search'
# 發起請求時攜帶的引數
data = {
# 要搜索的東西
"keyword": key,
"keyword_type": "",
"page": 1,
"price": "",
# 數量
"size": nums,
"filter_coupon": 0,
"is_aweme_goods": 0,
"has_live": 0,
"has_video": 0,
"tb_max_commission_rate": "",
"day_pv_count": "",
"day_order_count": "",
"big_category": "",
"first_category": "",
"second_category": "",
"platform": "",
"sort": "day_order_count",
"order_by": "desc"
}
# 這里為什么用json=而不用data=呢,是json可以幫我們跟網頁說這個資料你需要自己弄成json串
# 使用data傳參的話,是支持嵌套字典的,兩者都可以用,當然這里你也可以選擇手動處理一下data
res = requests.post(url, json=data, headers=headers).json()
# 用w的話,如果檔案不存在會自動創建一個檔案,但是每次都會覆寫上一次的內容,也就是說不能累加,如果想追加就用a
with open('蟬媽媽.txt', 'w', encoding='utf-8') as fp:
# 如果不懂可以列印一下res看看
for i in res['data']['list']:
# 這里可以用%,也可以用format等等,甚至可以手動拼接,方法很多
print("商品:%s 價格:%s 原價:%s 昨日瀏覽:%s 昨日銷量:%s" % (
i['title'], i['price'], i['market_price'], i['day_pv_count'], i['day_order_count']))
# 寫入,每一行都要加個換行
fp.write("商品:%s 價格:%s 原價:%s 昨日瀏覽:%s 昨日銷量:%s\n" % (
i['title'], i['price'], i['market_price'], i['day_pv_count'], i['day_order_count']))
if __name__ == '__main__':
# 這里面輸入你的賬號和密碼(第一個引數是帶有登錄后cookies的headers,第二個引數是要搜索的商品,第三個引數是要的數量,不是vip的話最多50條)
# get_cookies(賬號,密碼)會回傳一個有登錄后cookies的headers,當然,你得把你的賬號密碼寫進去,是以字串的形式哦
get_data(get_cookies('',''),'絲襪',50)
結尾
我干飯去了,拜拜,
哦對了,如果你需要一個可以交流的地方的話,可以考慮一下這里:

170個妹紙,快來撩妹吧!
干飯人,干飯魂,談戀愛哪有干飯香,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/241883.html
標籤:其他
上一篇:十六進制大整數加法
