golang 番茄小说字体反爬

package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"strings"

	"github.com/PuerkitoBio/goquery"
)

func main() {
	// 创建HTTP客户端
	client := &http.Client{}

	// 构建请求
	req, err := http.NewRequest("GET", "https://fanqienovel.com/reader/6982735801973113351?enter_from=page", nil)
	if err != nil {
		log.Fatalf("Failed to create request: %v", err)
	}

	// 设置请求头
	req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
	req.Header.Set("Accept-Language", "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6")
	req.Header.Set("Cache-Control", "max-age=0")
	req.Header.Set("Cookie", "novel_web_id=7350181200056075776; d_ticket=53cc8a20074e10f2c693b515e43b6c548dea7; odin_tt=5833bb4a17974d6e3ab335db62c4e013bff999554fbcbd2586ba341e8f1386f556472d204d6b37e5f8f9dc39ba695971332ef342aa9d0d12b395952055069829; sid_guard=2d43596afccd3951b71ee594c79dd5ad%7C1711347473%7C5184000%7CFri%2C+24-May-2024+06%3A17%3A53+GMT; store-region=cn-gd; store-region-src=uid; ttwid=1%7Cz1GRqvabhoW9kMzyud2S6VkHo7T3rOVlRDlDNAxrmwQ%7C1713354873%7C39535dba5265ab4c16facea4dd835521d424da82dde8aac2af9f91b80478f816; Hm_lvt_2667d29c8e792e6fa9182c20a3013175=1725724496; HMACCOUNT=FDA169676751564E; csrf_session_id=37039977ccae85a232fc15d18132ecc3; s_v_web_id=verify_m0sbt61z_D59AmZy1_gK2Z_4U94_8JaD_vFR42hZTta6d; Hm_lpvt_2667d29c8e792e6fa9182c20a3013175=1725724505; ttwid=1%7Cz1GRqvabhoW9kMzyud2S6VkHo7T3rOVlRDlDNAxrmwQ%7C1725724505%7C54ad5a3873abb6283bd72b4f6ad1c281588abaeafc9128e3b3eea2f8d777d4b8")
	req.Header.Set("Priority", "u=0, i")
	req.Header.Set("Referer", "https://fanqienovel.com/page/6982529841564224526?enter_from=stack-room")
	req.Header.Set("Sec-Ch-Ua", `"Microsoft Edge";v="125", "Chromium";v="125", "Not.A/Brand";v="24"`)
	req.Header.Set("Sec-Ch-Ua-Mobile", "?0")
	req.Header.Set("Sec-Ch-Ua-Platform", `"Windows"`)
	req.Header.Set("Sec-Fetch-Dest", "document")
	req.Header.Set("Sec-Fetch-Mode", "navigate")
	req.Header.Set("Sec-Fetch-Site", "same-origin")
	req.Header.Set("Sec-Fetch-User", "?1")
	req.Header.Set("Upgrade-Insecure-Requests", "1")
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0")

	// 发送请求
	resp, err := client.Do(req)
	if err != nil {
		log.Fatalf("Failed to execute request: %v", err)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		fmt.Println("Error reading response body:", err)
		return
	}

	// 输出 UTF-8 解码的内容
	// 将网页内容解析成 Document
	doc, err := goquery.NewDocumentFromReader(strings.NewReader(string(body)))
	if err != nil {
		fmt.Println("Error:", err)
		return
	}

	// 选择具有 muye-reader-content noselect 类的 div 元素
	// 提取所有 .muye-reader-content-16 类下的 p 标签的文本内容

	// 打印提取的文本内容
	// 提取所有 .muye-reader-content-16 类下的 p 标签的文本内容
	pTexts := doc.Find(".muye-reader-content-16 p").Map(func(i int, s *goquery.Selection) string {
		return s.Text()
	})
	var mergedText string
	for _, text := range pTexts {
		mergedText += text + "\n"
	}
	decimal := 28814

	// 将十进制数转换为十六进制字符串,并使用FormatInt函数和%X格式化动词
	//hexStr := strconv.FormatInt(int64(decimal), 16)
	yanFromCodePoint := string(rune(decimal))
	fmt.Println(yanFromCodePoint) // 输出: 炎
	fmt.Println(pTexts)
	// 打印每个 p 标签的文本内容,并显示每个字符的 ASCII 码值
	for _, text := range []rune(mergedText) {
		//fmt.Printf("p[%d]: ", i)

		//fmt.Printf("%d ", int(text))

		//fmt.Printf("\\u%04x ", text)
		//fmt.Printf("%d ", int(text))
		if int(text) > 50000 && int(text) < 60000 {
			if value, ok := strss[fmt.Sprintf("%d", int(text))]; ok {
				fmt.Print(value)
			} else {
				fmt.Print(int(text))
			}

		} else {
			fmt.Print(string(text))
		}

		//fmt.Println()
	}
	// // 检查响应状态码是否为成功
	// if resp.StatusCode != http.StatusOK {
	// 	log.Fatalf("Request failed with status code: %d", resp.StatusCode)
	// }

	// // 创建文件
	// file, err := os.Create("./a.html")
	// if err != nil {
	// 	log.Fatalf("Failed to create file: %v", err)
	// }
	// defer file.Close()

	// // 将响应体写入文件
	// _, err = io.Copy(file, resp.Body)
	// if err != nil {
	// 	log.Fatalf("Failed to write file: %v", err)
	// }

	// fmt.Println("File saved successfully.")
}

