一、目的

获取美团美食每个店铺所有的评论信息,并保存到数据库和本地

二、实现步骤

获取所有店铺的poiId

首先观察详情页的url,后面是跟着一串数字的,而这一串数字代表着每个店铺特有的id号,我们称之为poiId。所以,要想爬取所有店铺的评论数据,就必须爬取所有店铺的id号。

因此,退回到上一级页面,打开控制台,逐个点击请求的preview选项,找出携带有poiId数据的请求。

而我们要做的,就是找出这个请求的规律,模拟客服端发送此请求,这样子我们就可以获得所有店铺的poiId了。

接下来就是找规律了,我们观察发送的请求。很长对不对,不要紧,我们慢慢分析。

cityName=%E6%B1%95%E5%A4%B4& (城市中文名字经过urlencode编码)

cateId=0&areaId=0&sort=&dinnerCountAttrId=& (固定的一段字符串,具体意义未知)

page=1 (页码)

userId=&uuid=9efd650a0d204774ba7a.1577010898.1.0.0 (一段cookie,每隔一段时间会更新,用于验证用户的身份,由后端传递到前端。F12打开控制台,点击Application的Cookies查看得知)

platform=1&partner=126& (一段固定的字符串)

originUrl=https%3A%2F%2Fst.meituan.com%2Fmeishi%2F(对该网页的url进行urlencode)

riskLevel=1&optimusCode=10 (一段固定的字符串)

_token=eJx1j1tvozAQhf%2BLX4OCDZiYvEEuu5ASQqGQpOoDIdxrmmAn0FT972u0uw%2F7sNJIc%2BbM0aeZL9DZZzBHEBoQSuCedWAO0BROdSABzsQGz2YQQQNjREQg%2Fccjmq5L4NRFSzB%2FJYohEUzeRuNZzK8IC6QgwzfptzZ0IRVN1BiyRQaUnF%2FYXJYZn9Ks4reknaYfVBaalZUsbvhPAAgCDUcCgaqkYTQazWiInvzp%2FO%2FsiqcEi1VFK1Tm9O91irhZr%2Fxyfy%2B1zVatrYPb7AezdSz%2FVL0Xvem5rDvuNfVHs3ZsDzaLhq%2FCa2XGrTFpL3Iw%2BAuTDMWS1rDcHnaIDC95PZucLrKMO9s77lhAbvoLjjM3juLwqt4CPSx6Kyw3k1SlqbM9J9q9R8vIoQ6nnoIvm%2FXjnq%2BLY%2FdQ%2FDJ%2F3pVtmlKVLvIocH5Gp9uTlusHjz662La4e93lONGGSjnbbbcOlivn8MjqzxwmW3WTqYteiXXGFKsk%2FgTZMFfB9y82H5QP (token令牌,每隔一段时间会更新)

而在这些参数中,有几个参数是必须的(皆可通过正则表达式获取):

uuid(可以从cookie中获得,按理来说应该每隔一段时间就应该重新获取一次,但是我获取了一次之后就可以一直用,个人认为是后端没有验证该字段);

city(获取店铺所在的城市名);

page(页码。获取店铺数量,然后除以每页最大显示条目可得;该字段在“meishi/“文件里ctrl+F搜索totalCount可得)。

下面就是获取这几个参数的config.py文件源代码:

#获得城市名,uuid和商铺数目以及页数

import requests

import re  #用于正则表达式

import math

#获得城市名,uuid和商铺数目以及页数

def getInfo():

"""获取uuid"""

url = 'https://st.meituan.com/meishi/'  #汕头美食

headers = {

'Host': 'st.meituan.com',

'Referer': 'https://st.meituan.com/',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',

}

res = requests.get(url, headers=headers).text

# findall(pattern, string, flags=0),返回string中所有与pattern相匹配的全部字串,r表示原生字符例:\n不表示换行。re.S表示作用域拓展到整个字符串,即包括换行符

if res:

uuid = re.findall(r'"uuid":"(.*?)"', res, re.S)[0]

city = re.findall(r'"chineseFullName":"(.*?)"',res,re.S)[0]

shopsNum = re.findall(r'"totalCounts":(\d+)',res,re.S)[0]

