首页 > 其他分享 >爬虫遇到了点问题

爬虫遇到了点问题

时间:2023-04-04 10:11:25浏览次数:30  
标签:FuncParser func string 遇到 Parser 爬虫 问题 Str runtime

正常在写一些爬虫代码的时候多少都会出点小问题,一位合格的程序员应该会认真排除并加以解决错误,如果是新手看着满屏的代码可能会一筹莫展。

golang爬某网站代码优化后,运行报了如下的错,找了半小时才找到原因,在此记录一下。

代码是这样的:

有一个interface类型的Parser:

type Parser interface {
   Parser(contents []byte, url string) ParserResult
   Serialize() (funcName string, args interface{})
}

有一个struct类型的FuncParser:

type FuncParser struct {
   parser ParserFunc
   funcName string
}

FuncParser 实现了Parser 接口:

func (f *FuncParser) Parser(contents []byte, url string) ParserResult {
   return f.Parser(contents, url)
}

func (f *FuncParser) Serialize() (funcName string, args interface{}) {
   return f.funcName, nil
}

抛开爬虫代码整体的复杂度,将代码简化到如下这样:

type ParserFunc func(url string) string

type FuncParser struct {
    parser ParserFunc
}

func (f *FuncParser) Parser(url string) string {
    return f.Parser(url)
}

func main() {

    funcParse := FuncParser{
        func(url string) string {
            return url
        },
    }

    funcParse.Parser("http://www.zhenai.com/zhenghun")
}

运行代码后同样会报错:

runtime: goroutine stack exceeds 1000000000-byte limit
fatal error: stack overflow

runtime stack:
runtime.throw(0x467297, 0xe)
    D:/Program Files/Go/go103/src/runtime/panic.go:616 +0x88
runtime.newstack()
    D:/Program Files/Go/go103/src/runtime/stack.go:1054 +0x72d
runtime.morestack()
    D:/Program Files/Go/go103/src/runtime/asm_amd64.s:480 +0x91

这个示例就很明显了,FuncParser的Parser方法里形成了递归调用(自己调自己),递归调用自身导致栈溢出,导致报错。应该改成这样:(小写的parser)

实际上goland开发工具里已经提示了Recursive Call


一不小心就会写出这种代码,再看如下代码:

package main

import (
    "fmt"
)

type Str string

func (s Str) String() string {
    return fmt.Sprintf("Str: %s", s)
}

func main() {
    var s Str = "hi"
    fmt.Println(s)
}

同样报错:

You are implementing Str.String in terms of itself. return fmt.Sprintf("Str: %s", s) will call s.String(), resulting in infinite recursion. Convert s to string first.

This is working as intended, you are using the %s verb to call Str's String method, which uses fmt.Sprint to call Str's String method, and so on.

正常代码应该如下:

实际上,goland开发工具里也会警告该问题的:

看来平时编写代码,警告还是得注意的。

标签:FuncParser,func,string,遇到,Parser,爬虫,问题,Str,runtime
From: https://www.cnblogs.com/q-q56731526/p/17285462.html

相关文章

  • [性能测试实战30讲」之问题问答整理十七
    思考题:Tomcat的应用服务器,应该如何拆解监控计数器呢?我们应该如何判断应用服务器的线程是否够用?读者:1.如何判断代码快不快,我的理解是,压力工具中的线程数设置低于中间件的线程数,看看测试过程中服务器返回响应是否足够快2.如何判断应用服务器线程是否够用?测试过程中应用监控工具如jvi......
  • 记一次springboot通过jackson渲染到前端,出现大写字母变成小写问题
    前言最近业务部门接手了外包供应商的项目过来自己运维,该部门的小伙伴发现了一个问题,比如后端的DTO有个属性名为nPrice的字段,通过json渲染到前端后,变成nprice,而预期的字段是要为nPrice。于是他们就找到我们部门,希望我们能帮忙解决一下这个问题,本文就聊聊如何解决问题,至于为什么会......
  • undefined symbol问题的查找、定位与解决方法
    今天被客户测出来一个问题:程序执行中报错,报错内容如下XXXX:symbollookuperror:/home/....../libpdfium.so:undefinedsymbol:CRYPT_MD5Generate报错分析:    这个问题表明是符号未定义的问题,而且直接定位于产品链接的第三方动态库libpdfium.so中,于是从libpdfium.so中......
  • 爬虫中的代理问题
    最近身边很多人都遇到爬虫中的爬虫ip问题,写下这篇博客来记录自己所学,希望可以帮助到你们。可能很多人都会问为什么我需要用爬虫ip呢?不用不可以吗?用了爬虫ip之后发现爬虫抓取数据的速度反而下降了不少于是放弃爬虫爬虫ip的使用。如果我们只是进行少量数据的爬取,用本机的IP与User-......
  • 【AGC】引入AGC插件SDK后应用出现中文名乱码问题
    【关键字】AGC、android、插件 【问题描述】开发者反馈应用集成了AGCAppLinking服务,在引入AGC插件时遇到了一些问题。引入AGC插件后应用的中文名出现乱码的问题,具体如下所述:在应用级的build.gradle中引入com.huawei.agconnect后应用中文名乱码1.在android/app/build.gradl......
  • magento 问题解答 FQA
    1.IsthereawaybymysqltosetALLproductvisibilitytocatalog,search? 批量修改产品可见 openuptheeav_attributetableandfindtherowwhereattribute_code=visibility.Takenoteoftheattribute_id,mostlikelyitwillbe85.Alsotakenotetha......
  • android 解决ScrollView嵌套ListView的问题,不能全屏,全屏不能显示下面控件
    在开发中遇到ScrollView嵌套ListView的问题,最开始发出不能全屏,效果是这样的;但我想要的效果是这样的:下面看一下布局文件:<?xmlversion="1.0"encoding="utf-8"?><ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_p......
  • P2756 飞行员配对方案问题
    一共有n个飞行员,其中有m个外籍飞行员和(n−m)个英国飞行员,外籍飞行员从1到m编号,英国飞行员从m+1到n编号。对于给定的外籍飞行员与英国飞行员的配合情况,设计一个算法找出最佳飞行员配对方案,使皇家空军一次能派出最多的飞机。 二分图板子题用网络流输出时,判断w[......
  • Android与STM32通信中巧妙解决中文乱码问题
    前言网上一大堆都是要多种格式相互转换,并且要很大的字库文件,对于小应用工程,小容量的STM32芯片,额外多出这些开销会感到蛮不舒服的,而且绝大部分的乱码问题时发生在STM32这边,所以本文是从Android端解决编码格式转化的问题,STM32那边稍做处理即可,我做的转换是从UTF-8转到GBK解决方案......
  • 11.迷宫问题
    原题链接:https://www.acwing.com/problem/content/description/1078/#include<iostream>#include<cstring>#include<vector>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;constintN=1010;intn,hh,tt;in......