[{"data":1,"prerenderedAt":924},["ShallowReactive",2],{"doc-zh-cn-integrations\u002Fautomation-frameworks":3},{"id":4,"title":5,"body":6,"description":916,"extension":917,"faq":918,"meta":919,"navigation":71,"path":920,"seo":921,"stem":922,"__hash__":923},"docs\u002Fdocs\u002Fzh-cn\u002Fintegrations\u002Fautomation-frameworks.md","自动化框架",{"type":7,"value":8,"toc":908},"minimark",[9,22,27,34,148,155,159,166,299,316,320,522,526,703,836,840,843,872,875,904],[10,11,12,13,17,18,21],"p",{},"Selenium、Puppeteer、Playwright、Scrapy 等自动化与采集框架的接入方法。所有示例把 ",[14,15,16],"code",{},"USERNAME","、",[14,19,20],{},"PASSWORD"," 替换为你的凭据即可运行。",[23,24,26],"h2",{"id":25},"scrapy","Scrapy",[10,28,29,30,33],{},"在 ",[14,31,32],{},"settings.py"," 启用代理中间件,或按请求设置:",[35,36,41],"pre",{"className":37,"code":38,"language":39,"meta":40,"style":40},"language-python shiki shiki-themes github-light","# 方式一:全局(settings.py)\nHTTPPROXY_ENABLED = True\n\n# 在 Spider 中为每个请求指定代理\ndef start_requests(self):\n    proxy = \"http:\u002F\u002FUSERNAME-pool-flow-region-US:PASSWORD@proxy.eproxies.net:23333\"\n    for url in self.start_urls:\n        yield scrapy.Request(url, meta={\"proxy\": proxy})\n","python","",[14,42,43,52,66,73,79,93,106,124],{"__ignoreMap":40},[44,45,48],"span",{"class":46,"line":47},"line",1,[44,49,51],{"class":50},"sAwPA","# 方式一:全局(settings.py)\n",[44,53,55,59,63],{"class":46,"line":54},2,[44,56,58],{"class":57},"sYu0t","HTTPPROXY_ENABLED",[44,60,62],{"class":61},"sD7c4"," =",[44,64,65],{"class":57}," True\n",[44,67,69],{"class":46,"line":68},3,[44,70,72],{"emptyLinePlaceholder":71},true,"\n",[44,74,76],{"class":46,"line":75},4,[44,77,78],{"class":50},"# 在 Spider 中为每个请求指定代理\n",[44,80,82,85,89],{"class":46,"line":81},5,[44,83,84],{"class":61},"def",[44,86,88],{"class":87},"s7eDp"," start_requests",[44,90,92],{"class":91},"sgsFI","(self):\n",[44,94,96,99,102],{"class":46,"line":95},6,[44,97,98],{"class":91},"    proxy ",[44,100,101],{"class":61},"=",[44,103,105],{"class":104},"sYBdl"," \"http:\u002F\u002FUSERNAME-pool-flow-region-US:PASSWORD@proxy.eproxies.net:23333\"\n",[44,107,109,112,115,118,121],{"class":46,"line":108},7,[44,110,111],{"class":61},"    for",[44,113,114],{"class":91}," url ",[44,116,117],{"class":61},"in",[44,119,120],{"class":57}," self",[44,122,123],{"class":91},".start_urls:\n",[44,125,127,130,133,137,139,142,145],{"class":46,"line":126},8,[44,128,129],{"class":61},"        yield",[44,131,132],{"class":91}," scrapy.Request(url, ",[44,134,136],{"class":135},"sqxcx","meta",[44,138,101],{"class":61},[44,140,141],{"class":91},"{",[44,143,144],{"class":104},"\"proxy\"",[44,146,147],{"class":91},": proxy})\n",[10,149,150,151,154],{},"逐请求轮换是默认行为,天然适配 Scrapy 的并发模型;需要按会话固定 IP 时在 username 中加入 ",[14,152,153],{},"sid","。",[23,156,158],{"id":157},"seleniumpython","Selenium(Python)",[10,160,161,162,165],{},"Chrome 命令行参数不支持带认证的代理,推荐用 ",[14,163,164],{},"selenium-wire"," 处理账密:",[35,167,169],{"className":37,"code":168,"language":39,"meta":40,"style":40},"# pip install selenium-wire\nfrom seleniumwire import webdriver\n\noptions = {\n    \"proxy\": {\n        \"http\": \"http:\u002F\u002FUSERNAME-pool-flow-region-US:PASSWORD@proxy.eproxies.net:23333\",\n        \"https\": \"http:\u002F\u002FUSERNAME-pool-flow-region-US:PASSWORD@proxy.eproxies.net:23333\",\n    }\n}\n\ndriver = webdriver.Chrome(seleniumwire_options=options)\ndriver.get(\"https:\u002F\u002Fipinfo.io\")\nprint(driver.page_source)\ndriver.quit()\n",[14,170,171,176,190,194,204,212,226,237,242,248,253,272,284,293],{"__ignoreMap":40},[44,172,173],{"class":46,"line":47},[44,174,175],{"class":50},"# pip install selenium-wire\n",[44,177,178,181,184,187],{"class":46,"line":54},[44,179,180],{"class":61},"from",[44,182,183],{"class":91}," seleniumwire ",[44,185,186],{"class":61},"import",[44,188,189],{"class":91}," webdriver\n",[44,191,192],{"class":46,"line":68},[44,193,72],{"emptyLinePlaceholder":71},[44,195,196,199,201],{"class":46,"line":75},[44,197,198],{"class":91},"options ",[44,200,101],{"class":61},[44,202,203],{"class":91}," {\n",[44,205,206,209],{"class":46,"line":81},[44,207,208],{"class":104},"    \"proxy\"",[44,210,211],{"class":91},": {\n",[44,213,214,217,220,223],{"class":46,"line":95},[44,215,216],{"class":104},"        \"http\"",[44,218,219],{"class":91},": ",[44,221,222],{"class":104},"\"http:\u002F\u002FUSERNAME-pool-flow-region-US:PASSWORD@proxy.eproxies.net:23333\"",[44,224,225],{"class":91},",\n",[44,227,228,231,233,235],{"class":46,"line":108},[44,229,230],{"class":104},"        \"https\"",[44,232,219],{"class":91},[44,234,222],{"class":104},[44,236,225],{"class":91},[44,238,239],{"class":46,"line":126},[44,240,241],{"class":91},"    }\n",[44,243,245],{"class":46,"line":244},9,[44,246,247],{"class":91},"}\n",[44,249,251],{"class":46,"line":250},10,[44,252,72],{"emptyLinePlaceholder":71},[44,254,256,259,261,264,267,269],{"class":46,"line":255},11,[44,257,258],{"class":91},"driver ",[44,260,101],{"class":61},[44,262,263],{"class":91}," webdriver.Chrome(",[44,265,266],{"class":135},"seleniumwire_options",[44,268,101],{"class":61},[44,270,271],{"class":91},"options)\n",[44,273,275,278,281],{"class":46,"line":274},12,[44,276,277],{"class":91},"driver.get(",[44,279,280],{"class":104},"\"https:\u002F\u002Fipinfo.io\"",[44,282,283],{"class":91},")\n",[44,285,287,290],{"class":46,"line":286},13,[44,288,289],{"class":57},"print",[44,291,292],{"class":91},"(driver.page_source)\n",[44,294,296],{"class":46,"line":295},14,[44,297,298],{"class":91},"driver.quit()\n",[10,300,301,302,307,308,311,312,315],{},"也可以改用",[303,304,306],"a",{"href":305},"\u002Fdocs\u002Fusage\u002Fapi-extraction","白名单模式",":提取免认证的 ",[14,309,310],{},"IP:端口"," 后,直接用原生 ",[14,313,314],{},"--proxy-server"," 参数。",[23,317,319],{"id":318},"puppeteernodejs","Puppeteer(Node.js)",[35,321,325],{"className":322,"code":323,"language":324,"meta":40,"style":40},"language-javascript shiki shiki-themes github-light","const puppeteer = require(\"puppeteer\");\n\n(async () => {\n  const browser = await puppeteer.launch({\n    args: [\"--proxy-server=http:\u002F\u002Fproxy.eproxies.net:23333\"],\n  });\n  const page = await browser.newPage();\n  await page.authenticate({\n    username: \"USERNAME-pool-flow-region-US\",\n    password: \"PASSWORD\",\n  });\n  await page.goto(\"https:\u002F\u002Fipinfo.io\u002Fjson\");\n  console.log(await page.evaluate(() => document.body.innerText));\n  await browser.close();\n})();\n","javascript",[14,326,327,349,353,368,390,401,406,426,439,449,459,463,479,505,516],{"__ignoreMap":40},[44,328,329,332,335,337,340,343,346],{"class":46,"line":47},[44,330,331],{"class":61},"const",[44,333,334],{"class":57}," puppeteer",[44,336,62],{"class":61},[44,338,339],{"class":87}," require",[44,341,342],{"class":91},"(",[44,344,345],{"class":104},"\"puppeteer\"",[44,347,348],{"class":91},");\n",[44,350,351],{"class":46,"line":54},[44,352,72],{"emptyLinePlaceholder":71},[44,354,355,357,360,363,366],{"class":46,"line":68},[44,356,342],{"class":91},[44,358,359],{"class":61},"async",[44,361,362],{"class":91}," () ",[44,364,365],{"class":61},"=>",[44,367,203],{"class":91},[44,369,370,373,376,378,381,384,387],{"class":46,"line":75},[44,371,372],{"class":61},"  const",[44,374,375],{"class":57}," browser",[44,377,62],{"class":61},[44,379,380],{"class":61}," await",[44,382,383],{"class":91}," puppeteer.",[44,385,386],{"class":87},"launch",[44,388,389],{"class":91},"({\n",[44,391,392,395,398],{"class":46,"line":81},[44,393,394],{"class":91},"    args: [",[44,396,397],{"class":104},"\"--proxy-server=http:\u002F\u002Fproxy.eproxies.net:23333\"",[44,399,400],{"class":91},"],\n",[44,402,403],{"class":46,"line":95},[44,404,405],{"class":91},"  });\n",[44,407,408,410,413,415,417,420,423],{"class":46,"line":108},[44,409,372],{"class":61},[44,411,412],{"class":57}," page",[44,414,62],{"class":61},[44,416,380],{"class":61},[44,418,419],{"class":91}," browser.",[44,421,422],{"class":87},"newPage",[44,424,425],{"class":91},"();\n",[44,427,428,431,434,437],{"class":46,"line":126},[44,429,430],{"class":61},"  await",[44,432,433],{"class":91}," page.",[44,435,436],{"class":87},"authenticate",[44,438,389],{"class":91},[44,440,441,444,447],{"class":46,"line":244},[44,442,443],{"class":91},"    username: ",[44,445,446],{"class":104},"\"USERNAME-pool-flow-region-US\"",[44,448,225],{"class":91},[44,450,451,454,457],{"class":46,"line":250},[44,452,453],{"class":91},"    password: ",[44,455,456],{"class":104},"\"PASSWORD\"",[44,458,225],{"class":91},[44,460,461],{"class":46,"line":255},[44,462,405],{"class":91},[44,464,465,467,469,472,474,477],{"class":46,"line":274},[44,466,430],{"class":61},[44,468,433],{"class":91},[44,470,471],{"class":87},"goto",[44,473,342],{"class":91},[44,475,476],{"class":104},"\"https:\u002F\u002Fipinfo.io\u002Fjson\"",[44,478,348],{"class":91},[44,480,481,484,487,489,492,494,497,500,502],{"class":46,"line":286},[44,482,483],{"class":91},"  console.",[44,485,486],{"class":87},"log",[44,488,342],{"class":91},[44,490,491],{"class":61},"await",[44,493,433],{"class":91},[44,495,496],{"class":87},"evaluate",[44,498,499],{"class":91},"(() ",[44,501,365],{"class":61},[44,503,504],{"class":91}," document.body.innerText));\n",[44,506,507,509,511,514],{"class":46,"line":295},[44,508,430],{"class":61},[44,510,419],{"class":91},[44,512,513],{"class":87},"close",[44,515,425],{"class":91},[44,517,519],{"class":46,"line":518},15,[44,520,521],{"class":91},"})();\n",[23,523,525],{"id":524},"playwrightnodejs-python","Playwright(Node.js \u002F Python)",[35,527,529],{"className":322,"code":528,"language":324,"meta":40,"style":40},"\u002F\u002F Node.js\nconst { chromium } = require(\"playwright\");\n\n(async () => {\n  const browser = await chromium.launch({\n    proxy: {\n      server: \"http:\u002F\u002Fproxy.eproxies.net:23333\",\n      username: \"USERNAME-pool-flow-region-US\",\n      password: \"PASSWORD\",\n    },\n  });\n  const page = await browser.newPage();\n  await page.goto(\"https:\u002F\u002Fipinfo.io\u002Fjson\");\n  console.log(await page.textContent(\"body\"));\n  await browser.close();\n})();\n",[14,530,531,536,560,564,576,593,598,608,617,626,631,635,651,665,688,698],{"__ignoreMap":40},[44,532,533],{"class":46,"line":47},[44,534,535],{"class":50},"\u002F\u002F Node.js\n",[44,537,538,540,543,546,549,551,553,555,558],{"class":46,"line":54},[44,539,331],{"class":61},[44,541,542],{"class":91}," { ",[44,544,545],{"class":57},"chromium",[44,547,548],{"class":91}," } ",[44,550,101],{"class":61},[44,552,339],{"class":87},[44,554,342],{"class":91},[44,556,557],{"class":104},"\"playwright\"",[44,559,348],{"class":91},[44,561,562],{"class":46,"line":68},[44,563,72],{"emptyLinePlaceholder":71},[44,565,566,568,570,572,574],{"class":46,"line":75},[44,567,342],{"class":91},[44,569,359],{"class":61},[44,571,362],{"class":91},[44,573,365],{"class":61},[44,575,203],{"class":91},[44,577,578,580,582,584,586,589,591],{"class":46,"line":81},[44,579,372],{"class":61},[44,581,375],{"class":57},[44,583,62],{"class":61},[44,585,380],{"class":61},[44,587,588],{"class":91}," chromium.",[44,590,386],{"class":87},[44,592,389],{"class":91},[44,594,595],{"class":46,"line":95},[44,596,597],{"class":91},"    proxy: {\n",[44,599,600,603,606],{"class":46,"line":108},[44,601,602],{"class":91},"      server: ",[44,604,605],{"class":104},"\"http:\u002F\u002Fproxy.eproxies.net:23333\"",[44,607,225],{"class":91},[44,609,610,613,615],{"class":46,"line":126},[44,611,612],{"class":91},"      username: ",[44,614,446],{"class":104},[44,616,225],{"class":91},[44,618,619,622,624],{"class":46,"line":244},[44,620,621],{"class":91},"      password: ",[44,623,456],{"class":104},[44,625,225],{"class":91},[44,627,628],{"class":46,"line":250},[44,629,630],{"class":91},"    },\n",[44,632,633],{"class":46,"line":255},[44,634,405],{"class":91},[44,636,637,639,641,643,645,647,649],{"class":46,"line":274},[44,638,372],{"class":61},[44,640,412],{"class":57},[44,642,62],{"class":61},[44,644,380],{"class":61},[44,646,419],{"class":91},[44,648,422],{"class":87},[44,650,425],{"class":91},[44,652,653,655,657,659,661,663],{"class":46,"line":286},[44,654,430],{"class":61},[44,656,433],{"class":91},[44,658,471],{"class":87},[44,660,342],{"class":91},[44,662,476],{"class":104},[44,664,348],{"class":91},[44,666,667,669,671,673,675,677,680,682,685],{"class":46,"line":295},[44,668,483],{"class":91},[44,670,486],{"class":87},[44,672,342],{"class":91},[44,674,491],{"class":61},[44,676,433],{"class":91},[44,678,679],{"class":87},"textContent",[44,681,342],{"class":91},[44,683,684],{"class":104},"\"body\"",[44,686,687],{"class":91},"));\n",[44,689,690,692,694,696],{"class":46,"line":518},[44,691,430],{"class":61},[44,693,419],{"class":91},[44,695,513],{"class":87},[44,697,425],{"class":91},[44,699,701],{"class":46,"line":700},16,[44,702,521],{"class":91},[35,704,706],{"className":37,"code":705,"language":39,"meta":40,"style":40},"# Python\nfrom playwright.sync_api import sync_playwright\n\nwith sync_playwright() as p:\n    browser = p.chromium.launch(proxy={\n        \"server\": \"http:\u002F\u002Fproxy.eproxies.net:23333\",\n        \"username\": \"USERNAME-pool-flow-region-US\",\n        \"password\": \"PASSWORD\",\n    })\n    page = browser.new_page()\n    page.goto(\"https:\u002F\u002Fipinfo.io\u002Fjson\")\n    print(page.text_content(\"body\"))\n    browser.close()\n",[14,707,708,713,725,729,743,761,772,783,794,799,809,818,831],{"__ignoreMap":40},[44,709,710],{"class":46,"line":47},[44,711,712],{"class":50},"# Python\n",[44,714,715,717,720,722],{"class":46,"line":54},[44,716,180],{"class":61},[44,718,719],{"class":91}," playwright.sync_api ",[44,721,186],{"class":61},[44,723,724],{"class":91}," sync_playwright\n",[44,726,727],{"class":46,"line":68},[44,728,72],{"emptyLinePlaceholder":71},[44,730,731,734,737,740],{"class":46,"line":75},[44,732,733],{"class":61},"with",[44,735,736],{"class":91}," sync_playwright() ",[44,738,739],{"class":61},"as",[44,741,742],{"class":91}," p:\n",[44,744,745,748,750,753,756,758],{"class":46,"line":81},[44,746,747],{"class":91},"    browser ",[44,749,101],{"class":61},[44,751,752],{"class":91}," p.chromium.launch(",[44,754,755],{"class":135},"proxy",[44,757,101],{"class":61},[44,759,760],{"class":91},"{\n",[44,762,763,766,768,770],{"class":46,"line":95},[44,764,765],{"class":104},"        \"server\"",[44,767,219],{"class":91},[44,769,605],{"class":104},[44,771,225],{"class":91},[44,773,774,777,779,781],{"class":46,"line":108},[44,775,776],{"class":104},"        \"username\"",[44,778,219],{"class":91},[44,780,446],{"class":104},[44,782,225],{"class":91},[44,784,785,788,790,792],{"class":46,"line":126},[44,786,787],{"class":104},"        \"password\"",[44,789,219],{"class":91},[44,791,456],{"class":104},[44,793,225],{"class":91},[44,795,796],{"class":46,"line":244},[44,797,798],{"class":91},"    })\n",[44,800,801,804,806],{"class":46,"line":250},[44,802,803],{"class":91},"    page ",[44,805,101],{"class":61},[44,807,808],{"class":91}," browser.new_page()\n",[44,810,811,814,816],{"class":46,"line":255},[44,812,813],{"class":91},"    page.goto(",[44,815,476],{"class":104},[44,817,283],{"class":91},[44,819,820,823,826,828],{"class":46,"line":274},[44,821,822],{"class":57},"    print",[44,824,825],{"class":91},"(page.text_content(",[44,827,684],{"class":104},[44,829,830],{"class":91},"))\n",[44,832,833],{"class":46,"line":286},[44,834,835],{"class":91},"    browser.close()\n",[23,837,839],{"id":838},"ai-agent-llm-数据管线","AI Agent \u002F LLM 数据管线",[10,841,842],{},"用 LLM 驱动浏览器或采集数据时(LangChain 工具、Browser Use、自研 agent 等),把上述任一框架的代理配置传入即可。要点:",[844,845,846,858,865],"ul",{},[847,848,849,850,852,853,857],"li",{},"给每个并行 agent 分配独立 ",[14,851,153],{},",互不干扰(",[303,854,856],{"href":855},"\u002Fdocs\u002Fusage\u002Fsession-control","多会话示例",")。",[847,859,860,861,864],{},"让 agent 在任务开始时先请求 ",[14,862,863],{},"https:\u002F\u002Fipinfo.io"," 校验出口 IP,再执行业务。",[847,866,867,868,154],{},"完整参数语法一页速查:",[303,869,871],{"href":870},"\u002Fdocs\u002Fagent-reference","Agent 速查表",[23,873,874],{"id":874},"爬虫采集工具",[10,876,877,878,884,885,884,889,884,894,884,899],{},"图形化采集工具的官方配置教程:",[303,879,883],{"href":880,"rel":881},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Foctoparse",[882],"nofollow","Octoparse"," · ",[303,886,26],{"href":887,"rel":888},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Fscrapy",[882],[303,890,893],{"href":891,"rel":892},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Fscrapestorm",[882],"ScrapeStorm",[303,895,898],{"href":896,"rel":897},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Fsellersprite",[882],"SellerSprite",[303,900,903],{"href":901,"rel":902},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Fhelium10",[882],"Helium 10",[905,906,907],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}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":40,"searchDepth":54,"depth":54,"links":909},[910,911,912,913,914,915],{"id":25,"depth":54,"text":26},{"id":157,"depth":54,"text":158},{"id":318,"depth":54,"text":319},{"id":524,"depth":54,"text":525},{"id":838,"depth":54,"text":839},{"id":874,"depth":54,"text":874},"Selenium、Puppeteer、Playwright、Scrapy 等自动化与采集框架的接入方法。所有示例把 USERNAME、PASSWORD 替换为你的凭据即可运行。","md",null,{},"\u002Fdocs\u002Fzh-cn\u002Fintegrations\u002Fautomation-frameworks",{"title":5,"description":916},"docs\u002Fzh-cn\u002Fintegrations\u002Fautomation-frameworks","efCg0thRGUhL61aCP7vd-PhVu969vc94uSgRa2f6ouM",1785671055506]