[{"data":1,"prerenderedAt":926},["ShallowReactive",2],{"doc-vi-integrations\u002Fautomation-frameworks":3},{"id":4,"title":5,"body":6,"description":918,"extension":919,"faq":920,"meta":921,"navigation":71,"path":922,"seo":923,"stem":924,"__hash__":925},"docs\u002Fdocs\u002Fvi\u002Fintegrations\u002Fautomation-frameworks.md","Framework tự động hóa",{"type":7,"value":8,"toc":910},"minimark",[9,22,27,34,148,155,159,166,299,316,320,522,526,703,836,840,843,873,877,906],[10,11,12,13,17,18,21],"p",{},"Cách kết nối cho Selenium, Puppeteer, Playwright, Scrapy và các framework tự động hóa\u002Fthu thập dữ liệu khác. Mọi ví dụ chỉ cần thay ",[14,15,16],"code",{},"USERNAME",", ",[14,19,20],{},"PASSWORD"," bằng thông tin xác thực của bạn là chạy được.",[23,24,26],"h2",{"id":25},"scrapy","Scrapy",[10,28,29,30,33],{},"Bật middleware proxy trong ",[14,31,32],{},"settings.py",", hoặc thiết lập theo từng request:",[35,36,41],"pre",{"className":37,"code":38,"language":39,"meta":40,"style":40},"language-python shiki shiki-themes github-light","# Cách 1: toàn cục (settings.py)\nHTTPPROXY_ENABLED = True\n\n# Chỉ định proxy cho từng request trong 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","# Cách 1: toàn cục (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},"# Chỉ định proxy cho từng request trong 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],{},"Xoay IP theo từng request là hành vi mặc định, phù hợp tự nhiên với mô hình chạy song song của Scrapy; khi cần cố định IP theo phiên, hãy thêm ",[14,152,153],{},"sid"," vào username.",[23,156,158],{"id":157},"selenium-python","Selenium (Python)",[10,160,161,162,165],{},"Tham số dòng lệnh của Chrome không hỗ trợ proxy có xác thực, nên khuyến nghị dùng ",[14,163,164],{},"selenium-wire"," để xử lý tài khoản\u002Fmật khẩu:",[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],{},"Bạn cũng có thể chuyển sang ",[303,304,306],"a",{"href":305},"\u002Fdocs\u002Fusage\u002Fapi-extraction","chế độ danh sách trắng",": sau khi trích xuất danh sách ",[14,309,310],{},"IP:cổng"," không cần xác thực, dùng trực tiếp tham số ",[14,313,314],{},"--proxy-server"," nguyên bản.",[23,317,319],{"id":318},"puppeteer-nodejs","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},"playwright-nodejs-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-pipeline-dữ-liệu-llm","AI Agent \u002F pipeline dữ liệu LLM",[10,841,842],{},"Khi dùng LLM điều khiển trình duyệt hoặc thu thập dữ liệu (công cụ LangChain, Browser Use, agent tự phát triển, v.v.), chỉ cần truyền cấu hình proxy của bất kỳ framework nào ở trên vào là được. Những điểm chính:",[844,845,846,858,865],"ul",{},[847,848,849,850,852,853,857],"li",{},"Cấp cho mỗi agent chạy song song một ",[14,851,153],{}," riêng, không ảnh hưởng lẫn nhau (",[303,854,856],{"href":855},"\u002Fdocs\u002Fusage\u002Fsession-control","ví dụ đa phiên",").",[847,859,860,861,864],{},"Cho agent gọi ",[14,862,863],{},"https:\u002F\u002Fipinfo.io"," để kiểm tra IP đầu ra khi bắt đầu tác vụ, rồi mới thực thi nghiệp vụ.",[847,866,867,868,872],{},"Toàn bộ cú pháp tham số gói gọn trong một trang: ",[303,869,871],{"href":870},"\u002Fdocs\u002Fagent-reference","Bảng tra cứu nhanh cho Agent",".",[23,874,876],{"id":875},"công-cụ-thu-thập-dữ-liệu","Công cụ thu thập dữ liệu",[10,878,879,880,886,887,886,891,886,896,886,901],{},"Hướng dẫn cấu hình chính thức cho các công cụ thu thập dạng đồ họa: ",[303,881,885],{"href":882,"rel":883},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Foctoparse",[884],"nofollow","Octoparse"," · ",[303,888,26],{"href":889,"rel":890},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Fscrapy",[884],[303,892,895],{"href":893,"rel":894},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Fscrapestorm",[884],"ScrapeStorm",[303,897,900],{"href":898,"rel":899},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Fsellersprite",[884],"SellerSprite",[303,902,905],{"href":903,"rel":904},"https:\u002F\u002Fwww.eproxies.io\u002Fintegrations\u002Fhelium10",[884],"Helium 10",[907,908,909],"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":911},[912,913,914,915,916,917],{"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":875,"depth":54,"text":876},"Cách kết nối cho Selenium, Puppeteer, Playwright, Scrapy và các framework tự động hóa\u002Fthu thập dữ liệu khác. Mọi ví dụ chỉ cần thay USERNAME, PASSWORD b…","md",null,{},"\u002Fdocs\u002Fvi\u002Fintegrations\u002Fautomation-frameworks",{"title":5,"description":918},"docs\u002Fvi\u002Fintegrations\u002Fautomation-frameworks","ujlgGWr7WIuyKSF7YbIbfYHViyDU38tK5UypN-27Qks",1785671056319]