with open('./output_file/uuid_city_shopsNum.log', 'w',encoding="utf-8") as f:

print('chrome_uuid:'+uuid+'\n'+'city:'+city+'\n'+'shopsNum:'+str(shopsNum))

f.write('chrome_uuid:'+uuid+'\n'+'city:'+city+'\n'+'shopsNum:'+str(shopsNum))

ans = {

'uuid':uuid,

'city':city,

'shopsNum':int(shopsNum),

'pages':math.ceil(int(shopsNum)/15),

}

return ans

ans = getInfo()

破解token参数

_token参数的构造:

位时间戳,cts则为ts+100*1000。还有一个sign参数,形式与_token参数一致,再对sign参数进行一次同样的解密,得到一个字符串,其中的uuid在首页源码中可以正则匹配出来。

加密: 由上可知_token参数的构造过程,进行了两次zlib压缩和base64编码加密。第一次加密对象位sign参数。第二次加密就是生成_token的字典,构造好字典后再进行一次上述加密即为_token。

另外,需要特别说明的是,_token参数破解了之后,仍会有一些参数是常量,一些是变量,但模拟的过程仍与前面模拟的过程是相似的,所以在这一不一一赘述,详见代码。

get_shops.py源代码:

'''

用于保存所有页面的ajax_url

'''

import base64, zlib

import time

import random

import pandas as pd

import os

import urllib.parse

import json

import re  #用于正则表达式

from config import ans

print('ans:',ans)

get_shops_url = [] #用于存储所有生成的ajax_url

for page in range(1,ans['pages']+1):

DATA = {

"cityName": '汕头',

"cateId": '0',

"areaId": "0",

"sort": "",

"dinnerCountAttrId": "",

"page": page,

"userId": "",

"uuid": ans['uuid'],

"platform": "1",

"partner": "126",

"originUrl": "https://{}.meituan.com/meishi".format('st'),

"riskLevel": "1",

"optimusCode": "1"

}

SIGN_PARAM = "areaId={}&cateId={}&cityName={}&dinnerCountAttrId={}&optimusCode={}&originUrl={}/pn{}/&page={}&partner={}&platform={}&riskLevel={}&sort={}&userId={}&uuid={}".format(

DATA["areaId"],

DATA["cateId"],

re.findall(r"b'(.+?)'",str(DATA["cityName"].encode(encoding='UTF-8',errors='strict')))[0],

DATA["dinnerCountAttrId"],

DATA["optimusCode"],

DATA["originUrl"],

DATA["page"],

DATA["page"],

DATA["partner"],

DATA["platform"],

DATA["riskLevel"],

DATA["sort"],

DATA["userId"],

DATA["uuid"]

)

def encrypt(data):

"""压缩编码"""

binary_data = zlib.compress(data.encode())      #二进制压缩

base64_data = base64.b64encode(binary_data)     #base64编码

return base64_data.decode()                     #返回utf-8编码的字符串

def token():

"""生成token参数"""

ts = int(time.time()*1000)  #获取当前的时间,单位ms

#brVD和brR为设备的外汇返佣,浏览器的宽高等参数,可以使用事先准备的数据自行模拟

json_path = os.path.dirname(os.path.realpath(__file__))+'\\utils\\br.json'

df = pd.read_json(json_path)

brVD,brR_one,brR_two = df.iloc[random.randint(0,len(df)-1)]#iloc基于索引位来选取数据集

TOKEN_PARAM ={

"rId": 100900,

"ver": "1.0.6",

"ts": ts,  # 变量

"cts": ts + random.randint(100, 120),  # 经测,cts - ts 的差值大致在 90-130 之间

"brVD": eval(brVD),  # 变量

"brR": [eval(brR_one), eval(brR_two), 24, 24],

"bI": ["https://st.meituan.com/meishi/", ""],  # 从哪一页跳转到哪一页

"mT": [],

"kT": [],

"aT": [],

"tT": [],

"aM": "",

"sign": encrypt(SIGN_PARAM)

}

# 二进制压缩

binary_data = zlib.compress(json.dumps(TOKEN_PARAM).encode())

# print('binary_data:',json.dumps(TOKEN_PARAM).encode())

# base64编码

base64_data = base64.b64encode(binary_data)