var strss map[string]string = map[string]string{
	"58670": "0",
	"58413": "1",
	"58678": "2",
	"58371": "3",
	"58353": "4",
	"58480": "5",
	"58359": "6",
	"58449": "7",
	"58540": "8",
	"58692": "9",
	"58712": "a",
	"58542": "b",
	"58575": "c",
	"58626": "d",
	"58691": "e",
	"58561": "f",
	"58362": "g",
	"58619": "h",
	"58430": "i",
	"58531": "j",
	"58588": "k",
	"58440": "l",
	"58681": "m",
	"58631": "n",
	"58376": "o",
	"58429": "p",
	"58555": "q",
	"58498": "r",
	"58518": "s",
	"58453": "t",
	"58397": "u",
	"58356": "v",
	"58435": "w",
	"58514": "x",
	"58482": "y",
	"58529": "z",
	"58515": "A",
	"58688": "B",
	"58709": "C",
	"58344": "D",
	"58656": "E",
	"58381": "F",
	"58576": "G",
	"58516": "H",
	"58463": "I",
	"58649": "J",
	"58571": "K",
	"58558": "L",
	"58433": "M",
	"58517": "N",
	"58387": "O",
	"58687": "P",
	"58537": "Q",
	"58541": "R",
	"58458": "S",
	"58390": "T",
	"58466": "U",
	"58386": "V",
	"58697": "W",
	"58519": "X",
	"58511": "Y",
	"58634": "Z",
	"58611": "的",
	"58590": "一",
	"58398": "是",
	"58422": "了",
	"58657": "我",
	"58666": "不",
	"58562": "人",
	"58345": "在",
	"58510": "他",
	"58496": "有",
	"58654": "这",
	"58441": "个",
	"58493": "上",
	"58714": "们",
	"58618": "来",
	"58528": "到",
	"58620": "时",
	"58403": "大",
	"58461": "地",
	"58481": "为",
	"58700": "子",
	"58708": "中",
	"58503": "你",
	"58442": "说",
	"58639": "生",
	"58506": "国",
	"58663": "年",
	"58436": "着",
	"58563": "就",
	"58391": "那",
	"58357": "和",
	"58354": "要",
	"58695": "她",
	"58372": "出",
	"58696": "也",
	"58551": "得",
	"58445": "里",
	"58408": "后",
	"58599": "自",
	"58424": "以",
	"58394": "会",
	"58348": "家",
	"58426": "可",
	"58673": "下",
	"58417": "而",
	"58556": "过",
	"58603": "天",
	"58565": "去",
	"58522": "能",
	"58632": "对",
	"58622": "小",
	"58350": "多",
	"58605": "然",
	"58617": "心",
	"58401": "学",
	"58637": "么",
	"58684": "之",
	"58382": "都",
	"58464": "好",
	"58487": "看",
	"58693": "起",
	"58608": "发",
	"58392": "当",
	"58474": "没",
	"58601": "成",
	"58355": "只",
	"58573": "如",
	"58499": "事",
	"58469": "把",
	"58361": "还",
	"58698": "用",
	"58489": "第",
	"58711": "样",
	"58457": "道",
	"58635": "想",
	"58492": "作",
	"58647": "种",
	"58623": "开",
	"58521": "美",
	"58609": "总",
	"58530": "从",
	"58665": "无",
	"58652": "情",
	"58676": "己",
	"58456": "面",
	"58581": "最",
	"58509": "女",
	"58488": "但",
	"58363": "现",
	"58685": "前",
	"58396": "些",
	"58523": "所",
	"58471": "同",
	"58485": "日",
	"58613": "手",
	"58533": "又",
	"58589": "行",
	"58527": "意",
	"58593": "动",
	"58699": "方",
	"58707": "期",
	"58414": "它",
	"58596": "头",
	"58570": "经",
	"58660": "长",
	"58364": "儿",
	"58526": "回",
	"58501": "位",
	"58638": "分",
	"58404": "爱",
	"58677": "老",
	"58535": "因",
	"58629": "很",
	"58577": "给",
	"58606": "名",
	"58497": "法",
	"58662": "间",
	"58479": "斯",
	"58532": "知",
	"58380": "世",
	"58385": "什",
	"58405": "两",
	"58644": "次",
	"58578": "使",
	"58505": "身",
	"58564": "者",
	"58412": "被",
	"58686": "高",
	"58624": "已",
	"58667": "亲",
	"58607": "其",
	"58616": "进",
	"58368": "此",
	"58427": "话",
	"58423": "常",
	"58633": "与",
	"58525": "活",
	"58543": "正",
	"58418": "感",
	"58597": "见",
	"58683": "明",
	"58507": "问",
	"58621": "力",
	"58703": "理",
	"58438": "尔",
	"58536": "点",
	"58384": "文",
	"58484": "几",
	"58539": "定",
	"58554": "本",
	"58421": "公",
	"58347": "特",
	"58569": "做",
	"58710": "外",
	"58574": "孩",
	"58375": "相",
	"58645": "西",
	"58592": "果",
	"58572": "走",
	"58388": "将",
	"58370": "月",
	"58399": "十",
	"58651": "实",
	"58546": "向",
	"58504": "声",
	"58419": "车",
	"58407": "全",
	"58672": "信",
	"58675": "重",
	"58538": "三",
	"58465": "机",
	"58374": "工",
	"58579": "物",
	"58402": "气",
	"58702": "每",
	"58553": "并",
	"58360": "别",
	"58389": "真",
	"58560": "打",
	"58690": "太",
	"58473": "新",
	"58512": "比",
	"58653": "才",
	"58704": "便",
	"58545": "夫",
	"58641": "再",
	"58475": "书",
	"58583": "部",
	"58472": "水",
	"58478": "像",
	"58664": "眼",
	"58586": "等",
	"58568": "体",
	"58674": "却",
	"58490": "加",
	"58476": "电",
	"58346": "主",
	"58630": "界",
	"58595": "门",
	"58502": "利",
	"58713": "海",
	"58587": "受",
	"58548": "听",
	"58351": "表",
	"58547": "德",
	"58443": "少",
	"58460": "克",
	"58636": "代",
	"58585": "员",
	"58625": "许",
	"58694": "磨",
	"58428": "先",
	"58640": "口",
	"58628": "由",
	"58612": "死",
	"58446": "安",
	"58468": "写",
	"58410": "性",
	"58508": "马",
	"58594": "光",
	"58483": "白",
	"58544": "或",
	"58495": "住",
	"58450": "难",
	"58643": "望",
	"58486": "教",
	"58406": "命",
	"58447": "花",
	"58669": "结",
	"58415": "乐",
	"58444": "色",
	"58549": "更",
	"58494": "拉",
	"58409": "东",
	"58658": "神",
	"58557": "记",
	"58602": "处",
	"58559": "让",
	"58610": "母",
	"58513": "父",
	"58500": "应",
	"58378": "直",
	"58680": "字",
	"58352": "场",
	"58383": "平",
	"58454": "报",
	"58671": "友",
	"58668": "关",
	"58452": "放",
	"58627": "至",
	"58400": "张",
	"58455": "认",
	"58416": "接",
	"58552": "告",
	"58614": "入",
	"58582": "笑",
	"58534": "内",
	"58701": "英",
	"58349": "军",
	"58491": "候",
	"58467": "民",
	"58365": "岁",
	"58598": "往",
	"58425": "何",
	"58462": "度",
	"58420": "山",
	"58661": "觉",
	"58615": "路",
	"58648": "带",
	"58470": "万",
	"58377": "男",
	"58520": "边",
	"58646": "风",
	"58600": "解",
	"58431": "叫",
	"58715": "任",
	"58524": "金",
	"58439": "快",
	"58566": "原",
	"58477": "吃",
	"58642": "妈",
	"58437": "变",
	"58411": "通",
	"58451": "师",
	"58395": "立",
	"58369": "象",
	"58706": "数",
	"58705": "四",
	"58379": "失",
	"58567": "满",
	"58373": "战",
	"58448": "远",
	"58659": "格",
	"58434": "土",
	"58679": "音",
	"58432": "轻",
	"58689": "目",
	"58591": "条",
	"58682": "呢",
}

爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值