[{"data":1,"prerenderedAt":2645},["ShallowReactive",2],{"post-2025-11-09-taobao-search":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"body":15,"_type":2639,"_id":2640,"_source":2641,"_file":2642,"_stem":2643,"_extension":2644},"\u002Fblog\u002F2025-11-09-taobao-search","blog",false,"","淘宝搜索接口实现","Python爬虫实战：淘宝搜索接口逆向分析，sign参数JS逆向、execjs调用与数据采集。","2025-11-09",[12,13,14],"Python","爬虫","JavaScript逆向",{"type":16,"children":17,"toc":2633},"root",[18,26,32,41,69,74,80,84,89,98,103,111,141,149,161,196,204,238,243,246,280,379,400,486,552,560,593,601,620,628,633,638,643,646,651,680,685,984,989,994,997,1010,1214,1228,1233,1236,1317,1473,1478,1481,1493,1786,1791,1794,1830,2083,2088,2091,2096,2228,2233,2236,2241,2272,2277,2282,2290,2295,2303,2323,2331,2336,2344,2349,2357,2362,2451,2470,2595,2600,2608,2627],{"type":19,"tag":20,"props":21,"children":23},"element","h2",{"id":22},"前言",[24],{"type":25,"value":22},"text",{"type":19,"tag":27,"props":28,"children":29},"p",{},[30],{"type":25,"value":31},"Hello，大家好啊！经过两个月的疯玩，现在临近期中考试，我又来沉淀了！最近对Python爬虫挺感兴趣，于是进行简单学习后搞了一个入门小项目，这次我将对淘宝网站的接口进行研究！",{"type":19,"tag":27,"props":33,"children":34},{},[35],{"type":19,"tag":36,"props":37,"children":38},"strong",{},[39],{"type":25,"value":40},"前提准备",{"type":19,"tag":42,"props":43,"children":44},"ul",{},[45,51],{"type":19,"tag":46,"props":47,"children":48},"li",{},[49],{"type":25,"value":50},"模块安装：Requests、fake_useragent、execjs",{"type":19,"tag":46,"props":52,"children":53},{},[54,56],{"type":25,"value":55},"目标网站：",{"type":19,"tag":57,"props":58,"children":60},"font",{"color":59},"blue",[61],{"type":19,"tag":62,"props":63,"children":67},"a",{"href":64,"rel":65},"https:\u002F\u002Fwww.taobao.com",[66],"nofollow",[68],{"type":25,"value":64},{"type":19,"tag":20,"props":70,"children":72},{"id":71},"分析目标",[73],{"type":25,"value":71},{"type":19,"tag":75,"props":76,"children":78},"h4",{"id":77},"初步分析",[79],{"type":25,"value":77},{"type":19,"tag":81,"props":82,"children":83},"hr",{},[],{"type":19,"tag":27,"props":85,"children":86},{},[87],{"type":25,"value":88},"首先，打开淘宝官方网站，在搜索栏中输入关键字进行搜索，将进入我们即将分析的数据页面，在该网页可以看到商品的名称、价格、销售量等等各种数据信息，接下来我需要对这些数据进行采集。",{"type":19,"tag":27,"props":90,"children":91},{},[92],{"type":19,"tag":93,"props":94,"children":97},"img",{"alt":95,"src":96},"Couioly-2025-11-08_23-33-05","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FCouioly-2025-11-08_23-33-05.png",[],{"type":19,"tag":27,"props":99,"children":100},{},[101],{"type":25,"value":102},"打开network工具，刷新网页对数据包进行抓取，在网页信息中任意找一个价格在network搜索栏中进行搜索，找到我们需要抓取的数据包。",{"type":19,"tag":27,"props":104,"children":105},{},[106],{"type":19,"tag":93,"props":107,"children":110},{"alt":108,"src":109},"Couioly-2025-11-08_23-40-40","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FCouioly-2025-11-08_23-40-40.png",[],{"type":19,"tag":27,"props":112,"children":113},{},[114,116,123,125,131,133,139],{"type":25,"value":115},"工具栏切换至 ",{"type":19,"tag":117,"props":118,"children":120},"code",{"className":119},[],[121],{"type":25,"value":122},"预览",{"type":25,"value":124}," 面板，然后依次点开 ",{"type":19,"tag":117,"props":126,"children":128},{"className":127},[],[129],{"type":25,"value":130},"data",{"type":25,"value":132}," -> ",{"type":19,"tag":117,"props":134,"children":136},{"className":135},[],[137],{"type":25,"value":138},"itemsArray",{"type":25,"value":140},"，将发现我们所需的数据都在该位置，所以可以确定这个数据包就是接下来我所需要采集的目标。",{"type":19,"tag":27,"props":142,"children":143},{},[144],{"type":19,"tag":93,"props":145,"children":148},{"alt":146,"src":147},"Couioly-2025-11-08_23-42-40","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FCouioly-2025-11-08_23-42-40.png",[],{"type":19,"tag":27,"props":150,"children":151},{},[152,153,159],{"type":25,"value":115},{"type":19,"tag":117,"props":154,"children":156},{"className":155},[],[157],{"type":25,"value":158},"载荷",{"type":25,"value":160}," 面板，经过多次数据包的抓取和分析可以发现，变化的参数存在三个：",{"type":19,"tag":42,"props":162,"children":163},{},[164,175,186],{"type":19,"tag":46,"props":165,"children":166},{},[167,173],{"type":19,"tag":117,"props":168,"children":170},{"className":169},[],[171],{"type":25,"value":172},"t",{"type":25,"value":174},": 该参数表示时间戳",{"type":19,"tag":46,"props":176,"children":177},{},[178,184],{"type":19,"tag":117,"props":179,"children":181},{"className":180},[],[182],{"type":25,"value":183},"sign",{"type":25,"value":185},": 加密参数",{"type":19,"tag":46,"props":187,"children":188},{},[189,194],{"type":19,"tag":117,"props":190,"children":192},{"className":191},[],[193],{"type":25,"value":130},{"type":25,"value":195},"参数的q值：搜索内容编码",{"type":19,"tag":27,"props":197,"children":198},{},[199],{"type":19,"tag":93,"props":200,"children":203},{"alt":201,"src":202},"Couioly-2025-11-08_23-48-12","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FCouioly-2025-11-08_23-48-12.png",[],{"type":19,"tag":27,"props":205,"children":206},{},[207,209,214,216,222,224,229,231,236],{"type":25,"value":208},"初步分析，时间戳 ",{"type":19,"tag":117,"props":210,"children":212},{"className":211},[],[213],{"type":25,"value":172},{"type":25,"value":215}," 我可以使用 ",{"type":19,"tag":117,"props":217,"children":219},{"className":218},[],[220],{"type":25,"value":221},"time",{"type":25,"value":223}," 模块来解决，",{"type":19,"tag":117,"props":225,"children":227},{"className":226},[],[228],{"type":25,"value":130},{"type":25,"value":230}," 参数的q值我可以使用字符串拼接方式实现，问题就在与 ",{"type":19,"tag":117,"props":232,"children":234},{"className":233},[],[235],{"type":25,"value":183},{"type":25,"value":237}," 参数的生成。",{"type":19,"tag":75,"props":239,"children":241},{"id":240},"进阶分析",[242],{"type":25,"value":240},{"type":19,"tag":81,"props":244,"children":245},{},[],{"type":19,"tag":27,"props":247,"children":248},{},[249,251,256,258,264,266,271,273,278],{"type":25,"value":250},"接下来，需要对 ",{"type":19,"tag":117,"props":252,"children":254},{"className":253},[],[255],{"type":25,"value":183},{"type":25,"value":257}," 参数进行逆向分析它的生成方式。首先打开全局搜索，输入 ",{"type":19,"tag":117,"props":259,"children":261},{"className":260},[],[262],{"type":25,"value":263},"sign:",{"type":25,"value":265}," 进行搜素，在疑似生成目标参数的js代码片段前打上断点。然后再次执行搜索操作，程序将在断点处中断，通过调试分析发现，某个断点处包含 ",{"type":19,"tag":117,"props":267,"children":269},{"className":268},[],[270],{"type":25,"value":183},{"type":25,"value":272}," 的js代码片段中存在一个对 ",{"type":19,"tag":117,"props":274,"children":276},{"className":275},[],[277],{"type":25,"value":183},{"type":25,"value":279}," 进行赋值的操作，该js代码参考如下：",{"type":19,"tag":281,"props":282,"children":286},"pre",{"code":283,"language":284,"meta":7,"className":285,"style":7},"L{\njsv: 2.0.4,\ncT: t,\nsign: c\n}\n","js","language-js shiki shiki-themes github-dark",[287],{"type":19,"tag":117,"props":288,"children":289},{"__ignoreMap":7},[290,308,343,357,370],{"type":19,"tag":291,"props":292,"children":295},"span",{"class":293,"line":294},"line",1,[296,302],{"type":19,"tag":291,"props":297,"children":299},{"style":298},"--shiki-default:#79B8FF",[300],{"type":25,"value":301},"L",{"type":19,"tag":291,"props":303,"children":305},{"style":304},"--shiki-default:#E1E4E8",[306],{"type":25,"value":307},"{\n",{"type":19,"tag":291,"props":309,"children":311},{"class":293,"line":310},2,[312,318,323,328,333,338],{"type":19,"tag":291,"props":313,"children":315},{"style":314},"--shiki-default:#B392F0",[316],{"type":25,"value":317},"jsv",{"type":19,"tag":291,"props":319,"children":320},{"style":304},[321],{"type":25,"value":322},": ",{"type":19,"tag":291,"props":324,"children":325},{"style":298},[326],{"type":25,"value":327},"2.0",{"type":19,"tag":291,"props":329,"children":330},{"style":304},[331],{"type":25,"value":332},".",{"type":19,"tag":291,"props":334,"children":335},{"style":298},[336],{"type":25,"value":337},"4",{"type":19,"tag":291,"props":339,"children":340},{"style":304},[341],{"type":25,"value":342},",\n",{"type":19,"tag":291,"props":344,"children":346},{"class":293,"line":345},3,[347,352],{"type":19,"tag":291,"props":348,"children":349},{"style":314},[350],{"type":25,"value":351},"cT",{"type":19,"tag":291,"props":353,"children":354},{"style":304},[355],{"type":25,"value":356},": t,\n",{"type":19,"tag":291,"props":358,"children":360},{"class":293,"line":359},4,[361,365],{"type":19,"tag":291,"props":362,"children":363},{"style":314},[364],{"type":25,"value":183},{"type":19,"tag":291,"props":366,"children":367},{"style":304},[368],{"type":25,"value":369},": c\n",{"type":19,"tag":291,"props":371,"children":373},{"class":293,"line":372},5,[374],{"type":19,"tag":291,"props":375,"children":376},{"style":304},[377],{"type":25,"value":378},"}\n",{"type":19,"tag":27,"props":380,"children":381},{},[382,384,390,392,398],{"type":25,"value":383},"向上查找发现，变量 ",{"type":19,"tag":117,"props":385,"children":387},{"className":386},[],[388],{"type":25,"value":389},"c",{"type":25,"value":391}," 是由字符串拼接后作参数传入函数 ",{"type":19,"tag":117,"props":393,"children":395},{"className":394},[],[396],{"type":25,"value":397},"eE",{"type":25,"value":399}," 得到的，涉及字符串如下：",{"type":19,"tag":281,"props":401,"children":403},{"code":402,"language":284,"meta":7,"className":285,"style":7},"c = eE(em.token + \"&\" + eT + \"&\" + eC + \"&\" + ep.data)\n",[404],{"type":19,"tag":117,"props":405,"children":406},{"__ignoreMap":7},[407],{"type":19,"tag":291,"props":408,"children":409},{"class":293,"line":294},[410,415,421,426,431,436,442,447,452,456,460,464,469,473,477,481],{"type":19,"tag":291,"props":411,"children":412},{"style":304},[413],{"type":25,"value":414},"c ",{"type":19,"tag":291,"props":416,"children":418},{"style":417},"--shiki-default:#F97583",[419],{"type":25,"value":420},"=",{"type":19,"tag":291,"props":422,"children":423},{"style":314},[424],{"type":25,"value":425}," eE",{"type":19,"tag":291,"props":427,"children":428},{"style":304},[429],{"type":25,"value":430},"(em.token ",{"type":19,"tag":291,"props":432,"children":433},{"style":417},[434],{"type":25,"value":435},"+",{"type":19,"tag":291,"props":437,"children":439},{"style":438},"--shiki-default:#9ECBFF",[440],{"type":25,"value":441}," \"&\"",{"type":19,"tag":291,"props":443,"children":444},{"style":417},[445],{"type":25,"value":446}," +",{"type":19,"tag":291,"props":448,"children":449},{"style":304},[450],{"type":25,"value":451}," eT ",{"type":19,"tag":291,"props":453,"children":454},{"style":417},[455],{"type":25,"value":435},{"type":19,"tag":291,"props":457,"children":458},{"style":438},[459],{"type":25,"value":441},{"type":19,"tag":291,"props":461,"children":462},{"style":417},[463],{"type":25,"value":446},{"type":19,"tag":291,"props":465,"children":466},{"style":304},[467],{"type":25,"value":468}," eC ",{"type":19,"tag":291,"props":470,"children":471},{"style":417},[472],{"type":25,"value":435},{"type":19,"tag":291,"props":474,"children":475},{"style":438},[476],{"type":25,"value":441},{"type":19,"tag":291,"props":478,"children":479},{"style":417},[480],{"type":25,"value":446},{"type":19,"tag":291,"props":482,"children":483},{"style":304},[484],{"type":25,"value":485}," ep.data)\n",{"type":19,"tag":27,"props":487,"children":488},{},[489,491,497,499,505,507,512,514,520,522,527,529,535,537,543,545,550],{"type":25,"value":490},"将鼠标移动至这些拼接字符串的变量名上面，将弹出该变量的值，多次调试分析值后发现，存在一个 ",{"type":19,"tag":117,"props":492,"children":494},{"className":493},[],[495],{"type":25,"value":496},"em.token",{"type":25,"value":498}," 值，将该值复制后使用放大镜进行搜索发现，该值存在于 ",{"type":19,"tag":117,"props":500,"children":502},{"className":501},[],[503],{"type":25,"value":504},"cookie",{"type":25,"value":506}," 中，每隔一段时间将刷新一次，所以只需及时更换 ",{"type":19,"tag":117,"props":508,"children":510},{"className":509},[],[511],{"type":25,"value":504},{"type":25,"value":513}," 即可；接着是 ",{"type":19,"tag":117,"props":515,"children":517},{"className":516},[],[518],{"type":25,"value":519},"eT",{"type":25,"value":521}," 变量，该变量的值刚好与载荷中的参数 ",{"type":19,"tag":117,"props":523,"children":525},{"className":524},[],[526],{"type":25,"value":172},{"type":25,"value":528}," 相同；变量 ",{"type":19,"tag":117,"props":530,"children":532},{"className":531},[],[533],{"type":25,"value":534},"eC",{"type":25,"value":536}," 经过多次调试发现值是固定的；变量 ",{"type":19,"tag":117,"props":538,"children":540},{"className":539},[],[541],{"type":25,"value":542},"ep.data",{"type":25,"value":544}," 与载荷中的 ",{"type":19,"tag":117,"props":546,"children":548},{"className":547},[],[549],{"type":25,"value":130},{"type":25,"value":551}," 参数相同。",{"type":19,"tag":27,"props":553,"children":554},{},[555],{"type":19,"tag":93,"props":556,"children":559},{"alt":557,"src":558},"Pasted image 20251110125954","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FPasted%20image%2020251110125954.png",[],{"type":19,"tag":27,"props":561,"children":562},{},[563,565,570,572,577,579,584,586,591],{"type":25,"value":564},"至此我们解决了 ",{"type":19,"tag":117,"props":566,"children":568},{"className":567},[],[569],{"type":25,"value":397},{"type":25,"value":571}," 函数传参问题，现在我们需要找到 ",{"type":19,"tag":117,"props":573,"children":575},{"className":574},[],[576],{"type":25,"value":397},{"type":25,"value":578}," 函数体。当程序处于断点调试状态时且断点到对 ",{"type":19,"tag":117,"props":580,"children":582},{"className":581},[],[583],{"type":25,"value":389},{"type":25,"value":585}," 赋值部分的代码片段，可以通过将鼠标移动至 ",{"type":19,"tag":117,"props":587,"children":589},{"className":588},[],[590],{"type":25,"value":397},{"type":25,"value":592}," 函数上，将弹出该函数的原始函数体，点击后将跳转至函数体本身。",{"type":19,"tag":27,"props":594,"children":595},{},[596],{"type":19,"tag":93,"props":597,"children":600},{"alt":598,"src":599},"Pasted image 20251110130039","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FPasted%20image%2020251110130039.png",[],{"type":19,"tag":27,"props":602,"children":603},{},[604,606,611,613,618],{"type":25,"value":605},"然后对该函数体进行复制，单独存入一个js文件中，然后在js文件中写入该函数所需的参数并进行调用调试，查看是否存在不完整情况，若成功得到加密后的 ",{"type":19,"tag":117,"props":607,"children":609},{"className":608},[],[610],{"type":25,"value":183},{"type":25,"value":612}," 值，则代表我们成功的找到了 ",{"type":19,"tag":117,"props":614,"children":616},{"className":615},[],[617],{"type":25,"value":183},{"type":25,"value":619}," 参数值的生成代码块。",{"type":19,"tag":27,"props":621,"children":622},{},[623],{"type":19,"tag":93,"props":624,"children":627},{"alt":625,"src":626},"Pasted image 20251110130142","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FPasted%20image%2020251110130142.png",[],{"type":19,"tag":20,"props":629,"children":631},{"id":630},"代码实现",[632],{"type":25,"value":630},{"type":19,"tag":27,"props":634,"children":635},{},[636],{"type":25,"value":637},"分析了解完搜索部分的实现过程后，我们来设计代码，使用代码实现该功能。",{"type":19,"tag":75,"props":639,"children":641},{"id":640},"代码整体架构",[642],{"type":25,"value":640},{"type":19,"tag":81,"props":644,"children":645},{},[],{"type":19,"tag":27,"props":647,"children":648},{},[649],{"type":25,"value":650},"通过对目标网站的分析以及Requests的请求模块实现，对代码体进行简单构思：",{"type":19,"tag":652,"props":653,"children":654},"ol",{},[655,660,665,670,675],{"type":19,"tag":46,"props":656,"children":657},{},[658],{"type":25,"value":659},"确定请求方式",{"type":19,"tag":46,"props":661,"children":662},{},[663],{"type":25,"value":664},"确定请求头和请求参数",{"type":19,"tag":46,"props":666,"children":667},{},[668],{"type":25,"value":669},"发起请求得到响应体",{"type":19,"tag":46,"props":671,"children":672},{},[673],{"type":25,"value":674},"对响应体中的数据进行提取",{"type":19,"tag":46,"props":676,"children":677},{},[678],{"type":25,"value":679},"对提取到的数据进行保存",{"type":19,"tag":27,"props":681,"children":682},{},[683],{"type":25,"value":684},"编写代码的整体框架：",{"type":19,"tag":281,"props":686,"children":690},{"code":687,"language":688,"meta":7,"className":689,"style":7},"class TaobaoSearch(object):\n\n    def __init__(self):\n        \"\"\"\n        初始化数据，定义用户输入\n        \"\"\"\n    \n    def get_sign(self,t: str,data: str)->str:\n        \"\"\"\n        生成加密参数sign\n        :param t: 时间戳\n        :param data: 请求参数中的data\n        :return: 加密后的sign值\n        \"\"\"\n        \n    def push_requests(self):\n        \"\"\"\n        发送请求，获取搜索数据\n        :return: response响应体\n        \"\"\"\n        \n    def format_and_save_data(self,response):\n        \"\"\"\n        对传入的响应体数据进行处理\n        提取指定的数据内容\n        :param response: 响应体内容\n        :return: None\n        \"\"\"\n        \n    def save_data(self):\n        \"\"\"\n        对提取到的数据进行本地化存储\n        :return: None\n        \"\"\"\n","python","language-python shiki shiki-themes github-dark",[691],{"type":19,"tag":117,"props":692,"children":693},{"__ignoreMap":7},[694,702,711,719,727,735,743,752,761,769,778,787,796,805,813,822,831,839,848,857,865,873,882,890,899,908,917,926,934,942,951,959,968,976],{"type":19,"tag":291,"props":695,"children":696},{"class":293,"line":294},[697],{"type":19,"tag":291,"props":698,"children":699},{},[700],{"type":25,"value":701},"class TaobaoSearch(object):\n",{"type":19,"tag":291,"props":703,"children":704},{"class":293,"line":310},[705],{"type":19,"tag":291,"props":706,"children":708},{"emptyLinePlaceholder":707},true,[709],{"type":25,"value":710},"\n",{"type":19,"tag":291,"props":712,"children":713},{"class":293,"line":345},[714],{"type":19,"tag":291,"props":715,"children":716},{},[717],{"type":25,"value":718},"    def __init__(self):\n",{"type":19,"tag":291,"props":720,"children":721},{"class":293,"line":359},[722],{"type":19,"tag":291,"props":723,"children":724},{},[725],{"type":25,"value":726},"        \"\"\"\n",{"type":19,"tag":291,"props":728,"children":729},{"class":293,"line":372},[730],{"type":19,"tag":291,"props":731,"children":732},{},[733],{"type":25,"value":734},"        初始化数据，定义用户输入\n",{"type":19,"tag":291,"props":736,"children":738},{"class":293,"line":737},6,[739],{"type":19,"tag":291,"props":740,"children":741},{},[742],{"type":25,"value":726},{"type":19,"tag":291,"props":744,"children":746},{"class":293,"line":745},7,[747],{"type":19,"tag":291,"props":748,"children":749},{},[750],{"type":25,"value":751},"    \n",{"type":19,"tag":291,"props":753,"children":755},{"class":293,"line":754},8,[756],{"type":19,"tag":291,"props":757,"children":758},{},[759],{"type":25,"value":760},"    def get_sign(self,t: str,data: str)->str:\n",{"type":19,"tag":291,"props":762,"children":764},{"class":293,"line":763},9,[765],{"type":19,"tag":291,"props":766,"children":767},{},[768],{"type":25,"value":726},{"type":19,"tag":291,"props":770,"children":772},{"class":293,"line":771},10,[773],{"type":19,"tag":291,"props":774,"children":775},{},[776],{"type":25,"value":777},"        生成加密参数sign\n",{"type":19,"tag":291,"props":779,"children":781},{"class":293,"line":780},11,[782],{"type":19,"tag":291,"props":783,"children":784},{},[785],{"type":25,"value":786},"        :param t: 时间戳\n",{"type":19,"tag":291,"props":788,"children":790},{"class":293,"line":789},12,[791],{"type":19,"tag":291,"props":792,"children":793},{},[794],{"type":25,"value":795},"        :param data: 请求参数中的data\n",{"type":19,"tag":291,"props":797,"children":799},{"class":293,"line":798},13,[800],{"type":19,"tag":291,"props":801,"children":802},{},[803],{"type":25,"value":804},"        :return: 加密后的sign值\n",{"type":19,"tag":291,"props":806,"children":808},{"class":293,"line":807},14,[809],{"type":19,"tag":291,"props":810,"children":811},{},[812],{"type":25,"value":726},{"type":19,"tag":291,"props":814,"children":816},{"class":293,"line":815},15,[817],{"type":19,"tag":291,"props":818,"children":819},{},[820],{"type":25,"value":821},"        \n",{"type":19,"tag":291,"props":823,"children":825},{"class":293,"line":824},16,[826],{"type":19,"tag":291,"props":827,"children":828},{},[829],{"type":25,"value":830},"    def push_requests(self):\n",{"type":19,"tag":291,"props":832,"children":834},{"class":293,"line":833},17,[835],{"type":19,"tag":291,"props":836,"children":837},{},[838],{"type":25,"value":726},{"type":19,"tag":291,"props":840,"children":842},{"class":293,"line":841},18,[843],{"type":19,"tag":291,"props":844,"children":845},{},[846],{"type":25,"value":847},"        发送请求，获取搜索数据\n",{"type":19,"tag":291,"props":849,"children":851},{"class":293,"line":850},19,[852],{"type":19,"tag":291,"props":853,"children":854},{},[855],{"type":25,"value":856},"        :return: response响应体\n",{"type":19,"tag":291,"props":858,"children":860},{"class":293,"line":859},20,[861],{"type":19,"tag":291,"props":862,"children":863},{},[864],{"type":25,"value":726},{"type":19,"tag":291,"props":866,"children":868},{"class":293,"line":867},21,[869],{"type":19,"tag":291,"props":870,"children":871},{},[872],{"type":25,"value":821},{"type":19,"tag":291,"props":874,"children":876},{"class":293,"line":875},22,[877],{"type":19,"tag":291,"props":878,"children":879},{},[880],{"type":25,"value":881},"    def format_and_save_data(self,response):\n",{"type":19,"tag":291,"props":883,"children":885},{"class":293,"line":884},23,[886],{"type":19,"tag":291,"props":887,"children":888},{},[889],{"type":25,"value":726},{"type":19,"tag":291,"props":891,"children":893},{"class":293,"line":892},24,[894],{"type":19,"tag":291,"props":895,"children":896},{},[897],{"type":25,"value":898},"        对传入的响应体数据进行处理\n",{"type":19,"tag":291,"props":900,"children":902},{"class":293,"line":901},25,[903],{"type":19,"tag":291,"props":904,"children":905},{},[906],{"type":25,"value":907},"        提取指定的数据内容\n",{"type":19,"tag":291,"props":909,"children":911},{"class":293,"line":910},26,[912],{"type":19,"tag":291,"props":913,"children":914},{},[915],{"type":25,"value":916},"        :param response: 响应体内容\n",{"type":19,"tag":291,"props":918,"children":920},{"class":293,"line":919},27,[921],{"type":19,"tag":291,"props":922,"children":923},{},[924],{"type":25,"value":925},"        :return: None\n",{"type":19,"tag":291,"props":927,"children":929},{"class":293,"line":928},28,[930],{"type":19,"tag":291,"props":931,"children":932},{},[933],{"type":25,"value":726},{"type":19,"tag":291,"props":935,"children":937},{"class":293,"line":936},29,[938],{"type":19,"tag":291,"props":939,"children":940},{},[941],{"type":25,"value":821},{"type":19,"tag":291,"props":943,"children":945},{"class":293,"line":944},30,[946],{"type":19,"tag":291,"props":947,"children":948},{},[949],{"type":25,"value":950},"    def save_data(self):\n",{"type":19,"tag":291,"props":952,"children":954},{"class":293,"line":953},31,[955],{"type":19,"tag":291,"props":956,"children":957},{},[958],{"type":25,"value":726},{"type":19,"tag":291,"props":960,"children":962},{"class":293,"line":961},32,[963],{"type":19,"tag":291,"props":964,"children":965},{},[966],{"type":25,"value":967},"        对提取到的数据进行本地化存储\n",{"type":19,"tag":291,"props":969,"children":971},{"class":293,"line":970},33,[972],{"type":19,"tag":291,"props":973,"children":974},{},[975],{"type":25,"value":925},{"type":19,"tag":291,"props":977,"children":979},{"class":293,"line":978},34,[980],{"type":19,"tag":291,"props":981,"children":982},{},[983],{"type":25,"value":726},{"type":19,"tag":27,"props":985,"children":986},{},[987],{"type":25,"value":988},"整体框架搭建完成后，只需对其进行填空！",{"type":19,"tag":75,"props":990,"children":992},{"id":991},"对象的初始化",[993],{"type":25,"value":991},{"type":19,"tag":81,"props":995,"children":996},{},[],{"type":19,"tag":27,"props":998,"children":999},{},[1000,1002,1008],{"type":25,"value":1001},"在初始化方法 ",{"type":19,"tag":117,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":25,"value":1007},"__init__",{"type":25,"value":1009}," 中，需要对新的对象进行初始化，初始化的数据包含请求头、请求url、存储对象、时间戳、用户输入等内容，代码设计如下：",{"type":19,"tag":281,"props":1011,"children":1013},{"code":1012,"language":688,"meta":7,"className":689,"style":7},"def __init__(self):\n    \"\"\"\n    初始化数据，定义用户输入\n    \"\"\"\n    # 定义初始url\n    self.basic_url = \"https:\u002F\u002Fh5api.m.taoba...2.0\u002F\"\n    # 设置请求头\n    self.headers = {\n        \"Referer\":\"https:\u002F\u002Fs.taobao.com\u002F\",\n        'User-Agent': fake_useragent.UserAgent().random,\n        # 此处淘宝的cookie需要及时更换，否则将显示（令牌过期）\n        'cookie':\"thw=xx; cna=wN4DIV...\"\n    }\n    # 定义时间戳\n    self.time = time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime(time.time()))\n\n    # 创建excel\n    self.wb = workbook.Workbook()\n    # 获取当前正在操作的表对象  激活\n    self.ws = self.wb.active\n    # 设置表头\n    self.ws.append(['商品id','商品标题','商品价格',\"店铺名称\",'发货地址','销售量','图片链接','商品链接'])\n\n    # 获取用户搜索内容\n    self.params = input(f\"\\033[1;37m[{self.time}] Input 请输入你要获取的商品：\\033[0m\")\n",[1014],{"type":19,"tag":117,"props":1015,"children":1016},{"__ignoreMap":7},[1017,1025,1033,1041,1048,1056,1064,1072,1080,1088,1096,1104,1112,1120,1128,1136,1143,1151,1159,1167,1175,1183,1191,1198,1206],{"type":19,"tag":291,"props":1018,"children":1019},{"class":293,"line":294},[1020],{"type":19,"tag":291,"props":1021,"children":1022},{},[1023],{"type":25,"value":1024},"def __init__(self):\n",{"type":19,"tag":291,"props":1026,"children":1027},{"class":293,"line":310},[1028],{"type":19,"tag":291,"props":1029,"children":1030},{},[1031],{"type":25,"value":1032},"    \"\"\"\n",{"type":19,"tag":291,"props":1034,"children":1035},{"class":293,"line":345},[1036],{"type":19,"tag":291,"props":1037,"children":1038},{},[1039],{"type":25,"value":1040},"    初始化数据，定义用户输入\n",{"type":19,"tag":291,"props":1042,"children":1043},{"class":293,"line":359},[1044],{"type":19,"tag":291,"props":1045,"children":1046},{},[1047],{"type":25,"value":1032},{"type":19,"tag":291,"props":1049,"children":1050},{"class":293,"line":372},[1051],{"type":19,"tag":291,"props":1052,"children":1053},{},[1054],{"type":25,"value":1055},"    # 定义初始url\n",{"type":19,"tag":291,"props":1057,"children":1058},{"class":293,"line":737},[1059],{"type":19,"tag":291,"props":1060,"children":1061},{},[1062],{"type":25,"value":1063},"    self.basic_url = \"https:\u002F\u002Fh5api.m.taoba...2.0\u002F\"\n",{"type":19,"tag":291,"props":1065,"children":1066},{"class":293,"line":745},[1067],{"type":19,"tag":291,"props":1068,"children":1069},{},[1070],{"type":25,"value":1071},"    # 设置请求头\n",{"type":19,"tag":291,"props":1073,"children":1074},{"class":293,"line":754},[1075],{"type":19,"tag":291,"props":1076,"children":1077},{},[1078],{"type":25,"value":1079},"    self.headers = {\n",{"type":19,"tag":291,"props":1081,"children":1082},{"class":293,"line":763},[1083],{"type":19,"tag":291,"props":1084,"children":1085},{},[1086],{"type":25,"value":1087},"        \"Referer\":\"https:\u002F\u002Fs.taobao.com\u002F\",\n",{"type":19,"tag":291,"props":1089,"children":1090},{"class":293,"line":771},[1091],{"type":19,"tag":291,"props":1092,"children":1093},{},[1094],{"type":25,"value":1095},"        'User-Agent': fake_useragent.UserAgent().random,\n",{"type":19,"tag":291,"props":1097,"children":1098},{"class":293,"line":780},[1099],{"type":19,"tag":291,"props":1100,"children":1101},{},[1102],{"type":25,"value":1103},"        # 此处淘宝的cookie需要及时更换，否则将显示（令牌过期）\n",{"type":19,"tag":291,"props":1105,"children":1106},{"class":293,"line":789},[1107],{"type":19,"tag":291,"props":1108,"children":1109},{},[1110],{"type":25,"value":1111},"        'cookie':\"thw=xx; cna=wN4DIV...\"\n",{"type":19,"tag":291,"props":1113,"children":1114},{"class":293,"line":798},[1115],{"type":19,"tag":291,"props":1116,"children":1117},{},[1118],{"type":25,"value":1119},"    }\n",{"type":19,"tag":291,"props":1121,"children":1122},{"class":293,"line":807},[1123],{"type":19,"tag":291,"props":1124,"children":1125},{},[1126],{"type":25,"value":1127},"    # 定义时间戳\n",{"type":19,"tag":291,"props":1129,"children":1130},{"class":293,"line":815},[1131],{"type":19,"tag":291,"props":1132,"children":1133},{},[1134],{"type":25,"value":1135},"    self.time = time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime(time.time()))\n",{"type":19,"tag":291,"props":1137,"children":1138},{"class":293,"line":824},[1139],{"type":19,"tag":291,"props":1140,"children":1141},{"emptyLinePlaceholder":707},[1142],{"type":25,"value":710},{"type":19,"tag":291,"props":1144,"children":1145},{"class":293,"line":833},[1146],{"type":19,"tag":291,"props":1147,"children":1148},{},[1149],{"type":25,"value":1150},"    # 创建excel\n",{"type":19,"tag":291,"props":1152,"children":1153},{"class":293,"line":841},[1154],{"type":19,"tag":291,"props":1155,"children":1156},{},[1157],{"type":25,"value":1158},"    self.wb = workbook.Workbook()\n",{"type":19,"tag":291,"props":1160,"children":1161},{"class":293,"line":850},[1162],{"type":19,"tag":291,"props":1163,"children":1164},{},[1165],{"type":25,"value":1166},"    # 获取当前正在操作的表对象  激活\n",{"type":19,"tag":291,"props":1168,"children":1169},{"class":293,"line":859},[1170],{"type":19,"tag":291,"props":1171,"children":1172},{},[1173],{"type":25,"value":1174},"    self.ws = self.wb.active\n",{"type":19,"tag":291,"props":1176,"children":1177},{"class":293,"line":867},[1178],{"type":19,"tag":291,"props":1179,"children":1180},{},[1181],{"type":25,"value":1182},"    # 设置表头\n",{"type":19,"tag":291,"props":1184,"children":1185},{"class":293,"line":875},[1186],{"type":19,"tag":291,"props":1187,"children":1188},{},[1189],{"type":25,"value":1190},"    self.ws.append(['商品id','商品标题','商品价格',\"店铺名称\",'发货地址','销售量','图片链接','商品链接'])\n",{"type":19,"tag":291,"props":1192,"children":1193},{"class":293,"line":884},[1194],{"type":19,"tag":291,"props":1195,"children":1196},{"emptyLinePlaceholder":707},[1197],{"type":25,"value":710},{"type":19,"tag":291,"props":1199,"children":1200},{"class":293,"line":892},[1201],{"type":19,"tag":291,"props":1202,"children":1203},{},[1204],{"type":25,"value":1205},"    # 获取用户搜索内容\n",{"type":19,"tag":291,"props":1207,"children":1208},{"class":293,"line":901},[1209],{"type":19,"tag":291,"props":1210,"children":1211},{},[1212],{"type":25,"value":1213},"    self.params = input(f\"\\033[1;37m[{self.time}] Input 请输入你要获取的商品：\\033[0m\")\n",{"type":19,"tag":1215,"props":1216,"children":1217},"blockquote",{},[1218,1223],{"type":19,"tag":27,"props":1219,"children":1220},{},[1221],{"type":25,"value":1222},"注意",{"type":19,"tag":27,"props":1224,"children":1225},{},[1226],{"type":25,"value":1227},"在设计代码时请自行导入所需的模块",{"type":19,"tag":75,"props":1229,"children":1231},{"id":1230},"加密参数生成方法体设计",[1232],{"type":25,"value":1230},{"type":19,"tag":81,"props":1234,"children":1235},{},[],{"type":19,"tag":27,"props":1237,"children":1238},{},[1239,1241,1246,1248,1253,1255,1260,1261,1266,1267,1272,1274,1279,1281,1286,1288,1293,1295,1300,1302,1308,1310,1315],{"type":25,"value":1240},"在该方法体中，我们需要模拟js代码中的 ",{"type":19,"tag":117,"props":1242,"children":1244},{"className":1243},[],[1245],{"type":25,"value":397},{"type":25,"value":1247}," 函数体进行设计，首先设置字符串拼接所需的变量，依次有 ",{"type":19,"tag":117,"props":1249,"children":1251},{"className":1250},[],[1252],{"type":25,"value":496},{"type":25,"value":1254},"、",{"type":19,"tag":117,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":25,"value":519},{"type":25,"value":1254},{"type":19,"tag":117,"props":1262,"children":1264},{"className":1263},[],[1265],{"type":25,"value":534},{"type":25,"value":1254},{"type":19,"tag":117,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":25,"value":542},{"type":25,"value":1273},"等，其中 ",{"type":19,"tag":117,"props":1275,"children":1277},{"className":1276},[],[1278],{"type":25,"value":519},{"type":25,"value":1280}," 和 ",{"type":19,"tag":117,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":25,"value":542},{"type":25,"value":1287}," 可以直接传入，因为在即将设计的请求方法体中存在；而 ",{"type":19,"tag":117,"props":1289,"children":1291},{"className":1290},[],[1292],{"type":25,"value":534},{"type":25,"value":1294}," 可以采用硬编码方式；最后 ",{"type":19,"tag":117,"props":1296,"children":1298},{"className":1297},[],[1299],{"type":25,"value":496},{"type":25,"value":1301}," 可以在请求头中进行提取，至此，加密函数的实参构建完成。接下来使用 ",{"type":19,"tag":117,"props":1303,"children":1305},{"className":1304},[],[1306],{"type":25,"value":1307},"execjs",{"type":25,"value":1309}," 模块的使用方法调用js文件的函数体，获取 ",{"type":19,"tag":117,"props":1311,"children":1313},{"className":1312},[],[1314],{"type":25,"value":183},{"type":25,"value":1316}," 的结果并返回。",{"type":19,"tag":281,"props":1318,"children":1320},{"code":1319,"language":688,"meta":7,"className":689,"style":7},"# 获取加密参数\ndef get_sign(self,t: str,data: str)->str:\n    \"\"\"\n    生成加密参数sign\n    sign的组成：eE(em.token + \"&\" + eT + \"&\" + eC + \"&\" + ep.data)\n    :param t: 时间戳\n    :param data: 请求参数中的data\n    :return: 加密后的sign值\n    \"\"\"\n    # 从cookie中取出token\n    token = re.findall(\"_m_h5_tk=(.*?)_\",self.headers['cookie'])[0]\n    eC = \"12574478\"\n    sign_str = token + \"&\" + t + \"&\" + eC + \"&\" + data\n\n    \"\"\"方法一：不知道加密方式时直接使用原始加密方式\"\"\"\n    with open(\"get_sign.js\",'r') as f:\n        ctx = execjs.compile(f.read())\n    sign = ctx.call(\"eE\",sign_str)\n    return sign\n",[1321],{"type":19,"tag":117,"props":1322,"children":1323},{"__ignoreMap":7},[1324,1332,1340,1347,1355,1363,1371,1379,1387,1394,1402,1410,1418,1426,1433,1441,1449,1457,1465],{"type":19,"tag":291,"props":1325,"children":1326},{"class":293,"line":294},[1327],{"type":19,"tag":291,"props":1328,"children":1329},{},[1330],{"type":25,"value":1331},"# 获取加密参数\n",{"type":19,"tag":291,"props":1333,"children":1334},{"class":293,"line":310},[1335],{"type":19,"tag":291,"props":1336,"children":1337},{},[1338],{"type":25,"value":1339},"def get_sign(self,t: str,data: str)->str:\n",{"type":19,"tag":291,"props":1341,"children":1342},{"class":293,"line":345},[1343],{"type":19,"tag":291,"props":1344,"children":1345},{},[1346],{"type":25,"value":1032},{"type":19,"tag":291,"props":1348,"children":1349},{"class":293,"line":359},[1350],{"type":19,"tag":291,"props":1351,"children":1352},{},[1353],{"type":25,"value":1354},"    生成加密参数sign\n",{"type":19,"tag":291,"props":1356,"children":1357},{"class":293,"line":372},[1358],{"type":19,"tag":291,"props":1359,"children":1360},{},[1361],{"type":25,"value":1362},"    sign的组成：eE(em.token + \"&\" + eT + \"&\" + eC + \"&\" + ep.data)\n",{"type":19,"tag":291,"props":1364,"children":1365},{"class":293,"line":737},[1366],{"type":19,"tag":291,"props":1367,"children":1368},{},[1369],{"type":25,"value":1370},"    :param t: 时间戳\n",{"type":19,"tag":291,"props":1372,"children":1373},{"class":293,"line":745},[1374],{"type":19,"tag":291,"props":1375,"children":1376},{},[1377],{"type":25,"value":1378},"    :param data: 请求参数中的data\n",{"type":19,"tag":291,"props":1380,"children":1381},{"class":293,"line":754},[1382],{"type":19,"tag":291,"props":1383,"children":1384},{},[1385],{"type":25,"value":1386},"    :return: 加密后的sign值\n",{"type":19,"tag":291,"props":1388,"children":1389},{"class":293,"line":763},[1390],{"type":19,"tag":291,"props":1391,"children":1392},{},[1393],{"type":25,"value":1032},{"type":19,"tag":291,"props":1395,"children":1396},{"class":293,"line":771},[1397],{"type":19,"tag":291,"props":1398,"children":1399},{},[1400],{"type":25,"value":1401},"    # 从cookie中取出token\n",{"type":19,"tag":291,"props":1403,"children":1404},{"class":293,"line":780},[1405],{"type":19,"tag":291,"props":1406,"children":1407},{},[1408],{"type":25,"value":1409},"    token = re.findall(\"_m_h5_tk=(.*?)_\",self.headers['cookie'])[0]\n",{"type":19,"tag":291,"props":1411,"children":1412},{"class":293,"line":789},[1413],{"type":19,"tag":291,"props":1414,"children":1415},{},[1416],{"type":25,"value":1417},"    eC = \"12574478\"\n",{"type":19,"tag":291,"props":1419,"children":1420},{"class":293,"line":798},[1421],{"type":19,"tag":291,"props":1422,"children":1423},{},[1424],{"type":25,"value":1425},"    sign_str = token + \"&\" + t + \"&\" + eC + \"&\" + data\n",{"type":19,"tag":291,"props":1427,"children":1428},{"class":293,"line":807},[1429],{"type":19,"tag":291,"props":1430,"children":1431},{"emptyLinePlaceholder":707},[1432],{"type":25,"value":710},{"type":19,"tag":291,"props":1434,"children":1435},{"class":293,"line":815},[1436],{"type":19,"tag":291,"props":1437,"children":1438},{},[1439],{"type":25,"value":1440},"    \"\"\"方法一：不知道加密方式时直接使用原始加密方式\"\"\"\n",{"type":19,"tag":291,"props":1442,"children":1443},{"class":293,"line":824},[1444],{"type":19,"tag":291,"props":1445,"children":1446},{},[1447],{"type":25,"value":1448},"    with open(\"get_sign.js\",'r') as f:\n",{"type":19,"tag":291,"props":1450,"children":1451},{"class":293,"line":833},[1452],{"type":19,"tag":291,"props":1453,"children":1454},{},[1455],{"type":25,"value":1456},"        ctx = execjs.compile(f.read())\n",{"type":19,"tag":291,"props":1458,"children":1459},{"class":293,"line":841},[1460],{"type":19,"tag":291,"props":1461,"children":1462},{},[1463],{"type":25,"value":1464},"    sign = ctx.call(\"eE\",sign_str)\n",{"type":19,"tag":291,"props":1466,"children":1467},{"class":293,"line":850},[1468],{"type":19,"tag":291,"props":1469,"children":1470},{},[1471],{"type":25,"value":1472},"    return sign\n",{"type":19,"tag":75,"props":1474,"children":1476},{"id":1475},"请求方法体设计",[1477],{"type":25,"value":1475},{"type":19,"tag":81,"props":1479,"children":1480},{},[],{"type":19,"tag":27,"props":1482,"children":1483},{},[1484,1486,1491],{"type":25,"value":1485},"在请求方法体中对时间戳进行刷新，设置发送请求所需的params参数，将该参数的 ",{"type":19,"tag":117,"props":1487,"children":1489},{"className":1488},[],[1490],{"type":25,"value":130},{"type":25,"value":1492}," 元素单独提取出来，方便后续方法的使用，设置完成后就可以发起请求了，为发送请求进行异常处理。",{"type":19,"tag":281,"props":1494,"children":1496},{"code":1495,"language":688,"meta":7,"className":689,"style":7},"# 发送请求\ndef get_url(self):\n    \"\"\"\n    发送请求，获取搜索数据\n    :return: response响应体\n    \"\"\"\n    # 生成时间戳\n    self.time = time.strftime(\"%Y-%m-%d %H:%M:%S\", time.localtime(time.time()))\n    t = str(int(time.time()*1000))\n    # 设置参数data\n    data = '\"appId\": \"34385\",\"params\": {\"ap...'+self.params+'...\"sort\": \"_coefp\"'\n    # 请求参数（requests的get请求参数params）\n    params = {\n        \"jsv\": \"2.7.4\",\n        \"appKey\": \"12574478\",\n        \"t\": t,\n        # 获取加密参数\n        \"sign\": self.get_sign(t, data),\n        \"api\": \"mtop.rel...ommend\",\n        \"v\": \"2.0\",\n        \"type\": \"originaljson\",\n        \"timeout\": \"10000\",\n        \"dataType\": \"json\",\n        \"data\": data\n    }\n    try:\n        response = requests.get(\n            self.basic_url,\n            headers=self.headers,\n            params=params,\n            timeout=10\n        )\n        return response\n    except Exception as e:\n        print(f\"请求失败: {e}\")\n        return 0\n",[1497],{"type":19,"tag":117,"props":1498,"children":1499},{"__ignoreMap":7},[1500,1508,1516,1523,1531,1539,1546,1554,1561,1569,1577,1585,1593,1601,1609,1617,1625,1633,1641,1649,1657,1665,1673,1681,1689,1696,1704,1712,1720,1728,1736,1744,1752,1760,1768,1777],{"type":19,"tag":291,"props":1501,"children":1502},{"class":293,"line":294},[1503],{"type":19,"tag":291,"props":1504,"children":1505},{},[1506],{"type":25,"value":1507},"# 发送请求\n",{"type":19,"tag":291,"props":1509,"children":1510},{"class":293,"line":310},[1511],{"type":19,"tag":291,"props":1512,"children":1513},{},[1514],{"type":25,"value":1515},"def get_url(self):\n",{"type":19,"tag":291,"props":1517,"children":1518},{"class":293,"line":345},[1519],{"type":19,"tag":291,"props":1520,"children":1521},{},[1522],{"type":25,"value":1032},{"type":19,"tag":291,"props":1524,"children":1525},{"class":293,"line":359},[1526],{"type":19,"tag":291,"props":1527,"children":1528},{},[1529],{"type":25,"value":1530},"    发送请求，获取搜索数据\n",{"type":19,"tag":291,"props":1532,"children":1533},{"class":293,"line":372},[1534],{"type":19,"tag":291,"props":1535,"children":1536},{},[1537],{"type":25,"value":1538},"    :return: response响应体\n",{"type":19,"tag":291,"props":1540,"children":1541},{"class":293,"line":737},[1542],{"type":19,"tag":291,"props":1543,"children":1544},{},[1545],{"type":25,"value":1032},{"type":19,"tag":291,"props":1547,"children":1548},{"class":293,"line":745},[1549],{"type":19,"tag":291,"props":1550,"children":1551},{},[1552],{"type":25,"value":1553},"    # 生成时间戳\n",{"type":19,"tag":291,"props":1555,"children":1556},{"class":293,"line":754},[1557],{"type":19,"tag":291,"props":1558,"children":1559},{},[1560],{"type":25,"value":1135},{"type":19,"tag":291,"props":1562,"children":1563},{"class":293,"line":763},[1564],{"type":19,"tag":291,"props":1565,"children":1566},{},[1567],{"type":25,"value":1568},"    t = str(int(time.time()*1000))\n",{"type":19,"tag":291,"props":1570,"children":1571},{"class":293,"line":771},[1572],{"type":19,"tag":291,"props":1573,"children":1574},{},[1575],{"type":25,"value":1576},"    # 设置参数data\n",{"type":19,"tag":291,"props":1578,"children":1579},{"class":293,"line":780},[1580],{"type":19,"tag":291,"props":1581,"children":1582},{},[1583],{"type":25,"value":1584},"    data = '\"appId\": \"34385\",\"params\": {\"ap...'+self.params+'...\"sort\": \"_coefp\"'\n",{"type":19,"tag":291,"props":1586,"children":1587},{"class":293,"line":789},[1588],{"type":19,"tag":291,"props":1589,"children":1590},{},[1591],{"type":25,"value":1592},"    # 请求参数（requests的get请求参数params）\n",{"type":19,"tag":291,"props":1594,"children":1595},{"class":293,"line":798},[1596],{"type":19,"tag":291,"props":1597,"children":1598},{},[1599],{"type":25,"value":1600},"    params = {\n",{"type":19,"tag":291,"props":1602,"children":1603},{"class":293,"line":807},[1604],{"type":19,"tag":291,"props":1605,"children":1606},{},[1607],{"type":25,"value":1608},"        \"jsv\": \"2.7.4\",\n",{"type":19,"tag":291,"props":1610,"children":1611},{"class":293,"line":815},[1612],{"type":19,"tag":291,"props":1613,"children":1614},{},[1615],{"type":25,"value":1616},"        \"appKey\": \"12574478\",\n",{"type":19,"tag":291,"props":1618,"children":1619},{"class":293,"line":824},[1620],{"type":19,"tag":291,"props":1621,"children":1622},{},[1623],{"type":25,"value":1624},"        \"t\": t,\n",{"type":19,"tag":291,"props":1626,"children":1627},{"class":293,"line":833},[1628],{"type":19,"tag":291,"props":1629,"children":1630},{},[1631],{"type":25,"value":1632},"        # 获取加密参数\n",{"type":19,"tag":291,"props":1634,"children":1635},{"class":293,"line":841},[1636],{"type":19,"tag":291,"props":1637,"children":1638},{},[1639],{"type":25,"value":1640},"        \"sign\": self.get_sign(t, data),\n",{"type":19,"tag":291,"props":1642,"children":1643},{"class":293,"line":850},[1644],{"type":19,"tag":291,"props":1645,"children":1646},{},[1647],{"type":25,"value":1648},"        \"api\": \"mtop.rel...ommend\",\n",{"type":19,"tag":291,"props":1650,"children":1651},{"class":293,"line":859},[1652],{"type":19,"tag":291,"props":1653,"children":1654},{},[1655],{"type":25,"value":1656},"        \"v\": \"2.0\",\n",{"type":19,"tag":291,"props":1658,"children":1659},{"class":293,"line":867},[1660],{"type":19,"tag":291,"props":1661,"children":1662},{},[1663],{"type":25,"value":1664},"        \"type\": \"originaljson\",\n",{"type":19,"tag":291,"props":1666,"children":1667},{"class":293,"line":875},[1668],{"type":19,"tag":291,"props":1669,"children":1670},{},[1671],{"type":25,"value":1672},"        \"timeout\": \"10000\",\n",{"type":19,"tag":291,"props":1674,"children":1675},{"class":293,"line":884},[1676],{"type":19,"tag":291,"props":1677,"children":1678},{},[1679],{"type":25,"value":1680},"        \"dataType\": \"json\",\n",{"type":19,"tag":291,"props":1682,"children":1683},{"class":293,"line":892},[1684],{"type":19,"tag":291,"props":1685,"children":1686},{},[1687],{"type":25,"value":1688},"        \"data\": data\n",{"type":19,"tag":291,"props":1690,"children":1691},{"class":293,"line":901},[1692],{"type":19,"tag":291,"props":1693,"children":1694},{},[1695],{"type":25,"value":1119},{"type":19,"tag":291,"props":1697,"children":1698},{"class":293,"line":910},[1699],{"type":19,"tag":291,"props":1700,"children":1701},{},[1702],{"type":25,"value":1703},"    try:\n",{"type":19,"tag":291,"props":1705,"children":1706},{"class":293,"line":919},[1707],{"type":19,"tag":291,"props":1708,"children":1709},{},[1710],{"type":25,"value":1711},"        response = requests.get(\n",{"type":19,"tag":291,"props":1713,"children":1714},{"class":293,"line":928},[1715],{"type":19,"tag":291,"props":1716,"children":1717},{},[1718],{"type":25,"value":1719},"            self.basic_url,\n",{"type":19,"tag":291,"props":1721,"children":1722},{"class":293,"line":936},[1723],{"type":19,"tag":291,"props":1724,"children":1725},{},[1726],{"type":25,"value":1727},"            headers=self.headers,\n",{"type":19,"tag":291,"props":1729,"children":1730},{"class":293,"line":944},[1731],{"type":19,"tag":291,"props":1732,"children":1733},{},[1734],{"type":25,"value":1735},"            params=params,\n",{"type":19,"tag":291,"props":1737,"children":1738},{"class":293,"line":953},[1739],{"type":19,"tag":291,"props":1740,"children":1741},{},[1742],{"type":25,"value":1743},"            timeout=10\n",{"type":19,"tag":291,"props":1745,"children":1746},{"class":293,"line":961},[1747],{"type":19,"tag":291,"props":1748,"children":1749},{},[1750],{"type":25,"value":1751},"        )\n",{"type":19,"tag":291,"props":1753,"children":1754},{"class":293,"line":970},[1755],{"type":19,"tag":291,"props":1756,"children":1757},{},[1758],{"type":25,"value":1759},"        return response\n",{"type":19,"tag":291,"props":1761,"children":1762},{"class":293,"line":978},[1763],{"type":19,"tag":291,"props":1764,"children":1765},{},[1766],{"type":25,"value":1767},"    except Exception as e:\n",{"type":19,"tag":291,"props":1769,"children":1771},{"class":293,"line":1770},35,[1772],{"type":19,"tag":291,"props":1773,"children":1774},{},[1775],{"type":25,"value":1776},"        print(f\"请求失败: {e}\")\n",{"type":19,"tag":291,"props":1778,"children":1780},{"class":293,"line":1779},36,[1781],{"type":19,"tag":291,"props":1782,"children":1783},{},[1784],{"type":25,"value":1785},"        return 0\n",{"type":19,"tag":75,"props":1787,"children":1789},{"id":1788},"提取数据方法体设计",[1790],{"type":25,"value":1788},{"type":19,"tag":81,"props":1792,"children":1793},{},[],{"type":19,"tag":27,"props":1795,"children":1796},{},[1797,1799,1805,1807,1813,1815,1821,1823,1828],{"type":25,"value":1798},"通过网页对数据包的预览结果分析，依次提取出商品所需的数据，为了让数据方便查看，我新增一个用于输出的 ",{"type":19,"tag":117,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":25,"value":1804},"print_format",{"type":25,"value":1806}," 方法，在数据提取的同时依次添加数据到excel表，最后执行 ",{"type":19,"tag":117,"props":1808,"children":1810},{"className":1809},[],[1811],{"type":25,"value":1812},"self.wb.save(\"淘宝数据.xlsx\")",{"type":25,"value":1814}," 命令进行本地磁盘的数据写入。所以此后框架中的",{"type":19,"tag":117,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":25,"value":1820},"save_data",{"type":25,"value":1822}," 方法作废，新增一个 ",{"type":19,"tag":117,"props":1824,"children":1826},{"className":1825},[],[1827],{"type":25,"value":1804},{"type":25,"value":1829}," 方法。",{"type":19,"tag":281,"props":1831,"children":1833},{"code":1832,"language":688,"meta":7,"className":689,"style":7},"# 提取数据\ndef format_and_save_data(self,response):\n    \"\"\"\n    对传入的响应体数据进行处理\n    提取指定的数据内容\n    :param response: 响应体内容\n    :return: None\n    \"\"\"\n    print(f\"\\033[1;32m[{self.time}] Success 正在提取数据...\\033[0m\")\n    html_str = response.content.decode(\"utf-8\")\n    html_json = json.loads(html_str)\n    productInfo = html_json['data']['itemsArray']\n    for item in productInfo:\n        try:\n            pic_path = item['pic_path'] # 图片链接\n            shop_name = item['shopInfo']['title'] # 店铺名称\n            item_id = item['item_id'] # 商品id\n            local = item['procity'] # 发货地址\n            count = item['realSales'] # 已购人数\n            title = item['title'] # 商品标题\n            title = re.sub(r'\u003C(.*?)>',' ', title)\n            price = item['price'] # 商品价格\n            item_url = item['auctionURL'] # 商品链接\n            if item_url[:2] == '\u002F\u002F': item_url = 'https:' + item_url\n            self.print_format([item_id,title,price,shop_name,local,count,pic_path,item_url])\n            # 添加数据到excel表，数据列表与表头一一对应 此代码并非实际写入磁盘\n            self.ws.append([item_id,title,price,shop_name,local,count,pic_path,item_url])\n        except Exception as e:\n            pass\n    self.wb.save(\"淘宝数据.xlsx\")\n    print(\"数据采集成功，已存入文件 -> 淘宝数据.xlsx\")\n",[1834],{"type":19,"tag":117,"props":1835,"children":1836},{"__ignoreMap":7},[1837,1845,1853,1860,1868,1876,1884,1892,1899,1907,1915,1923,1931,1939,1947,1955,1963,1971,1979,1987,1995,2003,2011,2019,2027,2035,2043,2051,2059,2067,2075],{"type":19,"tag":291,"props":1838,"children":1839},{"class":293,"line":294},[1840],{"type":19,"tag":291,"props":1841,"children":1842},{},[1843],{"type":25,"value":1844},"# 提取数据\n",{"type":19,"tag":291,"props":1846,"children":1847},{"class":293,"line":310},[1848],{"type":19,"tag":291,"props":1849,"children":1850},{},[1851],{"type":25,"value":1852},"def format_and_save_data(self,response):\n",{"type":19,"tag":291,"props":1854,"children":1855},{"class":293,"line":345},[1856],{"type":19,"tag":291,"props":1857,"children":1858},{},[1859],{"type":25,"value":1032},{"type":19,"tag":291,"props":1861,"children":1862},{"class":293,"line":359},[1863],{"type":19,"tag":291,"props":1864,"children":1865},{},[1866],{"type":25,"value":1867},"    对传入的响应体数据进行处理\n",{"type":19,"tag":291,"props":1869,"children":1870},{"class":293,"line":372},[1871],{"type":19,"tag":291,"props":1872,"children":1873},{},[1874],{"type":25,"value":1875},"    提取指定的数据内容\n",{"type":19,"tag":291,"props":1877,"children":1878},{"class":293,"line":737},[1879],{"type":19,"tag":291,"props":1880,"children":1881},{},[1882],{"type":25,"value":1883},"    :param response: 响应体内容\n",{"type":19,"tag":291,"props":1885,"children":1886},{"class":293,"line":745},[1887],{"type":19,"tag":291,"props":1888,"children":1889},{},[1890],{"type":25,"value":1891},"    :return: None\n",{"type":19,"tag":291,"props":1893,"children":1894},{"class":293,"line":754},[1895],{"type":19,"tag":291,"props":1896,"children":1897},{},[1898],{"type":25,"value":1032},{"type":19,"tag":291,"props":1900,"children":1901},{"class":293,"line":763},[1902],{"type":19,"tag":291,"props":1903,"children":1904},{},[1905],{"type":25,"value":1906},"    print(f\"\\033[1;32m[{self.time}] Success 正在提取数据...\\033[0m\")\n",{"type":19,"tag":291,"props":1908,"children":1909},{"class":293,"line":771},[1910],{"type":19,"tag":291,"props":1911,"children":1912},{},[1913],{"type":25,"value":1914},"    html_str = response.content.decode(\"utf-8\")\n",{"type":19,"tag":291,"props":1916,"children":1917},{"class":293,"line":780},[1918],{"type":19,"tag":291,"props":1919,"children":1920},{},[1921],{"type":25,"value":1922},"    html_json = json.loads(html_str)\n",{"type":19,"tag":291,"props":1924,"children":1925},{"class":293,"line":789},[1926],{"type":19,"tag":291,"props":1927,"children":1928},{},[1929],{"type":25,"value":1930},"    productInfo = html_json['data']['itemsArray']\n",{"type":19,"tag":291,"props":1932,"children":1933},{"class":293,"line":798},[1934],{"type":19,"tag":291,"props":1935,"children":1936},{},[1937],{"type":25,"value":1938},"    for item in productInfo:\n",{"type":19,"tag":291,"props":1940,"children":1941},{"class":293,"line":807},[1942],{"type":19,"tag":291,"props":1943,"children":1944},{},[1945],{"type":25,"value":1946},"        try:\n",{"type":19,"tag":291,"props":1948,"children":1949},{"class":293,"line":815},[1950],{"type":19,"tag":291,"props":1951,"children":1952},{},[1953],{"type":25,"value":1954},"            pic_path = item['pic_path'] # 图片链接\n",{"type":19,"tag":291,"props":1956,"children":1957},{"class":293,"line":824},[1958],{"type":19,"tag":291,"props":1959,"children":1960},{},[1961],{"type":25,"value":1962},"            shop_name = item['shopInfo']['title'] # 店铺名称\n",{"type":19,"tag":291,"props":1964,"children":1965},{"class":293,"line":833},[1966],{"type":19,"tag":291,"props":1967,"children":1968},{},[1969],{"type":25,"value":1970},"            item_id = item['item_id'] # 商品id\n",{"type":19,"tag":291,"props":1972,"children":1973},{"class":293,"line":841},[1974],{"type":19,"tag":291,"props":1975,"children":1976},{},[1977],{"type":25,"value":1978},"            local = item['procity'] # 发货地址\n",{"type":19,"tag":291,"props":1980,"children":1981},{"class":293,"line":850},[1982],{"type":19,"tag":291,"props":1983,"children":1984},{},[1985],{"type":25,"value":1986},"            count = item['realSales'] # 已购人数\n",{"type":19,"tag":291,"props":1988,"children":1989},{"class":293,"line":859},[1990],{"type":19,"tag":291,"props":1991,"children":1992},{},[1993],{"type":25,"value":1994},"            title = item['title'] # 商品标题\n",{"type":19,"tag":291,"props":1996,"children":1997},{"class":293,"line":867},[1998],{"type":19,"tag":291,"props":1999,"children":2000},{},[2001],{"type":25,"value":2002},"            title = re.sub(r'\u003C(.*?)>',' ', title)\n",{"type":19,"tag":291,"props":2004,"children":2005},{"class":293,"line":875},[2006],{"type":19,"tag":291,"props":2007,"children":2008},{},[2009],{"type":25,"value":2010},"            price = item['price'] # 商品价格\n",{"type":19,"tag":291,"props":2012,"children":2013},{"class":293,"line":884},[2014],{"type":19,"tag":291,"props":2015,"children":2016},{},[2017],{"type":25,"value":2018},"            item_url = item['auctionURL'] # 商品链接\n",{"type":19,"tag":291,"props":2020,"children":2021},{"class":293,"line":892},[2022],{"type":19,"tag":291,"props":2023,"children":2024},{},[2025],{"type":25,"value":2026},"            if item_url[:2] == '\u002F\u002F': item_url = 'https:' + item_url\n",{"type":19,"tag":291,"props":2028,"children":2029},{"class":293,"line":901},[2030],{"type":19,"tag":291,"props":2031,"children":2032},{},[2033],{"type":25,"value":2034},"            self.print_format([item_id,title,price,shop_name,local,count,pic_path,item_url])\n",{"type":19,"tag":291,"props":2036,"children":2037},{"class":293,"line":910},[2038],{"type":19,"tag":291,"props":2039,"children":2040},{},[2041],{"type":25,"value":2042},"            # 添加数据到excel表，数据列表与表头一一对应 此代码并非实际写入磁盘\n",{"type":19,"tag":291,"props":2044,"children":2045},{"class":293,"line":919},[2046],{"type":19,"tag":291,"props":2047,"children":2048},{},[2049],{"type":25,"value":2050},"            self.ws.append([item_id,title,price,shop_name,local,count,pic_path,item_url])\n",{"type":19,"tag":291,"props":2052,"children":2053},{"class":293,"line":928},[2054],{"type":19,"tag":291,"props":2055,"children":2056},{},[2057],{"type":25,"value":2058},"        except Exception as e:\n",{"type":19,"tag":291,"props":2060,"children":2061},{"class":293,"line":936},[2062],{"type":19,"tag":291,"props":2063,"children":2064},{},[2065],{"type":25,"value":2066},"            pass\n",{"type":19,"tag":291,"props":2068,"children":2069},{"class":293,"line":944},[2070],{"type":19,"tag":291,"props":2071,"children":2072},{},[2073],{"type":25,"value":2074},"    self.wb.save(\"淘宝数据.xlsx\")\n",{"type":19,"tag":291,"props":2076,"children":2077},{"class":293,"line":953},[2078],{"type":19,"tag":291,"props":2079,"children":2080},{},[2081],{"type":25,"value":2082},"    print(\"数据采集成功，已存入文件 -> 淘宝数据.xlsx\")\n",{"type":19,"tag":75,"props":2084,"children":2086},{"id":2085},"格式化输出方法体设计",[2087],{"type":25,"value":2085},{"type":19,"tag":81,"props":2089,"children":2090},{},[],{"type":19,"tag":27,"props":2092,"children":2093},{},[2094],{"type":25,"value":2095},"格式化输出的方法体将接收一个包含8个元素的列表，然后依次对该类表数据进行展示，代码如下：",{"type":19,"tag":281,"props":2097,"children":2099},{"code":2098,"language":688,"meta":7,"className":689,"style":7},"# 格式化输出\ndef print_format(self,lis):\n    \"\"\"\n    格式化输出\n    :param lis: 商品元素列表\n    :return: None\n    \"\"\"\n    print('-'*70)\n    print(f'商 品 id: \\033[1;32m{lis[0]}\\033[0m')\n    print(f'商品标题: \\033[1;37m{lis[1]}\\033[0m')\n    print(f'商品价格: \\033[1;32m{lis[2]}\\033[0m')\n    print(f'店铺名称: \\033[1;33m{lis[3]}\\033[0m')\n    print(f'发货地址: \\033[1;36m{lis[4]}\\033[0m')\n    print(f'销 售 量: \\033[1;35m{lis[5]}\\033[0m')\n    print(f'图片链接: {lis[6]}')\n    print(f'商品链接: {lis[7]}')\n",[2100],{"type":19,"tag":117,"props":2101,"children":2102},{"__ignoreMap":7},[2103,2111,2119,2126,2134,2142,2149,2156,2164,2172,2180,2188,2196,2204,2212,2220],{"type":19,"tag":291,"props":2104,"children":2105},{"class":293,"line":294},[2106],{"type":19,"tag":291,"props":2107,"children":2108},{},[2109],{"type":25,"value":2110},"# 格式化输出\n",{"type":19,"tag":291,"props":2112,"children":2113},{"class":293,"line":310},[2114],{"type":19,"tag":291,"props":2115,"children":2116},{},[2117],{"type":25,"value":2118},"def print_format(self,lis):\n",{"type":19,"tag":291,"props":2120,"children":2121},{"class":293,"line":345},[2122],{"type":19,"tag":291,"props":2123,"children":2124},{},[2125],{"type":25,"value":1032},{"type":19,"tag":291,"props":2127,"children":2128},{"class":293,"line":359},[2129],{"type":19,"tag":291,"props":2130,"children":2131},{},[2132],{"type":25,"value":2133},"    格式化输出\n",{"type":19,"tag":291,"props":2135,"children":2136},{"class":293,"line":372},[2137],{"type":19,"tag":291,"props":2138,"children":2139},{},[2140],{"type":25,"value":2141},"    :param lis: 商品元素列表\n",{"type":19,"tag":291,"props":2143,"children":2144},{"class":293,"line":737},[2145],{"type":19,"tag":291,"props":2146,"children":2147},{},[2148],{"type":25,"value":1891},{"type":19,"tag":291,"props":2150,"children":2151},{"class":293,"line":745},[2152],{"type":19,"tag":291,"props":2153,"children":2154},{},[2155],{"type":25,"value":1032},{"type":19,"tag":291,"props":2157,"children":2158},{"class":293,"line":754},[2159],{"type":19,"tag":291,"props":2160,"children":2161},{},[2162],{"type":25,"value":2163},"    print('-'*70)\n",{"type":19,"tag":291,"props":2165,"children":2166},{"class":293,"line":763},[2167],{"type":19,"tag":291,"props":2168,"children":2169},{},[2170],{"type":25,"value":2171},"    print(f'商 品 id: \\033[1;32m{lis[0]}\\033[0m')\n",{"type":19,"tag":291,"props":2173,"children":2174},{"class":293,"line":771},[2175],{"type":19,"tag":291,"props":2176,"children":2177},{},[2178],{"type":25,"value":2179},"    print(f'商品标题: \\033[1;37m{lis[1]}\\033[0m')\n",{"type":19,"tag":291,"props":2181,"children":2182},{"class":293,"line":780},[2183],{"type":19,"tag":291,"props":2184,"children":2185},{},[2186],{"type":25,"value":2187},"    print(f'商品价格: \\033[1;32m{lis[2]}\\033[0m')\n",{"type":19,"tag":291,"props":2189,"children":2190},{"class":293,"line":789},[2191],{"type":19,"tag":291,"props":2192,"children":2193},{},[2194],{"type":25,"value":2195},"    print(f'店铺名称: \\033[1;33m{lis[3]}\\033[0m')\n",{"type":19,"tag":291,"props":2197,"children":2198},{"class":293,"line":798},[2199],{"type":19,"tag":291,"props":2200,"children":2201},{},[2202],{"type":25,"value":2203},"    print(f'发货地址: \\033[1;36m{lis[4]}\\033[0m')\n",{"type":19,"tag":291,"props":2205,"children":2206},{"class":293,"line":807},[2207],{"type":19,"tag":291,"props":2208,"children":2209},{},[2210],{"type":25,"value":2211},"    print(f'销 售 量: \\033[1;35m{lis[5]}\\033[0m')\n",{"type":19,"tag":291,"props":2213,"children":2214},{"class":293,"line":815},[2215],{"type":19,"tag":291,"props":2216,"children":2217},{},[2218],{"type":25,"value":2219},"    print(f'图片链接: {lis[6]}')\n",{"type":19,"tag":291,"props":2221,"children":2222},{"class":293,"line":824},[2223],{"type":19,"tag":291,"props":2224,"children":2225},{},[2226],{"type":25,"value":2227},"    print(f'商品链接: {lis[7]}')\n",{"type":19,"tag":75,"props":2229,"children":2231},{"id":2230},"实例化对象",[2232],{"type":25,"value":2230},{"type":19,"tag":81,"props":2234,"children":2235},{},[],{"type":19,"tag":27,"props":2237,"children":2238},{},[2239],{"type":25,"value":2240},"实例化对象不用多说，就是构建一个对象，然后对该对象的方法进行调用。",{"type":19,"tag":281,"props":2242,"children":2244},{"code":2243,"language":688,"meta":7,"className":689,"style":7},"if __name__ == '__main__':\n    tb = TaobaoSearch()\n    tb.format_and_save_data(tb.push_requests())\n",[2245],{"type":19,"tag":117,"props":2246,"children":2247},{"__ignoreMap":7},[2248,2256,2264],{"type":19,"tag":291,"props":2249,"children":2250},{"class":293,"line":294},[2251],{"type":19,"tag":291,"props":2252,"children":2253},{},[2254],{"type":25,"value":2255},"if __name__ == '__main__':\n",{"type":19,"tag":291,"props":2257,"children":2258},{"class":293,"line":310},[2259],{"type":19,"tag":291,"props":2260,"children":2261},{},[2262],{"type":25,"value":2263},"    tb = TaobaoSearch()\n",{"type":19,"tag":291,"props":2265,"children":2266},{"class":293,"line":345},[2267],{"type":19,"tag":291,"props":2268,"children":2269},{},[2270],{"type":25,"value":2271},"    tb.format_and_save_data(tb.push_requests())\n",{"type":19,"tag":20,"props":2273,"children":2275},{"id":2274},"报错调试及处理",[2276],{"type":25,"value":2274},{"type":19,"tag":27,"props":2278,"children":2279},{},[2280],{"type":25,"value":2281},"上述代码是我的首版代码，满怀激动的点击执行按钮，结果...",{"type":19,"tag":281,"props":2283,"children":2285},{"code":2284},"[2025-11-09 12:24:33] Input 请输入你要获取的商品：键盘\n[2025-11-09 12:24:40] Success 正在提取数据...\nTraceback (most recent call last):\n  File \"D:\\CodeFile\\Program_Code\\CrawlDemo\\淘宝搜索\\TaobaoSearch.py\", line 167, in \u003Cmodule>\n    tb.format_and_save_data(tb.push_requests())\n    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n  File \"D:\\CodeFile\\Program_Code\\CrawlDemo\\淘宝搜索\\TaobaoSearch.py\", line 127, in format_and_save_data\n    productInfo = html_json['data']['itemsArray']\n                  ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\nKeyError: 'itemsArray'\n",[2286],{"type":19,"tag":117,"props":2287,"children":2288},{"__ignoreMap":7},[2289],{"type":25,"value":2284},{"type":19,"tag":27,"props":2291,"children":2292},{},[2293],{"type":25,"value":2294},"将代码的响应体进行打印发现，我获取到的数据长这样...",{"type":19,"tag":281,"props":2296,"children":2298},{"code":2297},"{\"api\":\"mtop.relationrecommend.wirelessrecommend.recommend\",\"data\":{},\"ret\":[\"FAIL_SYS_TOKEN_EXOIRED::令牌过期\"],\"traceId\":\"2147bf7b17626624457367112e11b6\",\"v\":\"2.0\"}\n",[2299],{"type":19,"tag":117,"props":2300,"children":2301},{"__ignoreMap":7},[2302],{"type":25,"value":2297},{"type":19,"tag":27,"props":2304,"children":2305},{},[2306,2308,2314,2316,2321],{"type":25,"value":2307},"我都没有获取到数据就对数据进行提取，不报错才怪。人在无语是确实会笑。但是为什么会获取不到数据呢？报错内容中显示 ",{"type":19,"tag":117,"props":2309,"children":2311},{"className":2310},[],[2312],{"type":25,"value":2313},"令牌过期",{"type":25,"value":2315},"，难道是我的 ",{"type":19,"tag":117,"props":2317,"children":2319},{"className":2318},[],[2320],{"type":25,"value":504},{"type":25,"value":2322}," 出了问题，对cookie进行更新后，满怀期待的重新点击执行...",{"type":19,"tag":281,"props":2324,"children":2326},{"code":2325},"[2025-11-09 12:37:20] Input 请输入你要获取的商品：机械键盘\n[2025-11-09 12:37:26] Success 正在提取数据...\nTraceback (most recent call last):\n  File \"D:\\CodeFile\\Program_Code\\CrawlDemo\\淘宝搜索\\TaobaoSearch.py\", line 152, in \u003Cmodule>\n    tb.format_and_save_data(tb.push_requests())\n    ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\n  File \"D:\\CodeFile\\Program_Code\\CrawlDemo\\淘宝搜索\\TaobaoSearch.py\", line 112, in format_and_save_data\n    productInfo = html_json['data']['itemsArray']\n                  ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^\nKeyError: 'itemsArray'\n",[2327],{"type":19,"tag":117,"props":2328,"children":2329},{"__ignoreMap":7},[2330],{"type":25,"value":2325},{"type":19,"tag":27,"props":2332,"children":2333},{},[2334],{"type":25,"value":2335},"再次将响应体进行打印发现，我的新数据包是这样的...",{"type":19,"tag":281,"props":2337,"children":2339},{"code":2338},"{\"api\":\"mtop.relationrecommend.wirelessrecommend.recommend\",\"data\":{},\"ret\":[\"FAIL_BIZ_PARAM_ERR::valid appId([0]) Failed.\"],\"traceId\":\"2147875917626630447182816e1167\",\"v\":\"2.0\"}\n",[2340],{"type":19,"tag":117,"props":2341,"children":2342},{"__ignoreMap":7},[2343],{"type":25,"value":2338},{"type":19,"tag":27,"props":2345,"children":2346},{},[2347],{"type":25,"value":2348},"我将结果和情景丢给AI，让它帮我分析。",{"type":19,"tag":27,"props":2350,"children":2351},{},[2352],{"type":19,"tag":93,"props":2353,"children":2356},{"alt":2354,"src":2355},"Pasted image 20251110130513","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FPasted%20image%2020251110130513.png",[],{"type":19,"tag":27,"props":2358,"children":2359},{},[2360],{"type":25,"value":2361},"以下是AI给出的问题分析：",{"type":19,"tag":281,"props":2363,"children":2367},{"code":2364,"language":2365,"meta":7,"className":2366,"style":7},"问题分析\n从错误信息看，服务端返回的appId是[0]，这说明：\n - appId参数没有正确传递到服务端\n - 参数格式或编码可能有问题\n - 可能需要其他必需的参数\n \n 解决办法\n  - 更新cookie\n  - 原始代码中params字段JSON字符串转换为一个嵌套的对象结构\n  - 尝试重新分析参数\n","deepseek","language-deepseek shiki shiki-themes github-dark",[2368],{"type":19,"tag":117,"props":2369,"children":2370},{"__ignoreMap":7},[2371,2379,2387,2395,2403,2411,2419,2427,2435,2443],{"type":19,"tag":291,"props":2372,"children":2373},{"class":293,"line":294},[2374],{"type":19,"tag":291,"props":2375,"children":2376},{},[2377],{"type":25,"value":2378},"问题分析\n",{"type":19,"tag":291,"props":2380,"children":2381},{"class":293,"line":310},[2382],{"type":19,"tag":291,"props":2383,"children":2384},{},[2385],{"type":25,"value":2386},"从错误信息看，服务端返回的appId是[0]，这说明：\n",{"type":19,"tag":291,"props":2388,"children":2389},{"class":293,"line":345},[2390],{"type":19,"tag":291,"props":2391,"children":2392},{},[2393],{"type":25,"value":2394}," - appId参数没有正确传递到服务端\n",{"type":19,"tag":291,"props":2396,"children":2397},{"class":293,"line":359},[2398],{"type":19,"tag":291,"props":2399,"children":2400},{},[2401],{"type":25,"value":2402}," - 参数格式或编码可能有问题\n",{"type":19,"tag":291,"props":2404,"children":2405},{"class":293,"line":372},[2406],{"type":19,"tag":291,"props":2407,"children":2408},{},[2409],{"type":25,"value":2410}," - 可能需要其他必需的参数\n",{"type":19,"tag":291,"props":2412,"children":2413},{"class":293,"line":737},[2414],{"type":19,"tag":291,"props":2415,"children":2416},{},[2417],{"type":25,"value":2418}," \n",{"type":19,"tag":291,"props":2420,"children":2421},{"class":293,"line":745},[2422],{"type":19,"tag":291,"props":2423,"children":2424},{},[2425],{"type":25,"value":2426}," 解决办法\n",{"type":19,"tag":291,"props":2428,"children":2429},{"class":293,"line":754},[2430],{"type":19,"tag":291,"props":2431,"children":2432},{},[2433],{"type":25,"value":2434},"  - 更新cookie\n",{"type":19,"tag":291,"props":2436,"children":2437},{"class":293,"line":763},[2438],{"type":19,"tag":291,"props":2439,"children":2440},{},[2441],{"type":25,"value":2442},"  - 原始代码中params字段JSON字符串转换为一个嵌套的对象结构\n",{"type":19,"tag":291,"props":2444,"children":2445},{"class":293,"line":771},[2446],{"type":19,"tag":291,"props":2447,"children":2448},{},[2449],{"type":25,"value":2450},"  - 尝试重新分析参数\n",{"type":19,"tag":27,"props":2452,"children":2453},{},[2454,2456,2461,2463,2468],{"type":25,"value":2455},"我对 ",{"type":19,"tag":117,"props":2457,"children":2459},{"className":2458},[],[2460],{"type":25,"value":504},{"type":25,"value":2462}," 进行更新且对参数进行增添后发现，结果任然报错，看来问题就出在了 ",{"type":19,"tag":117,"props":2464,"children":2466},{"className":2465},[],[2467],{"type":25,"value":130},{"type":25,"value":2469}," 格式或编码，AI给了我一个解决方案：",{"type":19,"tag":281,"props":2471,"children":2473},{"code":2472,"language":688,"meta":7,"className":689,"style":7},"# 原始的data参数的构建\ndata = '\"appId\": \"34385\",\"params\": {\"ap...'+self.params+'...\"sort\": \"_coefp\"'\n\n# 更新后的data参数构建\ndata_dict = {\n            \"appId\": \"34385\",\n            \"params\": json.dumps({\n                \"appId\": \"34385\",\n                ...\n                \"q\": self.params,\n                ...\n                \"sort\": \"_coefp\"\n            }, ensure_ascii=False, separators=(',', ':'))\n        }\ndata = json.dumps(data_dict, ensure_ascii=False, separators=(',', ':'))\n",[2474],{"type":19,"tag":117,"props":2475,"children":2476},{"__ignoreMap":7},[2477,2485,2493,2500,2508,2516,2524,2532,2540,2548,2556,2563,2571,2579,2587],{"type":19,"tag":291,"props":2478,"children":2479},{"class":293,"line":294},[2480],{"type":19,"tag":291,"props":2481,"children":2482},{},[2483],{"type":25,"value":2484},"# 原始的data参数的构建\n",{"type":19,"tag":291,"props":2486,"children":2487},{"class":293,"line":310},[2488],{"type":19,"tag":291,"props":2489,"children":2490},{},[2491],{"type":25,"value":2492},"data = '\"appId\": \"34385\",\"params\": {\"ap...'+self.params+'...\"sort\": \"_coefp\"'\n",{"type":19,"tag":291,"props":2494,"children":2495},{"class":293,"line":345},[2496],{"type":19,"tag":291,"props":2497,"children":2498},{"emptyLinePlaceholder":707},[2499],{"type":25,"value":710},{"type":19,"tag":291,"props":2501,"children":2502},{"class":293,"line":359},[2503],{"type":19,"tag":291,"props":2504,"children":2505},{},[2506],{"type":25,"value":2507},"# 更新后的data参数构建\n",{"type":19,"tag":291,"props":2509,"children":2510},{"class":293,"line":372},[2511],{"type":19,"tag":291,"props":2512,"children":2513},{},[2514],{"type":25,"value":2515},"data_dict = {\n",{"type":19,"tag":291,"props":2517,"children":2518},{"class":293,"line":737},[2519],{"type":19,"tag":291,"props":2520,"children":2521},{},[2522],{"type":25,"value":2523},"            \"appId\": \"34385\",\n",{"type":19,"tag":291,"props":2525,"children":2526},{"class":293,"line":745},[2527],{"type":19,"tag":291,"props":2528,"children":2529},{},[2530],{"type":25,"value":2531},"            \"params\": json.dumps({\n",{"type":19,"tag":291,"props":2533,"children":2534},{"class":293,"line":754},[2535],{"type":19,"tag":291,"props":2536,"children":2537},{},[2538],{"type":25,"value":2539},"                \"appId\": \"34385\",\n",{"type":19,"tag":291,"props":2541,"children":2542},{"class":293,"line":763},[2543],{"type":19,"tag":291,"props":2544,"children":2545},{},[2546],{"type":25,"value":2547},"                ...\n",{"type":19,"tag":291,"props":2549,"children":2550},{"class":293,"line":771},[2551],{"type":19,"tag":291,"props":2552,"children":2553},{},[2554],{"type":25,"value":2555},"                \"q\": self.params,\n",{"type":19,"tag":291,"props":2557,"children":2558},{"class":293,"line":780},[2559],{"type":19,"tag":291,"props":2560,"children":2561},{},[2562],{"type":25,"value":2547},{"type":19,"tag":291,"props":2564,"children":2565},{"class":293,"line":789},[2566],{"type":19,"tag":291,"props":2567,"children":2568},{},[2569],{"type":25,"value":2570},"                \"sort\": \"_coefp\"\n",{"type":19,"tag":291,"props":2572,"children":2573},{"class":293,"line":798},[2574],{"type":19,"tag":291,"props":2575,"children":2576},{},[2577],{"type":25,"value":2578},"            }, ensure_ascii=False, separators=(',', ':'))\n",{"type":19,"tag":291,"props":2580,"children":2581},{"class":293,"line":807},[2582],{"type":19,"tag":291,"props":2583,"children":2584},{},[2585],{"type":25,"value":2586},"        }\n",{"type":19,"tag":291,"props":2588,"children":2589},{"class":293,"line":815},[2590],{"type":19,"tag":291,"props":2591,"children":2592},{},[2593],{"type":25,"value":2594},"data = json.dumps(data_dict, ensure_ascii=False, separators=(',', ':'))\n",{"type":19,"tag":27,"props":2596,"children":2597},{},[2598],{"type":25,"value":2599},"对源代码进行修改后，再次执行！",{"type":19,"tag":27,"props":2601,"children":2602},{},[2603],{"type":19,"tag":93,"props":2604,"children":2607},{"alt":2605,"src":2606},"Pasted image 20251110131217","\u002Fimages\u002Fblog\u002Ftaobao-search\u002FPasted%20image%2020251110131217.png",[],{"type":19,"tag":27,"props":2609,"children":2610},{},[2611,2613,2618,2620,2625],{"type":25,"value":2612},"功夫不负有心人，终于得偿所愿的获取到了商品数据！这次的数据采集，让我学习了 ",{"type":19,"tag":117,"props":2614,"children":2616},{"className":2615},[],[2617],{"type":25,"value":183},{"type":25,"value":2619}," 参数的js逆向，学会了使用 ",{"type":19,"tag":117,"props":2621,"children":2623},{"className":2622},[],[2624],{"type":25,"value":1307},{"type":25,"value":2626}," 模块知识来保存采集到的数据，心中成就感满满！",{"type":19,"tag":2628,"props":2629,"children":2630},"style",{},[2631],{"type":25,"value":2632},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":310,"depth":310,"links":2634},[2635,2636,2637,2638],{"id":22,"depth":310,"text":22},{"id":71,"depth":310,"text":71},{"id":630,"depth":310,"text":630},{"id":2274,"depth":310,"text":2274},"markdown","content:blog:2025-11-09-taobao-search.md","content","blog\u002F2025-11-09-taobao-search.md","blog\u002F2025-11-09-taobao-search","md",1780801017950]