# print('这里是token的使用了ascii编码之前的:', base64_data)

# print('这里是token的使用了ascii编码之后的:',urllib.parse.quote(base64_data.decode(),'utf-8'))

return urllib.parse.quote(base64_data.decode(),'utf-8')

AJAXDATA = {

'cityName': '%E6%B1%95%E5%A4%B4',

'cateId': 0,

'areaId': 0,

'sort': '',

'dinnerCountAttrId': '',

'page': page,

'userId': '',

'uuid': ans['uuid'],

'platform': 1,

'partner': 126,

'originUrl': 'https%3A%2F%2Fst.meituan.com%2Fmeishi%2F',

'riskLevel': 1,

'optimusCode': 10,

'_token': token()

}

urlParam = 'https://st.meituan.com/meishi/api/poi/getPoiList?cityName={}&cataId={}&areaId={}&sort={}&dinnerCountAttrId={}' \

'&page={}&userId={}&uuid={}&platform={}&partner={}&originUrl={}&riskLevel={}&optimusCode={}&_token={}'.format(

AJAXDATA['cityName'],

AJAXDATA['cateId'],

AJAXDATA['areaId'],

AJAXDATA['sort'],

AJAXDATA['dinnerCountAttrId'],

AJAXDATA['page'],

AJAXDATA['userId'],

AJAXDATA['uuid'],

AJAXDATA['platform'],

AJAXDATA['partner'],

AJAXDATA['originUrl'],

AJAXDATA['riskLevel'],

AJAXDATA['optimusCode'],

AJAXDATA['_token'],

)

然后,将ajax请求到的店铺数据保存到txt/csv/mongoDB数据库。因为在其他地方也可能调用到相应的方法(增删改查),因此,单独将他们写在另外一个.py文件里,然后封装成类。其中,save_data.py文件源代码如下:'''

定义类用于保存数据到数据库,txt或者csv

'''

import pandas as pd           # 将数据保存到csv中

import pymongo

class MongoDB():

def __init__(self,formName,collection='',result=''):

self.host = 'localhost'

self.port = 27017

self.databaseName = 'meituan'

self.formName = formName

self.result = result

self.collection = collection

# 连接数据库

def collect_database(self):

client = pymongo.MongoClient(host=self.host, port=self.port)  # 连接MongoDB

db = client[self.databaseName]  # 选择数据库

collection = db[self.formName]  # 指定要操作的集合,表

print('数据库已经连接')

return collection

# 保存数据

def save_to_Mongo(self):

# collection = self.collect_database()

try:

if self.collection.insert_many(self.result):

# print('存储到MongoDB成功', self.result)

print('存储到MongoDB成功')

except Exception:

print('存储到MongoDb失败', self.result)

# 查询数据

def selectMongoDB(self):

# collection = self.collect_database()

print('评论数据的总长度为:',self.collection.count_documents({}))

# print('正在查询数据库')

# for x in self.collection.find():

#     print(x)

# 删除数据

def delete_database(self):

self.collection.delete_many({})  # 删除数据库内容

print('已清空数据库')

class SaveDataInFiles():

def __init__(self,csv_url='',txt_url='',results=''):

# 需要保存的数据

self.results = results

self.csv_url = csv_url

self.txt_url = txt_url

# 出口文件

def saveResults(self):

self.saveInCsv()

self.saveInTxt()

# 将结果ip保存到D:\python\meituan\output_file\proxyIp_kuai.txt中

def saveInTxt(self):

txt = open(self.txt_url, 'w')

txt.truncate()  # 保存内容前先清空内容

for item in self.results:

itemStr = str(item)

txt.write(itemStr)

txt.write('\n')

txt.close()

# 将结果保存到D:\python\meituan\output_file\proxyIp_kuai.csv中

def saveInCsv(self):

# print('csv:',self.results,self.csv_url)

csvUrl = self.csv_url

pd.DataFrame(self.results).to_csv(csvUrl,mode='a',encoding="utf-8-sig")  # 避免保存的中文乱码

print('保存到csv文件中成功了')

