python电商爬虫源码_吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据...
由于這里的目標(biāo)是獲取整個(gè)自由行的產(chǎn)品列表,因此還需要獲取出發(fā)站點(diǎn)的列表,從不同的城市出發(fā),會(huì)有不用的產(chǎn)品。
返回自由行的首頁,單擊搜索框左側(cè)的出發(fā)站點(diǎn),如下圖:
切換到Headers界面:
可以看到此時(shí)目標(biāo)的URL是:https://touch.dujia.qunar.com/depCities.qunar
開始分析該網(wǎng)站的爬蟲工作流程分析步驟:
1 獲取出發(fā)地站點(diǎn)列表
2 獲取旅游景點(diǎn)列表
3 獲取景點(diǎn)產(chǎn)品列表
4 存儲(chǔ)數(shù)據(jù)
#首先獲取出發(fā)站點(diǎn),代碼如下:
importrequests
url= 'https://touch.dujia.qunar.com/depCities.qunar'strhtml=requests.get(url)
dep_dict=strhtml.json()for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:print(dep)
。。。。。。。。。
在獲取數(shù)據(jù)的時(shí)候需要將最后一個(gè)callback參數(shù)刪掉。因此目標(biāo)URL如下:
https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep=%E6%B7%B1%E5%9C%B3&exclude=&extensionImg=255,175
#然后根據(jù)出發(fā)地站點(diǎn)獲取目的地,代碼如下:
importtimeimporturllibimportrequests
url= 'https://touch.dujia.qunar.com/depCities.qunar'strhtml=requests.get(url)
dep_dict=strhtml.json()for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:print(dep)
url= 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep))
time.sleep(3)
strhtml=requests.get(url)
arrive_dict=strhtml.json()for arr_item in arrive_dict['data']:for arr_item_1 in arr_item['subModules']:for query in arr_item_1['items']:print(query['query'])
.................
到達(dá)的 目的地有很多,上面這段代碼也要運(yùn)行很長(zhǎng)時(shí)間,運(yùn)行截圖也是一部分的,篇幅有限還有很多地點(diǎn)沒有展示,但很容易看到許多的目的地是重復(fù)的,
原因也很簡(jiǎn)單一個(gè)目的地多數(shù)都是對(duì)應(yīng)這多個(gè)出發(fā)點(diǎn)的,按出發(fā)點(diǎn)分別來找目的地的話最后打印尋找到的目的地肯定有許多也就是重復(fù)的了,所以接下來
就是要對(duì)目的地進(jìn)行去重,代碼修改后,如下:
#然后根據(jù)出發(fā)地站點(diǎn)獲取目的地,代碼如下:
importtimeimporturllibimportrequests
url= 'https://touch.dujia.qunar.com/depCities.qunar'strhtml=requests.get(url)
dep_dict=strhtml.json()for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:#這里聲明一個(gè)列表a用來保存當(dāng)前這個(gè)出發(fā)點(diǎn)對(duì)應(yīng)的所有目的地
a =[]print(dep)
url= 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep))
time.sleep(3)
strhtml=requests.get(url)
arrive_dict=strhtml.json()for arr_item in arrive_dict['data']:for arr_item_1 in arr_item['subModules']:for query in arr_item_1['items']:#如果當(dāng)前這個(gè)目的地不在a中的話,那就添加進(jìn)去,否則不添加,這樣就可以達(dá)到目的地去重的目的了
if(query['query'] not ina):
a.append(query['query'])#打印當(dāng)前出發(fā)點(diǎn)所有對(duì)應(yīng)的不重復(fù)的目的地點(diǎn)
print(a)
這樣每個(gè)出發(fā)點(diǎn)對(duì)應(yīng)的目的點(diǎn)打印出來也好看清晰了許多。
完成了出發(fā)點(diǎn)和目的地的構(gòu)建之后,接下來就要獲取產(chǎn)品列表了。代碼如下:
#獲取產(chǎn)品列表
importtimeimporturllibimportpymongoimportrequests#使用MongoDB創(chuàng)建數(shù)據(jù)庫、表
client = pymongo.MongoClient('localhost',27017)
book_qunar= client['qunar']
sheet_qunar_zyx= book_qunar['qunar_zyx']#獲取產(chǎn)品
url = 'https://touch.dujia.qunar.com/depCities.qunar'strhtml=requests.get(url)
dep_dict=strhtml.json()for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:#這里聲明一個(gè)列表a用來保存當(dāng)前這個(gè)出發(fā)點(diǎn)對(duì)應(yīng)的所有目的地
a =[]
url= 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep))
time.sleep(3)
strhtml=requests.get(url)
arrive_dict=strhtml.json()for arr_item in arrive_dict['data']:for arr_item_1 in arr_item['subModules']:for query in arr_item_1['items']:#如果當(dāng)前這個(gè)目的地不在a中的話,那就添加進(jìn)去,否則不添加,這樣就可以達(dá)到目的地去重的目的了
if(query['query'] not ina):
a.append(query['query'])#逐個(gè)地取出當(dāng)前出發(fā)點(diǎn)對(duì)應(yīng)的目的地item
for item ina:
url= 'https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep={}&query={}&dappDealTrace=true&mobFunction=%E6%89%A9%E5%B1%95%E8%87%AA%E7%94%B1%E8%A1%8C&cfrom=zyx&it=dujia_hy_destination&date=&needNoResult=true&originalquery={}&limit=0,24&includeAD=true&qsact=search'.format(urllib.request.quote(dep),urllib.request.quote(item),urllib.request.quote(item))
time.sleep(3)
strhtml=requests.get(url)#獲取當(dāng)前目的地的產(chǎn)品數(shù)量
routeCount = int(strhtml.json()['data']['limit']['routeCount'])for limit in range(0,routeCount,24):
url= 'https://touch.dujia.qunar.com/list?modules=list%2CbookingInfo%2CactivityDetail&dep={}&query={}&dappDealTrace=true&mobFunction=%E6%89%A9%E5%B1%95%E8%87%AA%E7%94%B1%E8%A1%8C&cfrom=zyx&it=dujia_hy_destination&date=&needNoResult=true&originalquery={}&limit={},24&includeAD=true&qsact=search'.format(urllib.request.quote(dep),urllib.request.quote(item),urllib.request.quote(item),limit)
time.sleep(3)
strhtml=requests.get(url)#用一個(gè)字典保存當(dāng)前這個(gè)產(chǎn)品的信息
result ={'date':time.strftime('%Y-%m-%d',time.localtime(time.time())),'dep':dep,'arrive':item,'limit':limit,'result':strhtml.json()
}#向數(shù)據(jù)庫中插入這條產(chǎn)品信息記錄
sheet_qunar_zyx.insert_one(result)print('成功!')
爬取的數(shù)據(jù)量是非常大的 代碼需要運(yùn)行非常長(zhǎng)的時(shí)間,運(yùn)行代碼打開pycharm就可以觀察到保存的數(shù)據(jù)了(前提是pycharm已經(jīng)安裝好了mongo的插件了以及本地安裝配置好mongodb了)
總結(jié)
以上是生活随笔為你收集整理的python电商爬虫源码_吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php超链接_一个纯PHP库,用于读写文
- 下一篇: numpy如何直接在数组上进行添加_Nu