首页 文章 精选 留言 我的

精选列表

搜索[自适应爬虫],共4615篇文章
优秀的个人博客,低调大师

iOS开发-UITextView根据内容自适应高度

UITextView作为内容文本输入区域,有的时候我们需要根据内容动态改变文本区域的高度,效果如下: 定义UITextView,实现UITextViewDelegate: 1 2 3 4 5 6 7 8 9 10 11 12 -(UITextView *)textView{ if (!_textView) { //http://www.cnblogs.com/xiaofeixiang/ _textView=[[UITextView alloc]initWithFrame:CGRectMake(30, 200, CGRectGetWidth([[UIScreen mainScreen] bounds])-60, 30)]; [_textView setTextColor:[UIColor redColor]]; [_textView.layer setBorderColor:[[UIColor blackColor] CGColor]]; [_textView setFont:[UIFont systemFontOfSize:15]]; [_textView.layer setBorderWidth:1.0f]; [_textView setDelegate:self]; } return _textView; } 实现textViewDidChange方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 -( void )textViewDidChange:(UITextView *)textView{ //博客园-FlyElephant static CGFloat maxHeight =60.0f; CGRect frame = textView.frame; CGSize constraintSize = CGSizeMake(frame.size.width, MAXFLOAT); CGSize size = [textView sizeThatFits:constraintSize]; if (size.height<=frame.size.height) { size.height=frame.size.height; } else { if (size.height >= maxHeight) { size.height = maxHeight; textView.scrollEnabled = YES; // 允许滚动 } else { textView.scrollEnabled = NO; // 不允许滚动 } } textView.frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width, size.height); } 本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5148380.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

自适应负载均衡算法原理与实现

背景 在选择负载均衡算法时,我们希望满足以下要求: 具备分区和机房调度亲和性 每次选择的节点尽量是负载最低的 每次尽可能选择响应最快的节点 无需人工干预故障节点 当一个节点有故障时,负载均衡算法可以自动隔离该节点 当故障节点恢复时,能够自动恢复对该节点的流量分发 基于这些考虑,go-zero 选择了 p2c+EWMA 算法来实现。 算法的核心思想 p2c p2c (Pick Of 2 Choices) 二选一: 在多个节点中随机选择两个节点。 go-zero 中的会随机的选择3次,如果其中一次选择的节点的健康条件满足要求,就中断选择,采用这两个节点。 EWMA EWMA (Exponentially Weighted Moving-Average) 指数移动加权平均法: 是指各数值的加权系数随时间呈指数递减,越靠近当前时刻的数值加权系数就越大,体现了最近一段时间内的平均值。 公式: 变量解释: Vt: 代表的是第 t 次请求的 EWMA值 Vt-1: 代表的是第 t-1 次请求的 EWMA值 β: 是一个常量 EWMA 算法的优势 相较于普通的计算平均值算法,EWMA 不需要保存过去所有的数值,计算量显著减少,同时也减小了存储资源。 传统的计算平均值算法对网络耗时不敏感, 而 EWMA 可以通过请求频繁来调节 β,进而迅速监控到网络毛刺或更多的体现整体平均值。 当请求较为频繁时, 说明节点网络负载升高了, 我们想监测到此时节点处理请求的耗时(侧面反映了节点的负载情况), 我们就相应的调小β。β越小,EWMA值 就越接近本次耗时,进而迅速监测到网络毛刺; 当请求较为不频繁时, 我们就相对的调大β值。这样计算出来的 EWMA值 越接近平均值 β计算 go-zero 采用的是牛顿冷却定律中的衰减函数模型计算 EWMA 算法中的 β 值: 其中 Δt 为两次请求的间隔,e,k 为常数 gRPC 中实现自定义负载均衡器 首先我们需要实现 google.golang.org/grpc/balancer/base/base.go/PickerBuilder 接口, 这个接口是有服务节点更新的时候会调用接口里的Build方法 type PickerBuilder interface { // Build returns a picker that will be used by gRPC to pick a SubConn. Build(info PickerBuildInfo) balancer.Picker } 还要实现 google.golang.org/grpc/balancer/balancer.go/Picker 接口。这个接口主要实现负载均衡,挑选一个节点供请求使用 type Picker interface { Pick(info PickInfo) (PickResult, error) } 最后向负载均衡 map 中注册我们实现的负载均衡器 go-zero 实现负载均衡的主要逻辑 在每次节点更新,gRPC 会调用 Build 方法,此时在 Build 里实现保存所有的节点信息。 gRPC 在获取节点处理请求时,会调用 Pick 方法以获取节点。go-zero 在 Pick 方法里实现了 p2c 算法,挑选节点,并通过节点的 EWMA值 计算负载情况,返回负载低的节点供 gRPC 使用。 在请求结束的时候 gRPC 会调用 PickResult.Done 方法,go-zero 在这个方法里实现了本次请求耗时等信息的存储,并计算出了 EWMA值 保存了起来,供下次请求时计算负载等情况的使用。 负载均衡代码分析 保存服务的所有节点信息 我们需要保存节点处理本次请求的耗时、EWMA 等信息,go-zero 给每个节点设计了如下结构: type subConn struct { addr resolver.Address conn balancer.SubConn lag uint64 // 用来保存 ewma 值 inflight int64 // 用在保存当前节点正在处理的请求总数 success uint64 // 用来标识一段时间内此连接的健康状态 requests int64 // 用来保存请求总数 last int64 // 用来保存上一次请求耗时, 用于计算 ewma 值 pick int64 // 保存上一次被选中的时间点 } p2cPicker 实现了 balancer.Picker 接口,conns 保存了服务的所有节点信息 type p2cPicker struct { conns []*subConn // 保存所有节点的信息 r *rand.Rand stamp *syncx.AtomicDuration lock sync.Mutex } gRPC 在节点有更新的时候会调用 Build 方法,传入所有节点信息,我们在这里把每个节点信息用 subConn 结构保存起来。并归并到一起用 p2cPicker 结构保存起来 func (b *p2cPickerBuilder) Build(info base.PickerBuildInfo) balancer.Picker { ...... var conns []*subConn for conn, connInfo := range readySCs { conns = append(conns, &subConn{ addr: connInfo.Address, conn: conn, success: initSuccess, }) } return &p2cPicker{ conns: conns, r: rand.New(rand.NewSource(time.Now().UnixNano())), stamp: syncx.NewAtomicDuration(), } } 随机挑选节点信息,在这里分了三种情况: 只有一个服务节点,此时直接返回供 gRPC 使用即可 有两个服务节点,通过 EWMA值 计算负载,并返回负载低的节点返回供 gRPC 使用 有多个服务节点,此时通过 p2c 算法选出两个节点,比较负载情况,返回负载低的节点供 gRPC 使用 主要实现代码如下: switch len(p.conns) { case 0:// 没有节点,返回错误 return emptyPickResult, balancer.ErrNoSubConnAvailable case 1:// 有一个节点,直接返回这个节点 chosen = p.choose(p.conns[0], nil) case 2:// 有两个节点,计算负载,返回负载低的节点 chosen = p.choose(p.conns[0], p.conns[1]) default:// 有多个节点,p2c 挑选两个节点,比较这两个节点的负载,返回负载低的节点 var node1, node2 *subConn // 3次随机选择两个节点 for i := 0; i < pickTimes; i++ { a := p.r.Intn(len(p.conns)) b := p.r.Intn(len(p.conns) - 1) if b >= a { b++ } node1 = p.conns[a] node2 = p.conns[b] // 如果这次选择的节点达到了健康要求, 就中断选择 if node1.healthy() && node2.healthy() { break } } // 比较两个节点的负载情况,选择负载低的 chosen = p.choose(node1, node2) } load计算节点的负载情况 上面的 choose 方法会调用 load 方法来计算节点负载。 计算负载的公式是: load = ewma * inflight 在这里简单解释下: ewma 相当于平均请求耗时,inflight 是当前节点正在处理请求的数量,相乘大致计算出了当前节点的网络负载。 func (c *subConn) load() int64 { // 通过 EWMA 计算节点的负载情况; 加 1 是为了避免为 0 的情况 lag := int64(math.Sqrt(float64(atomic.LoadUint64(&c.lag) + 1))) load := lag * (atomic.LoadInt64(&c.inflight) + 1) if load == 0 { return penalty } return load } 请求结束,更新节点的 EWMA 等信息 把节点正在处理请求的总数减1 保存处理请求结束的时间点,用于计算距离上次节点处理请求的差值,并算出 EWMA 中的 β值 计算本次请求耗时,并计算出 EWMA值 保存到节点的 lag 属性里 计算节点的健康状态保存到节点的 success 属性中 func (p *p2cPicker) buildDoneFunc(c *subConn) func(info balancer.DoneInfo) { start := int64(timex.Now()) return func(info balancer.DoneInfo) { // 正在处理的请求数减 1 atomic.AddInt64(&c.inflight, -1) now := timex.Now() // 保存本次请求结束时的时间点,并取出上次请求时的时间点 last := atomic.SwapInt64(&c.last, int64(now)) td := int64(now) - last if td < 0 { td = 0 } // 用牛顿冷却定律中的衰减函数模型计算EWMA算法中的β值 w := math.Exp(float64(-td) / float64(decayTime)) // 保存本次请求的耗时 lag := int64(now) - start if lag < 0 { lag = 0 } olag := atomic.LoadUint64(&c.lag) if olag == 0 { w = 0 } // 计算 EWMA 值 atomic.StoreUint64(&c.lag, uint64(float64(olag)*w+float64(lag)*(1-w))) success := initSuccess if info.Err != nil && !codes.Acceptable(info.Err) { success = 0 } osucc := atomic.LoadUint64(&c.success) atomic.StoreUint64(&c.success, uint64(float64(osucc)*w+float64(success)*(1-w))) stamp := p.stamp.Load() if now-stamp >= logInterval { if p.stamp.CompareAndSwap(stamp, now) { p.logStats() } } } } 项目地址 https://github.com/tal-tech/go-zero https://gitee.com/kevwan/go-zero 欢迎使用 go-zero 并 star 支持我们! 微信交流群 关注『微服务实践』公众号并点击 交流群 获取社区群二维码。

优秀的个人博客,低调大师

python:爬虫入门

直接上代码吧: 一、爬取某外卖平台的指定商家菜品信息 from urllib import request import json import random url = "https://www.ele.me/restapi/shopping/v2/menu?restaurant_id=1392240&terminal=web" # 多搞几个user-agent 看上去更真实点~_^ user_agents = [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 QQBrowser/4.3.4986.400', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0'] random_user_agent = user_agents[random.randint(0, len(user_agents) - 1)] page = request.Request(url, headers={'User-Agent': random_user_agent}) page_info = request.urlopen(page).read().decode("utf-8") # 该url正好返回的是json数组,直接解析就可以了 menu_json = json.loads(page_info) # 清理一些特殊字符串 def clean_menu_name(name): temp = ["-", "^_^", "\n", "◆"] for s in temp: name = name.replace(s, "") return name for category in menu_json: print("分类名:", clean_menu_name(category["name"])) for food in category["foods"]: print("\t", "菜名:", clean_menu_name(food["name"]), " , 菜ID:", food["item_id"], " , 分类ID:", food["category_id"]) for spec in food["specfoods"]: print("\t\t", "规格ID:", spec["sku_id"], " , 价格:", spec["price"]) 输出: 分类名: 必选品(【必选!】吃法二选一,嘛哩匠心出品) 菜名: 经典骨汤上等豚骨每日现熬 , 菜ID: 17548636051 , 分类ID: 13737658 规格ID: 20830000019 , 价格: 1 菜名: 特色干拌—麻辣拌(招牌,秘制麻酱) , 菜ID: 17548637075 , 分类ID: 13737658 规格ID: 20830001043 , 价格: 1.5 分类名: 热销 菜名: 经典骨汤上等豚骨每日现熬 , 菜ID: 17548636051 , 分类ID: 13737658 规格ID: 20830000019 , 价格: 1 菜名: 娃娃菜 , 菜ID: 17548706707 , 分类ID: 13737835 规格ID: 20830070675 , 价格: 3 菜名: 精品肥牛 , 菜ID: 17548664723 , 分类ID: 13737800 规格ID: 20830028691 , 价格: 5.5 菜名: 金针菇 , 菜ID: 17548711827 , 分类ID: 13737835 规格ID: 20830075795 , 价格: 3 菜名: 土豆 , 菜ID: 17548693395 , 分类ID: 13737835 规格ID: 20830057363 , 价格: 2.5 菜名: 特色干拌—麻辣拌(招牌,秘制麻酱) , 菜ID: 17548637075 , 分类ID: 13737658 规格ID: 20830001043 , 价格: 1.5 菜名: 精品蟹肉棒 , 菜ID: 17548654483 , 分类ID: 13737790 规格ID: 20830018451 , 价格: 4 菜名: 冬瓜 , 菜ID: 17548694419 , 分类ID: 13737835 规格ID: 20830058387 , 价格: 2.5 菜名: 梅林午餐肉 , 菜ID: 17548656531 , 分类ID: 13737790 规格ID: 20830020499 , 价格: 5.5 菜名: 【人气】秘制麻酱芝麻花生酱 , 菜ID: 17548638099 , 分类ID: 13737698 规格ID: 20830002067 , 价格: 1 分类名: 优惠 菜名: 招牌霸道~经典荤素~套餐 , 菜ID: 200000173605996435 , 分类ID: 1238754176 规格ID: 200000199013771155 , 价格: 29.4 菜名: 招牌霸道~素食主义~套餐 , 菜ID: 200000173616109459 , 分类ID: 1238754176 规格ID: 200000199009531795 , 价格: 25.2 分类名: Hi~嘛哩来袭咯~ 菜名: 有问题?找嘛哩!~ , 菜ID: 200000173483983763 , 分类ID: 1238743250 规格ID: 200000198867809171 , 价格: 0.01 分类名: 【不得不吃】秘制酱料匠心出品 菜名: 【人气】秘制麻酱芝麻花生酱 , 菜ID: 17548638099 , 分类ID: 13737698 规格ID: 20830002067 , 价格: 1 菜名: 香辣酱 , 菜ID: 17548639123 , 分类ID: 13737698 规格ID: 20830003091 , 价格: 1 菜名: 沙茶酱 , 菜ID: 17548640147 , 分类ID: 13737698 规格ID: 20830004115 , 价格: 1 菜名: 菌菇酱 , 菜ID: 17548642195 , 分类ID: 13737698 规格ID: 20830006163 , 价格: 1 分类名: 【必选】麻辣在舌尖(口味选择) 菜名: 不麻+不辣 , 菜ID: 17548643219 , 分类ID: 13737734 规格ID: 20830007187 , 价格: 0 菜名: 微麻+微辣 , 菜ID: 17548644243 , 分类ID: 13737734 规格ID: 20830008211 , 价格: 0 菜名: 中麻+中辣 , 菜ID: 17548645267 , 分类ID: 13737734 规格ID: 20830009235 , 价格: 0 菜名: 重麻+重辣 , 菜ID: 17548646291 , 分类ID: 13737734 规格ID: 20830010259 , 价格: 0 分类名: 【可选】调味小料区(放碗里,不单独打包) 菜名: 香葱 , 菜ID: 17548647315 , 分类ID: 13737756 规格ID: 20830011283 , 价格: 0.1 菜名: 蒜泥 , 菜ID: 17548648339 , 分类ID: 13737756 规格ID: 20830012307 , 价格: 0.1 菜名: 醋 , 菜ID: 17548649363 , 分类ID: 13737756 规格ID: 20830013331 , 价格: 0.1 分类名: 人气特色榜单 菜名: 冻豆腐 , 菜ID: 17548650387 , 分类ID: 13737790 规格ID: 20830014355 , 价格: 3.5 菜名: 成都酥肉 , 菜ID: 17548651411 , 分类ID: 13737790 规格ID: 20830015379 , 价格: 4.5 菜名: 芝士年糕 , 菜ID: 17548653459 , 分类ID: 13737790 规格ID: 20830017427 , 价格: 4 菜名: 精品蟹肉棒 , 菜ID: 17548654483 , 分类ID: 13737790 规格ID: 20830018451 , 价格: 4 菜名: 荠菜丸子 , 菜ID: 17548655507 , 分类ID: 13737790 规格ID: 20830019475 , 价格: 3.5 菜名: 梅林午餐肉 , 菜ID: 17548656531 , 分类ID: 13737790 规格ID: 20830020499 , 价格: 5.5 菜名: 哈尔滨红肠 , 菜ID: 17548657555 , 分类ID: 13737790 规格ID: 20830021523 , 价格: 4 菜名: 甜玉米 , 菜ID: 17548658579 , 分类ID: 13737790 规格ID: 20830022547 , 价格: 3.5 菜名: 牛百叶 , 菜ID: 17548659603 , 分类ID: 13737790 规格ID: 20830023571 , 价格: 5 分类名: 精品荤菜 菜名: 燕饺 , 菜ID: 17548690323 , 分类ID: 13737800 规格ID: 20830054291 , 价格: 4 菜名: 广味香肠 , 菜ID: 17548691347 , 分类ID: 13737800 规格ID: 20830055315 , 价格: 4 菜名: 川味香肠 , 菜ID: 17548692371 , 分类ID: 13737800 规格ID: 20830056339 , 价格: 4 菜名: 培根 , 菜ID: 17548660627 , 分类ID: 13737800 规格ID: 20830024595 , 价格: 3.5 菜名: 鸡胗 , 菜ID: 17548661651 , 分类ID: 13737800 规格ID: 20830025619 , 价格: 4 菜名: 里脊肉 , 菜ID: 17548662675 , 分类ID: 13737800 规格ID: 20830026643 , 价格: 3.5 菜名: 骨肉相连 , 菜ID: 17548663699 , 分类ID: 13737800 规格ID: 20830027667 , 价格: 4 菜名: 精品肥牛 , 菜ID: 17548664723 , 分类ID: 13737800 规格ID: 20830028691 , 价格: 5.5 菜名: 鲜腐皮虾卷 , 菜ID: 200000176127363987 , 分类ID: 13737800 规格ID: 200000202129068947 , 价格: 4.9 菜名: 蟹粉包 , 菜ID: 17548668819 , 分类ID: 13737800 规格ID: 20830032787 , 价格: 3 菜名: 海胆包 , 菜ID: 17548669843 , 分类ID: 13737800 规格ID: 20830033811 , 价格: 3 菜名: 蛋饺 , 菜ID: 17548670867 , 分类ID: 13737800 规格ID: 20830034835 , 价格: 3.5 菜名: 千叶豆腐 , 菜ID: 17548671891 , 分类ID: 13737800 规格ID: 20830035859 , 价格: 3 菜名: 鱼皮豆腐 , 菜ID: 17548672915 , 分类ID: 13737800 规格ID: 20830036883 , 价格: 3 菜名: 深海鱼蛋丸 , 菜ID: 200000176114181011 , 分类ID: 13737800 规格ID: 200000202122663827 , 价格: 4 菜名: 墨鱼丸 , 菜ID: 17548674963 , 分类ID: 13737800 规格ID: 20830038931 , 价格: 4.5 菜名: 包心贡丸 , 菜ID: 17548675987 , 分类ID: 13737800 规格ID: 20830039955 , 价格: 4.5 菜名: 撒尿牛丸 , 菜ID: 17548677011 , 分类ID: 13737800 规格ID: 20830040979 , 价格: 4.5 菜名: 龙虾丸 , 菜ID: 17548678035 , 分类ID: 13737800 规格ID: 20830042003 , 价格: 4.5 菜名: 北极翅 , 菜ID: 17548680083 , 分类ID: 13737800 规格ID: 20830044051 , 价格: 4 菜名: 玉米肠 , 菜ID: 17548682131 , 分类ID: 13737800 规格ID: 20830046099 , 价格: 4 菜名: 开花肠 , 菜ID: 17548683155 , 分类ID: 13737800 规格ID: 20830047123 , 价格: 3.5 菜名: 亲亲肠 , 菜ID: 17548684179 , 分类ID: 13737800 规格ID: 20830048147 , 价格: 3.5 菜名: 大红肠 , 菜ID: 17548686227 , 分类ID: 13737800 规格ID: 20830050195 , 价格: 4 分类名: 蔬菜菌类 菜名: 土豆 , 菜ID: 17548693395 , 分类ID: 13737835 规格ID: 20830057363 , 价格: 2.5 菜名: 冬瓜 , 菜ID: 17548694419 , 分类ID: 13737835 规格ID: 20830058387 , 价格: 2.5 菜名: 藕片 , 菜ID: 17548695443 , 分类ID: 13737835 规格ID: 20830059411 , 价格: 3 菜名: 莴笋 , 菜ID: 17548696467 , 分类ID: 13737835 规格ID: 20830060435 , 价格: 3 菜名: 白萝卜 , 菜ID: 17548697491 , 分类ID: 13737835 规格ID: 20830061459 , 价格: 2 菜名: 生菜 , 菜ID: 17548699539 , 分类ID: 13737835 规格ID: 20830063507 , 价格: 2.5 菜名: 茼蒿菜 , 菜ID: 17548700563 , 分类ID: 13737835 规格ID: 20830064531 , 价格: 3 菜名: 香菜 , 菜ID: 17548701587 , 分类ID: 13737835 规格ID: 20830065555 , 价格: 3 菜名: 菠菜 , 菜ID: 17548702611 , 分类ID: 13737835 规格ID: 20830066579 , 价格: 3 菜名: 油麦菜 , 菜ID: 17548703635 , 分类ID: 13737835 规格ID: 20830067603 , 价格: 2.5 菜名: 小青菜 , 菜ID: 17548705683 , 分类ID: 13737835 规格ID: 20830069651 , 价格: 2.5 菜名: 娃娃菜 , 菜ID: 17548706707 , 分类ID: 13737835 规格ID: 20830070675 , 价格: 3 菜名: 有机花菜 , 菜ID: 17548707731 , 分类ID: 13737835 规格ID: 20830071699 , 价格: 3.5 菜名: 西兰花 , 菜ID: 17548708755 , 分类ID: 13737835 规格ID: 20830072723 , 价格: 3.5 菜名: 西红柿 , 菜ID: 17548709779 , 分类ID: 13737835 规格ID: 20830073747 , 价格: 3 菜名: 海带结 , 菜ID: 17548710803 , 分类ID: 13737835 规格ID: 20830074771 , 价格: 2.5 菜名: 金针菇 , 菜ID: 17548711827 , 分类ID: 13737835 规格ID: 20830075795 , 价格: 3 菜名: 香菇 , 菜ID: 17548712851 , 分类ID: 13737835 规格ID: 20830076819 , 价格: 3 菜名: 秀珍菇 , 菜ID: 17548713875 , 分类ID: 13737835 规格ID: 20830077843 , 价格: 3 菜名: 海鲜菇 , 菜ID: 17548714899 , 分类ID: 13737835 规格ID: 20830078867 , 价格: 3.5 菜名: 黑木耳 , 菜ID: 17548715923 , 分类ID: 13737835 规格ID: 20830079891 , 价格: 3 菜名: 红薯 , 菜ID: 17548717971 , 分类ID: 13737835 规格ID: 20830081939 , 价格: 2.5 菜名: 特级笋尖/水笋 , 菜ID: 17548718995 , 分类ID: 13737835 规格ID: 20830082963 , 价格: 4 分类名: 豆蛋类 菜名: 油豆腐 , 菜ID: 17548716947 , 分类ID: 13737840 规格ID: 20830080915 , 价格: 3 菜名: 日本豆腐 , 菜ID: 17548721043 , 分类ID: 13737840 规格ID: 20830085011 , 价格: 3 菜名: 绿豆芽 , 菜ID: 17548722067 , 分类ID: 13737840 规格ID: 20830086035 , 价格: 2 菜名: 豆腐皮 , 菜ID: 17548723091 , 分类ID: 13737840 规格ID: 20830087059 , 价格: 2.5 菜名: 厚百叶 , 菜ID: 17548724115 , 分类ID: 13737840 规格ID: 20830088083 , 价格: 3 菜名: 腐竹 , 菜ID: 17548725139 , 分类ID: 13737840 规格ID: 20830089107 , 价格: 3 菜名: 鸭血 , 菜ID: 17548726163 , 分类ID: 13737840 规格ID: 20830090131 , 价格: 3 菜名: 鹌鹑蛋 , 菜ID: 17548727187 , 分类ID: 13737840 规格ID: 20830091155 , 价格: 2.5 菜名: 油面筋 , 菜ID: 17548728211 , 分类ID: 13737840 规格ID: 20830092179 , 价格: 2.5 菜名: 油条 , 菜ID: 17548729235 , 分类ID: 13737840 规格ID: 20830093203 , 价格: 2.5 分类名: 主食类 菜名: 锅巴 , 菜ID: 17548730259 , 分类ID: 13737847 规格ID: 20830094227 , 价格: 2.5 菜名: 方便面 , 菜ID: 17548731283 , 分类ID: 13737847 规格ID: 20830095251 , 价格: 3 菜名: 鸡蛋面 , 菜ID: 17548732307 , 分类ID: 13737847 规格ID: 20830096275 , 价格: 2.5 菜名: 红薯宽粉 , 菜ID: 17548733331 , 分类ID: 13737847 规格ID: 20830097299 , 价格: 3 菜名: 红薯细粉 , 菜ID: 17548734355 , 分类ID: 13737847 规格ID: 20830098323 , 价格: 3 菜名: 蒙古宽粉 , 菜ID: 17548735379 , 分类ID: 13737847 规格ID: 20830099347 , 价格: 3 菜名: 手工细面 , 菜ID: 17548736403 , 分类ID: 13737847 规格ID: 20830100371 , 价格: 2.5 菜名: 刀削面 , 菜ID: 17548737427 , 分类ID: 13737847 规格ID: 20830101395 , 价格: 3 菜名: 玉米面条 , 菜ID: 17548738451 , 分类ID: 13737847 规格ID: 20830102419 , 价格: 4 菜名: 魔芋丝结 , 菜ID: 17548739475 , 分类ID: 13737847 规格ID: 20830103443 , 价格: 5 菜名: 龙口粉丝 , 菜ID: 17548740499 , 分类ID: 13737847 规格ID: 20830104467 , 价格: 4 菜名: 年糕节 , 菜ID: 17548741523 , 分类ID: 13737847 规格ID: 20830105491 , 价格: 2 分类名: 饿了么送红包 菜名: 扫码领红包 , 菜ID: 260439795603 , 分类ID: 526021154 规格ID: 301159743379 , 价格: 0.01 分类名: 霸道总裁套餐 菜名: 招牌霸道~经典荤素~套餐 , 菜ID: 200000173605996435 , 分类ID: 1238754176 规格ID: 200000199013771155 , 价格: 29.4 菜名: 招牌霸道~素食主义~套餐 , 菜ID: 200000173616109459 , 分类ID: 1238754176 规格ID: 200000199009531795 , 价格: 25.2 二、抓取博客园某园友的首页文章列表 以我自己的博客为例: from urllib import request import random from bs4 import BeautifulSoup url = "http://yjmyzz.cnblogs.com/" # 多搞几个user-agent 看上去更真实点~_^ user_agents = [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36 QQBrowser/4.3.4986.400', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:59.0) Gecko/20100101 Firefox/59.0'] random_user_agent = user_agents[random.randint(0, len(user_agents) - 1)] page = request.Request(url, headers={'User-Agent': random_user_agent}) html = request.urlopen(page).read().decode("utf-8") bsObj = BeautifulSoup(html, "lxml") # 找出标题的a链接 title_links = bsObj.find_all("a", {"class": "postTitle2"}) with open("blog.csv", "a", encoding='utf-8') as f: i = 0 for link in title_links: i += 1 print(str(i), "\t", link.string, "\t", link["href"]) # 保存到csv文件中 f.write(str(i) + "\t" + link.string + "\t" + link["href"] + "\n") 注:BeautifulSoup是一个专门的解析html/xml的模块,贼好用。 输出如下: 1 [置顶]关于博客的背景音乐 http://www.cnblogs.com/yjmyzz/p/listen-to-your-heart.html 2 python: 序列化/反序列化及对象的深拷贝/浅拷贝 http://www.cnblogs.com/yjmyzz/p/python-serialization-and-object-copy.html 3 python中的zip、lambda、map操作 http://www.cnblogs.com/yjmyzz/p/python-zip-lambda-map.html 4 python面向对象笔记 http://www.cnblogs.com/yjmyzz/p/python-object-oriented-programming.html 5 RxJava2学习笔记(3) http://www.cnblogs.com/yjmyzz/p/rx-java-2-tutorial-3.html 6 RxJava2学习笔记(2) http://www.cnblogs.com/yjmyzz/p/rx-java-2-tutorial-2.html 7 RxJava2学习笔记(1) http://www.cnblogs.com/yjmyzz/p/rx-java-2-tutorial-1.html 8 Matplotlib新手上路(下) http://www.cnblogs.com/yjmyzz/p/matplotlib-tutorial-3.html 9 Matplotlib新手上路(中) http://www.cnblogs.com/yjmyzz/p/matplotlib-tutorial-2.html 10 Matplotlib新手上路(上) http://www.cnblogs.com/yjmyzz/p/matplotlib-tutorial-1.html 11 pycharm如何设置python版本、设置国内pip镜像、添加第三方类库 http://www.cnblogs.com/yjmyzz/p/pycharm-add-third-package-and-add-domestic-mirror.html 12 利用java8对设计模式的重构 http://www.cnblogs.com/yjmyzz/p/refactor-design-pattern-using-java8.html 13 机器学习笔记(6):多类逻辑回归-使用gluon http://www.cnblogs.com/yjmyzz/p/8128122.html 14 spring cloud:Edgware.RELEASE版本hystrix超时新坑 http://www.cnblogs.com/yjmyzz/p/8097713.html 15 spring cloud:Edgware.RELEASE版本中zuul回退方法的变化 http://www.cnblogs.com/yjmyzz/p/8093462.html 16 spring cloud:config-server中@RefreshScope的"陷阱" http://www.cnblogs.com/yjmyzz/p/8085530.html 17 机器学习笔记(5):多类逻辑回归-手动添加隐藏层 http://www.cnblogs.com/yjmyzz/p/8035041.html 18 机器学习笔记(4):多类逻辑回归-使用gluton http://www.cnblogs.com/yjmyzz/p/8034597.html 19 spring boot + embed tomcat + standalone jar的内存泄露问题 http://www.cnblogs.com/yjmyzz/p/the-memory-leak-problem-of-spring-boot-with-embed-tomcat.html 20 机器学习笔记(3):多类逻辑回归 http://www.cnblogs.com/yjmyzz/p/7789252.html 21 归一化(softmax)、信息熵、交叉熵 http://www.cnblogs.com/yjmyzz/p/7822990.html 22 NDArray自动求导 http://www.cnblogs.com/yjmyzz/p/7783286.html 23 机器学习笔记(2):线性回归-使用gluon http://www.cnblogs.com/yjmyzz/p/7774166.html 24 机器学习笔记(1):线性回归 http://www.cnblogs.com/yjmyzz/p/7764496.html 25 mxnet安装及NDArray初体验 http://www.cnblogs.com/yjmyzz/p/mxnet-install-and-ndarray-demo.html 26 jupyter notebook 在mac OS上的安装 http://www.cnblogs.com/yjmyzz/p/how-to-install-jupyter-notebook-on-mac.html 27 spring cloud 学习(11) - 用fastson替换jackson及用gb2312码输出 http://www.cnblogs.com/yjmyzz/p/spring-cloud-set-response-gbk-encoding.html 28 spring cloud 学习(10) - 利用springfox集成swagger http://www.cnblogs.com/yjmyzz/p/how-to-integrate-swagger-with-spring-cloud-by-springfox.html 29 spring-boot 速成(12) - 如何注入多个redis StringRedisTemplate http://www.cnblogs.com/yjmyzz/p/how-to-inject-multi-redis-instance-in-spring-boot.html 30 spring cloud 学习(9) - turbine stream无法在eureka注册的解决办法 http://www.cnblogs.com/yjmyzz/p/spring-cloud-turbine-eureka-register-problem.html 31 java:线上问题排查常用手段 http://www.cnblogs.com/yjmyzz/p/7478266.html 32 java一些常用并发工具示例 http://www.cnblogs.com/yjmyzz/p/java-concurrent-tools-sample.html 33 kafka集群部署 http://www.cnblogs.com/yjmyzz/p/kafka-cluster-deployment.html 34 spring cloud 学习(8) - sleuth & zipkin 调用链跟踪 http://www.cnblogs.com/yjmyzz/p/spring-cloud-with-zipkin.html 35 spring集成kafka http://www.cnblogs.com/yjmyzz/p/spring-integration-with-kafka.html 36 @Transactional导致AbstractRoutingDataSource动态数据源无法切换的解决办法 http://www.cnblogs.com/yjmyzz/p/7390331.html 37 centos上安装elasticsearch 5.5.1 遇到的各种坑 http://www.cnblogs.com/yjmyzz/p/7372561.html 38 spring cloud 学习(7) - 生产环境如何不停机热发布? http://www.cnblogs.com/yjmyzz/p/how-to-hot-release-using-eureka-rest-operation.html 39 spring-boot 速成(11) - 单元测试 http://www.cnblogs.com/yjmyzz/p/unit-test-with-spring-boot.html 40 spring-boot 速成(10) -【个人邮箱/企业邮箱】发送邮件 http://www.cnblogs.com/yjmyzz/p/send-mail-using-spring-boot.html 41 spring cloud 学习(6) - zuul 微服务网关 http://www.cnblogs.com/yjmyzz/p/spring-cloud-zuul-demo.html csv文件打开截图: 参考文档: http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/ 作者: 菩提树下的杨过 出处: http://yjmyzz.cnblogs.com 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册