2020-08-23

这周五,小伙伴出差来北京,大家想一起聚聚。提议在望京附近吃烤肉。用网页查哪家店不错也许不错,但是咱不是刚学了爬虫么。于是我用爬虫写了一小段代码来实现从美团信息的爬取

在从美团爬取之前,我先确定了本次需要爬取的信息:

店名,地址,评分,均价(毕竟还没有到财富自由...)和推荐菜

打开美团网页,确定网页。发现选取美团的不同category网址是不同的,但是翻页时,会发现pn+number 实现翻页


image.png

还有一种方法是使用i.meituan模拟手机端,这里cateId=54就是烧烤,55是川菜。。。剩下的你懂的。只需要做的就是加载所有页面。


2.PNG

回到第一种方法。直接来代码吧。

比较头疼的是遇到验证码。每次遇到验证码就需要停下代码,然后验证之后,获得cookies。我还在学习如何解决验证码的事情。。。

import requests
import lxml.etree as le
import json
import re
from pymongo import MongoClient


def parse1(page=1):
    '''
    1. 首先分析抓取什么内容
    2. 通过url发现多页的规律
    3. 如何定位2级页面
    4. 使用爬虫将一级网页爬取后,获得相关内容
    5. 将1~5封装为一个函数
    下面基本已经成型,然后需要做的就是做一个函数,把下面的代码封装在函数里面
    '''
    url = "https://bj.meituan.com/meishi/c54b673/pn{page}/".format(page = page)
    headers ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
              'Cookie': 'client-id=28d33416-a0ee-45a8-a0d0-469a9a693b6a; uuid=00b656f9-0a16-4ceb-9e6a-81e6bf75e71e; _lxsdk_cuid=1740f0bd059c8-0712241f957fe2-3c634203-144000-1740f0bd059c8; _hc.v=89b7e524-cd82-2fde-dbaf-12461dd77d3a.1597980269; IJSESSIONID=t6h6xxphbftpxae9521qjnj3; iuuid=C629760EE89131469C5A0CC8A366A46F2BA47DF0E20290569B7E62B1425945EB; ci=1; cityname=%E5%8C%97%E4%BA%AC; webp=1; ci3=1; __utma=74597006.1892913350.1597986656.1597986656.1597986656.1; __utmc=74597006; __utmz=74597006.1597986656.1.1.utmcsr=blog.csdn.net|utmccn=(referral)|utmcmd=referral|utmcct=/xing851483876/article/details/81842329; _lx_utm=utm_source%3Dblog.csdn.net%26utm_medium%3Dreferral%26utm_content%3D%252Fxing851483876%252Farticle%252Fdetails%252F81842329; _lxsdk=C629760EE89131469C5A0CC8A366A46F2BA47DF0E20290569B7E62B1425945EB; meishi_ci=1; cityid=1; latlng=40.008608,116.478681,1597987739686; i_extend=C_b0E169406054609187083475856891434993064435_e-6403314363349724909_v5186722642576530108_a%e6%9c%9b%e4%ba%ac+%e7%83%a7%e7%83%a4Gimthomepagecategory11H__a100005__b1; lat=40.002208; lng=116.463343; _lxsdk_s=17410011f3f-808-064-4ad%7C%7C3',
              'Host': 'bj.meituan.com'
              }
    meituan1 = requests.get(url,headers = headers)
    ret = re.findall(r"<script>window._appState = (.*?);</script>",meituan1.content.decode('utf-8')) #匹配太多
    data = json.loads(ret[0])['poiLists']['poiInfos']
    return data

def parse2(url):
    #url = "https://www.meituan.com/meishi/195931264/"
    headers1 = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
        'Cookie': 'client-id=28d33416-a0ee-45a8-a0d0-469a9a693b6a; uuid=00b656f9-0a16-4ceb-9e6a-81e6bf75e71e; _lxsdk_cuid=1740f0bd059c8-0712241f957fe2-3c634203-144000-1740f0bd059c8; _hc.v=89b7e524-cd82-2fde-dbaf-12461dd77d3a.1597980269; IJSESSIONID=t6h6xxphbftpxae9521qjnj3; iuuid=C629760EE89131469C5A0CC8A366A46F2BA47DF0E20290569B7E62B1425945EB; ci=1; cityname=%E5%8C%97%E4%BA%AC; webp=1; ci3=1; __utma=74597006.1892913350.1597986656.1597986656.1597986656.1; __utmc=74597006; __utmz=74597006.1597986656.1.1.utmcsr=blog.csdn.net|utmccn=(referral)|utmcmd=referral|utmcct=/xing851483876/article/details/81842329; _lx_utm=utm_source%3Dblog.csdn.net%26utm_medium%3Dreferral%26utm_content%3D%252Fxing851483876%252Farticle%252Fdetails%252F81842329; _lxsdk=C629760EE89131469C5A0CC8A366A46F2BA47DF0E20290569B7E62B1425945EB; meishi_ci=1; cityid=1; latlng=40.008608,116.478681,1597987739686; i_extend=C_b0E169406054609187083475856891434993064435_e-6403314363349724909_v5186722642576530108_a%e6%9c%9b%e4%ba%ac+%e7%83%a7%e7%83%a4Gimthomepagecategory11H__a100005__b1; lat=40.002208; lng=116.463343; _lxsdk_s=17410011f3f-808-064-4ad%7C%7C3',
        'Host': 'www.meituan.com'
    }
    meituan2 = requests.get(url, headers=headers1)
    ret = re.findall(r'<script>window._appState = (.*?);</script>', meituan2.content.decode('utf-8'))
    data = json.loads(ret[0])
    #address = data['detailInfo']['address']
    menu={}
    for i in range(len(data['recommended'])):
        parse2_recommend_name = data['recommended'][i]['name']
        parse2_recommend_price = data['recommended'][i]['price']
        menu.setdefault(parse2_recommend_name,parse2_recommend_price)
    return {'menu' : menu}

def spider_meituan(c,start_page =1, end_page=2):
    for page in range(start_page,end_page+1):
        results = parse1(page=page)
        for i in range(len(results)):
            url = "https://www.meituan.com/meishi/%d" %results[i]['poiId']
            parse2_data = parse2(url=url)
            results[i]['menu'] = parse2_data['menu']
            c.insert_one(results[i])

if __name__=='__main__':
    client = MongoClient()
    db = client.get_database('meituan')
    ck= db.get_collection('shaokao')
    spider_meituan(c=ck,start_page=1, end_page=5)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容