然后,调用相应的方法将ajax获得的数据保存起来。最重要的是保存到mongoDB数据库(一般是先连接数据库,然后再执行增删改查的操作),保存到csv文件仅仅是为了直观的观察数据。save_shops_info.py文件源代码如下:'''

保存每个列表页所有商铺的基本信息

'''

import requests

import json

from get_shops import get_shops_url

from save_data import MongoDB

from save_data import SaveDataInFiles

output = [] #初始化数组,用于保存最终的结果

index = 1

# 定义类获取评论数据

def get_shops_info(ajax_url):

url = ajax_url  # getshops传递过来的ajax_url

headers = {

'Host': 'st.meituan.com',

'Referer': 'https://st.meituan.com/meishi/',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',

'X-Requested-With': 'XMLHttpRequest',

}

try:

response = requests.get(url, headers=headers)

# print('response:',response)

# print('response_text:',response.text)

# print('type(eval(response.text)):',type(eval(response.text)))

if response.status_code == 200:

return response.json()

except requests.ConnectionError as e:

print('Error', e.args)

# 从返回的json字符串中获取想要的字段

def save_shops_info(ajax_url,index):

items = get_shops_info(ajax_url).get('data').get('poiInfos')

output.extend(items)

print('正在追加内容到output数组中')

if __name__ == '__main__':

# for ajaxUrl in get_shops_url:

#     save_shops_info(ajaxUrl,index)

#保存数据到数据库中

collection = MongoDB('shops_info','','').collect_database()    #连接数据库

# MongoDB('shops_info', collection, '').delete_database()  # 先清空数据库内容

# MongoDB('shops_info', collection, output).save_to_Mongo()

# 保存数据到csv中

# SaveDataInFiles('D:\python\meituan\output_file\shops_info.csv', '', output).saveInCsv()

#将数据保存到json文件夹中

# with open('D:\python\meituan\output_file\shops_info.json', 'w') as f:

#     json.dump(output, f)

# 查询数据库数据

MongoDB('shops_info',collection,'').selectMongoDB()

获取每个店铺的评论信息

打开控制台,会发现,获取评论数据的ajax请求和前面获取店铺基本信息的请求相似,如下:

Request URL:

https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=9efd650a0d204774ba7a.1577010898.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F152376939%2F&riskLevel=1&optimusCode=10&id=152376939&userId=&offset=0&pageSize=10&sortType=1

而其中的id=152376939就是我们前面保存的poiId。所以到了这一步,参照前面的方法,我们就可以获取后端传递过来的店铺评论数据了。

最后,将获取到的店铺评论数据保存起来。detailPage_getComments.py源代码如下:# 根据数据库中汕头市外卖商铺信息,爬取所有商铺的评论信息

# 爬取美团外卖评论 https://www.meituan.com/meishi/41007600/

import requests  # 模拟浏览器向服务器发出请求

import math

import urllib.parse  # 定义了url的标准接口,实现url的各种抽取

from selenium import webdriver

from save_data import MongoDB

from save_data import SaveDataInFiles

from config import ans

from requests.adapters import HTTPAdapter

#######################################################################################################################

# 定义类获取商铺评论标签和所有评论

class GetShopComments():

def __init__(self, shopBasicInfo, uuid, shop_num=''):

self.comments_ajax_url = "https://www.meituan.com/meishi/api/poi/getMerchantComment?"

self.ajax_headers = {

'Host': 'www.meituan.com',

'Referer': 'https://www.meituan.com/meishi/41007600/',

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36',

'X-Requested-With': 'XMLHttpRequest',

}

# 前面GetShopInformation的类中传递过来的最大页数

self.maxPage = math.ceil(shopBasicInfo['allCommentNum'] / 10)

self.shopName = shopBasicInfo['title']

self.poiId = shopBasicInfo['poiId']

self.uuid = uuid['uuid']

# self.uuid = uuid

self.shop_num = shop_num

# 获取每个店铺页面上的所有数据(json格式),标签+评论

def get_comments_in_page(self, items):

parms = {

'basicUrl':'https://www.meituan.com/meishi/api/poi/getMerchantComment?',

'uuid': self.uuid,

'platform': '1',

'partner': '126',

'originUrl': 'https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F' + str(self.poiId) + '%2F',

'riskLevel': '1',

'optimusCode': '10',

'id': self.poiId,

'userId': '',

'offset': items,

'pageSize': '10',

'sortType': '1',

}

