(2、爬取某电商网站的商品数据)Python爬虫与数据清洗的进化

工作流程分析

1、获取出发地点列表

2、获取目的地点列表

3、获取目的地产品列表

4、储存数据

1、以网站touch.qunar.com为例,从此Request URL中得知dep代表出发地,query和originalquery代表目的地,通过修改这两个参数就可以控制遍历整个平台自由行产品

遍历出所有出发地点: 

import requests
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)

通过此页面找到不同出发地点对应的目的地。针对每个出发站点下的目的地,在获取出发地点的位置上定义一个空列表a,最后判断目的地是否已经在a中,没有的话添加进去,达到去重复的目的。

import requests
import urllib.request
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=[]
        print(dep)
        url='https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep)) #urllib.request.quote()解决中文编码问题
        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']:
                    if query['query'] not in a:
                        a.append(query['query'])
        print(a)

代码优化并将数据插入进MongoDB中

import requests
import urllib.request
import time
import pymongo

client = pymongo.MongoClient('localhost', 27017)
book_qunar = client['qunar']
sheet_qunar = book_qunar['sheet_qunar_zyx']


def get_list(dep, item):
    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,28&includeAD=true&qsact=search'.format(
        urllib.request.quote(dep), urllib.request.quote(item), urllib.request.quote(item))
    strhtml = get_json(url)
    result = {
        'date': time.strftime('%Y-%m-%d', time.localtime(time.time())),
        'dep': dep,
        'arrive': item,
        'result': strhtml
    }
    print(result)
    sheet_qunar.insert_one(result)

cookies={'cookies':'Cookie:xxx'}
def get_json(url):
    strhtml = requests.get(url,cookies=cookies)
    return strhtml.json()


if __name__ == "__main__":

    url = 'https://touch.dujia.qunar.com/depCities.qunar'
    dep_dict = get_json(url)
    for dep_item in dep_dict['data']:
        for dep in dep_dict['data'][dep_item]:
            a = []
            url = 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(
                urllib.request.quote(dep))  # urllib.request.quote()解决中文编码问题
            arrive_dict = get_json(url)
            for arr_item in arrive_dict['data']:
                for arr_item_1 in arr_item['subModules']:
                    for query in arr_item_1['items']:
                        if query['query'] not in a:
                            a.append(query['query'])
            for item in a:
                get_list(dep, item)


爬虫效率优化(添加pool)

import requests
import urllib.request
import time
import pymongo

client = pymongo.MongoClient('localhost', 27017)
book_qunar = client['qunar']
sheet_qunar = book_qunar['sheet_qunar_zyx']


def get_list(dep, item):
    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,28&includeAD=true&qsact=search'.format(urllib.request.quote(dep), urllib.request.quote(item), urllib.request.quote(item))
    strhtml = get_json(url)
    result = {
        'date': time.strftime('%Y-%m-%d', time.localtime(time.time())),
        'dep': dep,
        'arrive': item,
        'result': strhtml
    }
    print(result)
    sheet_qunar.insert_one(result)

cookies={'cookies':'Cookie:xxx'}
def get_json(url):
    strhtml = requests.get(url.cookies=cookies)
    time.sleep(1)
    return strhtml.json()

def get_all_data(dep):
    a=[]
    url = 'https://touch.dujia.qunar.com/golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(
                urllib.request.quote(dep))  # urllib.request.quote()解决中文编码问题
    arrive_dict = get_json(url)
    for arr_item in arrive_dict['data']:
        for arr_item_1 in arr_item['subModules']:
            for query in arr_item_1['items']:
                if query['query'] not in a:
                    a.append(query['query'])
    for item in a:
        get_list(dep, item)

dep_list='''
澳门
阿坝州
阿克苏地区
阿拉尔
阿拉善盟
阿勒泰
阿里
安康
安庆
鞍山
安顺
安阳
北京
白城
百色
白沙
白山
白银
保定
宝鸡
保山
保亭
包头
南阳
那曲
内江
宁波
宁德
怒江
此处省略300多个城市
商丘
上饶
山南
汕头
汕尾
韶关
绍兴
邵阳
神农架
深圳
石河子
十堰
石嘴山
珠海
驻马店
株洲
淄博
自贡
资阳
遵义
'''



此处多进程使用的库是Pool,Pool()不设定参数时默认开最高进程数(最多CPU数) ,使用pool.map将第二个参数映射到第一个参数(函数)上

from qunar import get_all_data
from qunar import dep_list
from multiprocessing import Pool

if __name__ == '__main__':
    pool=Pool()
    pool.map(get_all_data,dep_list.split())

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值