python爬虫爬取美团西安美食数据

经历了一周的种种波折,参考了CSDN上N多博主的博客,终于搞定了美团西安美食数据,在此做简单记录:

愚蠢如我,不知如何让爬虫程序翻下一页,只好看了前后两页请求的网址有什么不同,后来发现第一页后缀是‘pn1’,第二页是‘pn2’,以此类推……所以手动查看了一共有15页之后,萌生了一个愚蠢的想法并实现了它,以下是部分代码:

    target = 'http://xa.meituan.com/meishi/'
    head={}
    head['authorization']='your ClientId'(cookie倒数第几个参数)
    head['User-Agent'] = ''
    for i in range(16):
        if i==0:
            continue
        target_real=target+'pn'+str(i)+'/'
        req = requests.get(url=target_real,headers=head)
        html=req.text
        bf=BeautifulSoup(html,'lxml')
        texts=bf.find_all('script')
        text=texts[14].get_text().strip()(这部分也是很愚蠢的做法,实在是找不到别的方法了)
        text=text[19:-1]
        result=json.loads(text)
        result=result['poiLists']
        result=result['poiInfos']

以此挑出自己想要的部分数据,再经过简单处理之后便以为大功告成,在日报里向老板汇报了捷报“美团西安美食部分爬取完成”,今天早上十点多老板问我爬了多少家,我看了下一共四百多家,老板说有两三万餐饮,让我看看怎么回事

回到工位上,打开美团网页发现不管登不登录,只要不选任何条件,都是显示15页,然后我按照行政划分一个个打开,根本不是15页好吗,再譬如打开“长安区”,选择‘长安区全部’,显示有19页,我再分别将长安区的商圈一个个打开,加起来发现有大概39页,就算剃掉不满一页的情况,也远远不止19页,而且还有了一个发现,每一个商圈都有一个特定的ID,其url就是美团西安美食的url+b+ID+pn+页码,所以我决定按照行政区划分来获取数据,这时候问题就出现了,不可能把每一个商圈一共有多少页都手动查看一遍,于是想了以下办法:

        for i in range(1,5,1):(每个商圈商家总数最多不超过50页)
            target='http://xa.meituan.com/meishi/'+'b'+str(item)+'/'+'pn'+str(i)+'/'
            head={}
            head['authorization']='your ClientID'
            head['User-Agent'] = ''
            req = requests.get(url=target,headers=head)
            html=req.text
            bf=BeautifulSoup(html,'lxml')
            texts=bf.find_all('script')
            text=texts[14].get_text().strip()
            text=text[19:-1]
            result=json.loads(text)
            result=result['poiLists']
            result=result['poiInfos']
            if result:(判断获取内容是否为空)
                print(target)
                for it in result:
                    Info_list=[]
                    Info_list.append('美团')
                    Info_list.append('美食')
                    Info_list.append(it['title'])
                    Info_list.append(it['address'])
                    writer.writerow(Info_list)
                time.sleep(3)
            else:
                break(若为空,直接跳出本层循环)

下面是获取各个商圈ID的部分代码:

    target = 'http://xa.meituan.com/meishi/'
    head={}
    head['authorization']='your ClientID'
    head['User-Agent'] = ''
    req = requests.get(url=target,headers=head)
    html=req.text
    bf=BeautifulSoup(html,'lxml')
    texts=bf.find_all('script')
    text=texts[14].get_text().strip()
    text=text[19:-1]
    result=json.loads(text)
    result=result['filters']
    result=result['areas']
    list=[]
    for item in result:
        for i in item['subAreas']:
            if i['name']=='全部':(不需要获取每个行政区第一个全部的ID,所以直接略过)
                continue
            list.append(i['id'])
    print(list)

获取了每个商圈的ID之后,再根据url组成规则即可得到每个商圈的url(好像走了一点弯路了,获取的html里面直接有每个商圈的url)

以下是完整代码,根据自己需要可做修改:

#美团美食
# -*- coding:UTF-8 -*-
import requests
import time
from bs4 import BeautifulSoup
import json
import csv
with open(r'美团西安美食.csv',"w", newline='',encoding='UTF-8') as csvfile: 
    writer = csv.writer(csvfile)
    writer.writerow(['网站名','品类','商家名称','地址']) 
    target = 'http://xa.meituan.com/meishi/'
    head={}
    head['authorization']='your ClientID'
    head['User-Agent'] = ''
    req = requests.get(url=target,headers=head)
    html=req.text
    bf=BeautifulSoup(html,'lxml')
    texts=bf.find_all('script')
    text=texts[14].get_text().strip()
    text=text[19:-1]
    result=json.loads(text)
    result=result['filters']
    result=result['areas']
    list=[]
    for item in result:
        for i in item['subAreas']:
            if i['name']=='全部':
                continue
            list.append(i['id'])
    print(list)
    for item in list:
        for i in range(50):
            if i==0:
                continue
            target='http://xa.meituan.com/meishi/'+'b'+str(item)+'/'+'pn'+str(i)+'/'
            head={}
            head['authorization']='your ClientID'
            head['User-Agent'] = ''
            req = requests.get(url=target,headers=head)
            html=req.text
            bf=BeautifulSoup(html,'lxml')
            texts=bf.find_all('script')
            text=texts[14].get_text().strip()
            text=text[19:-1]
            result=json.loads(text)
            result=result['poiLists']
            result=result['poiInfos']
            if result:
                print(target)
                for it in result:
                    Info_list=[]
                    Info_list.append('美团')
                    Info_list.append('美食')
                    Info_list.append(it['title'])
                    Info_list.append(it['address'])
                    writer.writerow(Info_list)
                time.sleep(3)
            else:
                break
print('Done')
        

整理完毕

    原文作者:18031211404
    原文地址: https://blog.csdn.net/ZHANGJING199402/article/details/80423310
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