url = self.comments_ajax_url + urllib.parse.urlencode(parms)

# 连接超时,重新连接

request = requests.Session()

request.mount('http://', HTTPAdapter(max_retries=3))

request.mount('https://', HTTPAdapter(max_retries=3))

try:

response = request.get(url, headers=self.ajax_headers,timeout=10)

if response.status_code == 200:

return response.json()

# except requests.ConnectionError as e:

except requests.exceptions.Timeout as e:

print('Error', e.args)

# 解析json数据,并获取评论数据

def parse_comments_in_page(self, originJson, page):

if originJson:

items = originJson.get('data').get('comments')

if items:

for item in items:

comments = {

'shopName': self.shopName,

'page': page,

'username': item.get('userName'),

'user-icon': item.get('userUrl'),

'stars': item.get('star'),

'user-comment': item.get('comment'),

'user-comment-time': item.get('commentTime'),

'user-comment-zan': item.get('zanCnt')}

yield comments

# 解析json数据,并获取标签评论数据

def parse_comments_tags(self):

if self.maxPage > 0:

original_data = self.get_comments_in_page(1)

if original_data:

tags = original_data.get('data').get('tags')

if tags:

for item in tags:

item['poiId'] = self.poiId

item['shopName'] = self.shopName

return tags

# 评论数据的入口和出口

def get_comments(self):

commentsData = []  # 用于存储最终的结果,然后将结果保存到数据库中

if self.maxPage > 0:

for page in range(1, self.maxPage + 1):

print('我现在已经爬取到第' + str(shop_num) + '家店铺的第' + str(page) + '页啦~')

original_data = self.get_comments_in_page(page)

results = self.parse_comments_in_page(original_data, page)

for result in results:

commentsData.append(result)

return commentsData

# 评论标签数据

#######################################################################################################################

if __name__ == '__main__':

shop_num = 0  # 用于统计爬到哪一家店铺

# 开启新数据库用于保存评论数据

tags_collection = MongoDB('shops_tags', '', '').collect_database()  # 连接数据库

comments_collection = MongoDB('shops_comments', '', '').collect_database()  # 连接数据库

# 查看数据库内容

# MongoDB('shops_comments',comments_collection).selectMongoDB()

# 清空数据库

# MongoDB('shops_tags', tags_collection).delete_database()

# MongoDB('shops_comments', comments_collection).delete_database()

# 获取前面数据库中保存的商家数据

collection = MongoDB('shops_info', '', '').collect_database()  # 连接数据库

shops = collection.find({}, {"poiId": 1, "title": 1, "allCommentNum": 1})  # 只输出id和title字段,第一个参数为查询条件,空代表查询所有

shops = list(shops)  # 将游标转换成数组

for items in shops[0:]:

shop_num = shop_num + 1  # 用于统计爬到哪一家店铺

commentsRes = GetShopComments(items, ans, shop_num).get_comments()  # 获取店铺的所有评论

tagsRes = GetShopComments(items, ans).parse_comments_tags()  # 获取评论标签

MongoDB('shops_tags', tags_collection, tagsRes).save_to_Mongo()  # 保存评论标签数据

MongoDB('shops_comments', comments_collection, commentsRes).save_to_Mongo()  # 保存评论数据

SaveDataInFiles('D:\python\meituan\output_file\shop_comments.csv', '', commentsRes).saveInCsv()  # 保存评论数据到csv文件中

SaveDataInFiles('D:\python\meituan\output_file\shop_tags.csv', '', tagsRes).saveInCsv()  # 保存评论数据到csv文件中

原文链接:https://blog.csdn.net/qq_40511157/article/details/103641937

