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

工作流程分析

1、获取出发地点列表

2、获取目的地点列表

3、获取目的地产品列表

4、储存数据

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

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

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

遍历出所有出发地点: 

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中,没有的话添加进去,达到去重复的目的。

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

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())