python爬虫能秒杀么_面试题之用python爬取并夕夕不同时段秒杀商品信息
先上效果圖吧(因?yàn)榇_實(shí)也是剛?cè)腴T,很多細(xì)節(jié)沒有注意到的,各位盡管提出來)
并夕夕很多時候都在不停的有秒殺商品的活動,對于價格問題,我就沒法討論了,但是人家能吸引到這么多流量,真本事還是有些的。
我只在乎他這些商品的秒殺活動我怎么把他用python爬取下來。
我先提供下url吧:https://mobile.yangkeduo.com/spike.html?__rp_name=spike_v3&_pdd_tc=ffffff&refer_share_uid=5112141669494&refer_share_id=PESOLudc1rQRf0tuIcRLKTfGwbMzRILK&_wv=41729&refer_share_channel=copy_link&_pdd_fs=1&share_uid=5112141669494&_pdd_nc=d4291d&_pdd_sbs=1&_wvx=10
先拿抓包看看,
我們知道requests請求的抓取是抓取的瀏覽器的第一個請求,拿來看看里面有沒有我想要的信息。
哦豁,第一個請求里面并沒有我要的東西,那么光只是requests.get(url)是拿不到東西的,那就得找找問題出在哪了。
實(shí)際上他的頁面請求是動態(tài)的,在network里可以看到,我只要網(wǎng)頁有往下滑,就會有新的請求在進(jìn)行,那么就是XHR的問題了,看下XHR:
里面有個這個promotion?啥啥啥的,點(diǎn)開這個的preview,發(fā)現(xiàn)了不得了的東西
這個XHR里面包含了我們所有要找的東西,商品名,商品鏈接,商品圖,價格等等,只是一個promotion只包括20個商品,所以網(wǎng)頁再往后加載又會有新的promotion把信息帶給我:
那我們的思路也有了,requests.get()請求到這些XHR,通過這幾個promotion的headers和params參數(shù)我們定位到他,但requests.get()每此只能請求一個XHR,上面這個圖就能解決問題,這三個XHR的區(qū)別只在于他們的“offset:”參數(shù)不一樣,第一個的是“offset:0”,第二個是“offset:20”,第三個是40,那我們就有辦法了。
那么我用代碼實(shí)現(xiàn)一下:
每次請求讓page遞增,然后乘以20就行了,
因?yàn)樯唐沸畔⒗锎娣诺亩际欠?wù)器的時間(以秒來計數(shù)的,例如:1598878800),我們要存下來的應(yīng)該是21:00,所以還要對時間讀取之后做替換。
我把下面我的整個程序留在下面吧,還是有很多需要改進(jìn)的地方的,請見諒:
# -*-coding = utf-8 -*-
# @Time :2020/8/31 8:30
# @Author : jamesenh
# @File : 拼多多.py
# @Software: PyCharm
import requests,time,csv
from bs4 import BeautifulSoup
def get_goods(url,headers,params): #從url獲取商品信息,再拿csv存下來
promotion = requests.get(url,headers=headers,params=params)
promotion.encoding = 'unicode_escape' #因?yàn)榕赖絩eseponse是以’unicode‘編碼方式,要轉(zhuǎn)碼成中文
promotion_json = promotion.json()
# print(promotion_json)
times = start_time(promotion_json) #獲取各個時間段的服務(wù)器對應(yīng)時間
items = promotion_json['items'] #獲取商品列表
# print(items)
# print(type(items))
for item in items: #分別提取出商品名,秒殺價,秒殺開始時間等
good_name = item['data']['goods_name']
good_price_old = item['data']['group_price_original']*0.01
good_price_mini = item['data']['price']*0.01
good_time = item['data']['start_time']
good_url_one = item['data']['link_url']
good_url = 'mobile.yangkeduo.com/'+good_url_one
good_jpeg = item['data']['hd_thumb_url']
good_time = change_time(times,good_time)
save_goods(good_name,good_price_old,good_price_mini,good_time,good_url,good_jpeg) #
print(good_name,good_price_old,good_price_mini,good_time,good_url,good_jpeg)
def get_url(page,time):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'
}
url = 'https://mobile.yangkeduo.com/proxy/api/api/spike/new/channel/promotion?'
# page = 0
params = {
'pdduid': '0',
'offset':page*20,
'limit':'20',
'tab': time,
'day_type': '2'
}
# page +=1
return url,headers,params
def save_goods(name,old,price,time,url,jpeg):
with open('拼多多.csv','a',newline='')as f:
writer = csv.writer(f)
writer.writerow([name,old,price,time,url,jpeg])
def start_time(promotion_json):
times = promotion_json['tabs']
# time = ''.join(time)
# print(times)
# print(type(times))
return times
def change_time(times,time):
for each in times:
if time == each['id']:
time = each['name']
return time
def main():
with open('拼多多.csv','w',newline='')as f:
write = csv.writer(f)
write.writerow(['商品名','商品原價','商品秒殺價','商品秒殺時間','商品詳情鏈接','商品頭圖鏈接'])
time1 = ['1598846400']
num = 1
i=0
while i <1598886000:
i = int(1598846400)+int(3600*num)
# print(i)
time1.append(i)
num +=1
# print(start_time)
for i in time1:
page = 0
while page <3:
url,headers,params = get_url(page,i)
time.sleep(5)
page += 1
get_goods(url, headers, params)
if __name__ == '__main__':
main()
總結(jié)
以上是生活随笔為你收集整理的python爬虫能秒杀么_面试题之用python爬取并夕夕不同时段秒杀商品信息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ajax链接输出数据库
- 下一篇: mysql添加索引后查询先用索引吗_my