python爬取“美团美食”汕头地区的所有店铺信息的更多相关文章

  1. Python 爬取美团酒店信息

    事由:近期和朋友聊天,聊到黄山酒店事情,需要了解一下黄山的酒店情况,然后就想着用python 爬一些数据出来,做个参考 主要思路:通过查找,基本思路清晰,目标明确,仅仅爬取美团莫一地区的酒店信息,不过 ...

  2. Python爬虫系列之爬取美团美食板块商家数据(二)

    今天为大家重写一个美团美食板块小爬虫,说不定哪天做旅游攻略的时候也可以用下呢.废话不多说,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: requests模块: argpar ...

  3. Python爬虫系列之爬取美团美食板块商家数据(一)

    主要思路 目的: 根据输入的城市名,爬取该城市美团美食板块所有商家的数据.数据包括: 店名.评分.评论数量.均价.地址, 并将这些数据存入Excel中. 最后尝试对爬取到的数据做一个简单的分析. 克服 ...

  4. Python爬虫实战练习:爬取美团旅游景点评论数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 今年的国庆节还有半个月就要来了,相信很多的小伙伴还是非常期待这个小长假的.国庆节是一年中的小 ...

  5. 利用Python爬取豆瓣电影

    目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com ...

  6. Python 爬取 热词并进行分类数据分析-[数据修复]

    日期:2020.02.01 博客期:140 星期六 [本博客的代码如若要使用,请在下方评论区留言,之后再用(就是跟我说一声)] 所有相关跳转: a.[简单准备] b.[云图制作+数据导入] c.[拓扑 ...

  7. Python爬取跑男的评论,看看大家都在看谁吧

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 以下文章来源于菜J学Python,作者: J哥 Python爬取爬取腾讯视频弹幕视频讲解 http ...

  8. 毕设之Python爬取天气数据及可视化分析

    写在前面的一些P话:(https://jq.qq.com/?_wv=1027&k=RFkfeU8j) 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向. ...

  9. Python 爬取所有51VOA网站的Learn a words文本及mp3音频

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...

随机推荐

  1. Crazy Binary String

    Crazy Binary String 最长01个数相等的子串和子序列 字串用二分做的,有hack数据 :8 00111100 好像数据太水,直接放过去了 下面为二分代码 #include<bi ...

  2. pl/sql中return和exit区别

    经测试: 1.exit只能用于循环中,并且退出循环往下执行: 2.return可用于循环或非循环,并且退出整个程序模块不往下执行. declare i number :=1; j number :=1 ...

  3. P2158仪仗队

    今天早上你谷崩了 由于脑子抽筋,所以选了一道数学题来做.做着做着就疯了 传送 窝盟先画张图冷静冷静 这是样例的图,其中蓝点是有学生的地方. 窝盟来看一下那些学生可以被C君看到. 假设这张图是一个坐标系 ...

  4. spring cloud服务间调用feign

    参考文章:Spring Cloud Feign设计原理 1.feign是spring cloud服务间相互调用的组件,声明式.模板化的HTTP客户端.类似的HttpURLConnection.Apac ...

  5. jmeter之关联的使用(正则、json)

    部分接口的测试中,一个接口会依赖上一个接口的响应信息,但上一个接口的响应信息又不是固定不变的,这时候,需要提取上一个接口的响应信息,将二者每一次的信息关联起来 目录 1.应用场景 2.jmeter正则 ...

  6. xenserver添加静态路由

    xe network-list name-label= xe network-param-set uuid=48a64512-69e8-6534-f276-8d0c4555f946 other-con ...

  7. Cross-entropy Cost Function for Classification Problem

    在Machine Learning的Regression Problem中,常用Quadratic Function来做Cost Function,用以表征Hypothesis与Y之间的差距.而通过G ...

  8. $_POST,$_GET,$_REQUEST区分

    PHP $_REQUEST PHP $_REQUEST 用于收集 HTML 表单提交的数据. 下面的例子展示了一个包含输入字段及提交按钮的表单.当用户通过点击提交按钮来提交表单数据时, 表单数据将发送 ...

  9. ELK+Filebeat (1)

    1 Filebeat介绍 Filebeat是Beat成员之一,基于Go语言,无任何依赖,并且比logstash更加轻量,非常适合安装在生产机器上,不会带来过高的资源占用,轻量意味着简单,所以Fileb ...

  10. Angular 输入中的禁止特定输入值--Validator 与 Directive 实现

    1 前言 最近在项目中涉及表单的情况下,需要对用户输入进行过滤,比如填写用户名的时候不可以使用空格或者特殊符号,这里有几个解决方法: 使用 Angular 的正则同步验证器 使用 RxJS对输入的值进 ...