python电商爬虫源码_吴裕雄--天生自然PYTHON爬虫:爬取某一大型电商网站的商品数据...

1020928-20200114231401427-1692607150.png

由于这里的目标是获取整个自由行的产品列表,因此还需要获取出发站点的列表,从不同的城市出发,会有不用的产品。

返回自由行的首页,单击搜索框左侧的出发站点,如下图:

1020928-20200114232041054-388601862.png

切换到Headers界面:

1020928-20200114232150598-1231200789.png

可以看到此时目标的URL是:https://touch.dujia.qunar.com/depCities.qunar

开始分析该网站的爬虫工作流程分析步骤:

1 获取出发地站点列表

2 获取旅游景点列表

3 获取景点产品列表

4 存储数据

1020928-20200115144804970-1539231488.png

#首先获取出发站点,代码如下:

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)

1020928-20200115145353214-1488148275.png

。。。。。。。。。

1020928-20200115145418383-304764797.png

1020928-20200115145952410-1658518796.png

在获取数据的时候需要将最后一个callback参数删掉。因此目标URL如下:

https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep=%E6%B7%B1%E5%9C%B3&exclude=&extensionImg=255,175

1020928-20200115151433044-2061786844.png

#然后根据出发地站点获取目的地,代码如下:

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'])

1020928-20200115151624273-448526167.png

.................

1020928-20200115151753910-1747916862.png

到达的 目的地有很多,上面这段代码也要运行很长时间,运行截图也是一部分的,篇幅有限还有很多地点没有展示,但很容易看到许多的目的地是重复的,

原因也很简单一个目的地多数都是对应这多个出发点的,按出发点分别来找目的地的话最后打印寻找到的目的地肯定有许多也就是重复的了,所以接下来

就是要对目的地进行去重,代码修改后,如下:

#然后根据出发地站点获取目的地,代码如下:

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]:#这里声明一个列表a用来保存当前这个出发点对应的所有目的地

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']:#如果当前这个目的地不在a中的话,那就添加进去,否则不添加,这样就可以达到目的地去重的目的了

if(query['query'] not ina):

a.append(query['query'])#打印当前出发点所有对应的不重复的目的地点

print(a)

1020928-20200115153000484-1664551.png

这样每个出发点对应的目的点打印出来也好看清晰了许多。

完成了出发点和目的地的构建之后,接下来就要获取产品列表了。代码如下:

1020928-20200115154957410-1177275349.png

1020928-20200115155954148-1741714149.png

#获取产品列表

importtimeimporturllibimportpymongoimportrequests#使用MongoDB创建数据库、表

client = pymongo.MongoClient('localhost',27017)

book_qunar= client['qunar']

sheet_qunar_zyx= book_qunar['qunar_zyx']#获取产品

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]:#这里声明一个列表a用来保存当前这个出发点对应的所有目的地

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']:#如果当前这个目的地不在a中的话,那就添加进去,否则不添加,这样就可以达到目的地去重的目的了

if(query['query'] not ina):

a.append(query['query'])#逐个地取出当前出发点对应的目的地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)#获取当前目的地的产品数量

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)#用一个字典保存当前这个产品的信息

result ={'date':time.strftime('%Y-%m-%d',time.localtime(time.time())),'dep':dep,'arrive':item,'limit':limit,'result':strhtml.json()

}#向数据库中插入这条产品信息记录

sheet_qunar_zyx.insert_one(result)print('成功!')

1020928-20200115161145354-690829223.png

爬取的数据量是非常大的 代码需要运行非常长的时间,运行代码打开pycharm就可以观察到保存的数据了(前提是pycharm已经安装好了mongo的插件了以及本地安装配置好mongodb了)

1020928-20200115161808362-2063505747.png

1020928-20200115161855721-553865621.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值