
Successor of Undetected-Chromedriver. वेब ऑटोमेशन, वेबस्क्रैपिंग, बॉट्स और किसी भी अन्य रचनात्मक विचारों के लिए एक बहुत तेज़ फ्रेमवर्क प्रदान करता है जो सामान्यतः Captcha / CloudFlare / Imperva / hCaptcha जैसी कष्टप्रद एंटी-बॉट प्रणालियों द्वारा बाधित होते हैं।
प्रत्यक्ष संचार वेब एप्लिकेशन फ़ायरवॉल (WAF) के खिलाफ और भी बेहतर प्रतिरोध प्रदान करता है, जबकि प्रदर्शन को भारी बढ़ावा मिलता है। यह मॉड्यूल, undetected-chromedriver के विपरीत, पूरी तरह से async है।
यह पैकेज अन्य ज्ञात पैकेजों से अलग क्या बनाता है, वह अधिकांश एंटी-बॉट समाधानों के लिए पहचाने न जाने के लिए अनुकूलन है।
एक और फोकस बिंदु उपयोगिता और त्वरित प्रोटोटाइपिंग है, इसलिए उम्मीद करें कि बहुत कुछ -as is- काम करेगा,
जिसमें अधिकांश विधि पैरामीटर में best practice डिफ़ॉल्ट होंगे।
1 या 2 पंक्तियों का उपयोग करके, यह चालू और चलने के लिए तैयार है, जो डिफ़ॉल्ट रूप से best practice कॉन्फ़िगरेशन प्रदान करता है।
यह बाद में बनाई गई फ़ाइलों (प्रोफ़ाइल) को साफ़ कर देता है।
इसके साथ काम करने के लिए जाना जाता है
जबकि उपयोगिता और सुविधा महत्वपूर्ण है। हालांकि, CDP डोमेन, विधियों और उपलब्ध ईवेंट की पूरी श्रृंखला का उपयोग करके सब कुछ पूरी तरह से अनुकूलन योग्य बनाना भी आसान है।
कोई chromedriver बाइनरी या Selenium निर्भरता नहीं
कोड की 1 पंक्ति में चालू और चलने के लिए तैयार*
प्रत्येक रन पर ताज़ा प्रोफ़ाइल का उपयोग करता है, बाहर निकलने पर साफ़ करता है
बार-बार लॉगिन चरणों को दोहराने से बचने के लिए कुकीज़ को फ़ाइल में सहेजें और लोड करें
tab.find("sometext")
tab.find_all("sometext")
tab.select("a[class*=something]")
tab.select_all("a[href] > div > img")
स्मार्ट और कुशल एलिमेंट लुकअप, सेलेक्टर या टेक्स्ट द्वारा, जिसमें iframe सामग्री भी शामिल है।
इसका उपयोग किसी एलिमेंट के प्रकट होने के लिए प्रतीक्षा स्थिति के रूप में भी किया जा सकता है, क्योंकि यह मिलने तक की अवधि के लिए पुनः प्रयास करेगा। इसलिए await tab.select('body') का उपयोग यह संकेतक हो सकता है कि पेज लोड हुआ है या नहीं।
find विधि टेक्स्ट द्वारा खोज करती है, लेकिन भोलेपन से पहले मिलने वाले एलिमेंट को वापस नहीं करेगी,
बल्कि निकटतम मिलान वाली टेक्स्ट लंबाई (सबसे छोटी जीतती है) द्वारा उम्मीदवारों का मिलान करेगी,
यह लुकअप को tab.find('accept all') जैसा बनाता है जो हेडर में स्क्रिप्ट के बजाय वास्तविक कुकी बटन लौटाता है
चल रहे क्रोम डीबग सत्र से कनेक्ट हो सकता है
एलिमेंट के लिए वर्णनात्मक __repr__ जो एलिमेंट को html के रूप में प्रस्तुत करता है
चल रहे undetected_chromedriver.Chrome इंस्टेंस को nodriver.Browser इंस्टेंस में बदलने और वहां से जारी रखने के लिए उपयोगिता फ़ंक्शन
अधिकांश उपयोग किए जाने वाले और महत्वपूर्ण कार्यों के लिए सहायक और उपयोगिता विधियों से भरा हुआ
प्रोटोकॉल में फ्लैट कनेक्शन का उपयोग करने के लिए भागों को फिर से लिखा गया है।
क्यों?
- iframes अधिकांश कार्यों में शामिल हैं।
- tab को एक नई विधि मिली: await tab.get_frames()
जो निरीक्षण योग्य Iframes लौटाएगा।
- find() में iframes शामिल होंगे, इसलिए आप "verify you are human" खोज सकते हैं और
js चुनौतियों में सत्यापन चेकबॉक्स पर क्लिक कर सकते हैं।
चूंकि इसके लिए काफी पुनर्लेखन की आवश्यकता थी, कृपया पूरी तरह से परीक्षण करें, खासकर यदि आप बड़े प्रोजेक्ट चलाते हैं।
tab.xpath(selector, timeout=2.5)xpath सेलेक्टर का उपयोग करके नोड्स खोजें! एपीआई दस्तावेज़ में tab xpath देखें
tab.cf_verify()चेकबॉक्स ढूंढता है और उसे सफलतापूर्वक क्लिक करता है यह केवल तब काम करता है जब एक्सपर्ट मोड में न हो। वर्तमान में केवल अंग्रेजी में बनाया गया है opencv-python पैकेज स्थापित होना आवश्यक है
tab.bypass_insecure_connection_warning()असुरक्षित पेज चेतावनी के लिए सुविधा विधि, उदाहरण के लिए जब कोई प्रमाणपत्र अमान्य हो।
tab.open_external_debugger()आपको अपने कनेक्शन को तोड़े बिना टैब का निरीक्षण करने देता है
tab.get_local_storage()localstorage सामग्री प्राप्त करें
tab.set_local_storage(dict)localstorage सामग्री सेट करें
tab.add_handler(someEvent, callback)कॉलबैक एक एकल तर्क (ईवेंट) या 2 तर्क (ईवेंट, tab) स्वीकार कर सकता है।
start(expert=True)अधिक अनुभवी उपयोगकर्ताओं के लिए कुछ हैकिंग करता है। यह वेब सुरक्षा और ओरिजिन-ट्रायल को अक्षम करता है, साथ ही यह सुनिश्चित करता है कि शैडो-रूट हमेशा खुले रहें। हालांकि, यह आपको अधिक पहचानने योग्य बनाता है!
आपके पास क्रोम (या कोई क्रोमियम-आधारित ब्राउज़र) स्थापित होना चाहिए अधिमानतः डिफ़ॉल्ट स्थान पर उस मशीन पर जहां आप इस पैकेज का उपयोग करते हैं।
जब हेडलेस मशीन पर चल रहे हों, जैसे AWS या कोई अन्य वातावरण जहां कोई डिस्प्ले मौजूद नहीं है, तो स्क्रीन का अनुकरण करने के लिए किसी Xvfb टूल का उपयोग करना सबसे अच्छा है। वैकल्पिक रूप से इस पैकेज का उपयोग हेडलेस मोड में किया जा सकता है।
pip install nodriver
pip install -U nodriver
इस परियोजना का उद्देश्य (बिल्कुल undetected-chromedriver की तरह, काफी समय पहले) इसे छोटा और सरल रखना है, ताकि आप जल्दी से एक संपादक या इंटरैक्टिव सत्र खोल सकें, कुछ पंक्तियाँ टाइप या पेस्ट कर सकें और चल सकें।
import nodriver as uc
async def main():
browser = await uc.start()
page = await browser.get('https://www.nowsecure.nl')
... आगे कोड ...
if __name__ == '__main__':
# चूंकि asyncio.run कभी काम नहीं किया (मेरे लिए)
uc.loop().run_until_complete(main())
मैं यहां async बॉयलरप्लेट छोड़ रहा हूं
from nodriver import *
browser = await start(
headless=False,
user_data_dir="/path/to/existing/profile", # इसे निर्दिष्ट करके, यह समाप्त होने पर स्वचालित रूप से साफ नहीं होगा
browser_executable_path="/path/to/some/other/browser",
browser_args=['--some-browser-arg=true', '--some-other-option'],
lang="en-US" # यह नेविगेटर में iso-language-code सेट कर सकता है, इसे बदलने की अनुशंसा नहीं की जाती है
)
tab = await browser.get('https://somewebsite.com')
मैं यहां async बॉयलरप्लेट छोड़ रहा हूं
from nodriver import *
config = Config()
config.headless = False
config.user_data_dir="/path/to/existing/profile", # इसे निर्दिष्ट करके, यह समाप्त होने पर स्वचालित रूप से साफ नहीं होगा
config.browser_executable_path="/path/to/some/other/browser",
config.browser_args=['--some-browser-arg=true', '--some-other-option'],
config.lang="en-US" # यह नेविगेटर में iso-language-code सेट कर सकता है, इसे बदलने की अनुशंसा नहीं की जाती है
)
import nodriver
async def main():
browser = await nodriver.start()
page = await browser.get('https://www.nowsecure.nl')
await page.save_screenshot()
await page.get_content()
await page.scroll_down(150)
elems = await page.select_all('*[src]')
for elem in elems:
await elem.flash()
page2 = await browser.get('https://twitter.com', new_tab=True)
page3 = await browser.get('https://github.com/ultrafunkamsterdam/nodriver', new_window=True)
for p in (page, page2, page3):
await p.bring_to_front()
await p.scroll_down(200)
await p # ईवेंट प्रोसेस होने तक प्रतीक्षा करें
await p.reload()
if p != page3:
await p.close()
if __name__ == '__main__':
# चूंकि asyncio.run कभी काम नहीं किया (मेरे लिए)
uc.loop().run_until_complete(main())
Twitter/X खाता निर्माण को स्वचालित करना
एक अधिक ठोस उदाहरण, जो ./example/ फ़ोल्डर में पाया जा सकता है, ट्विटर खाता बनाने के लिए एक स्क्रिप्ट दिखाता है
import random
import string
import logging
logging.basicConfig(level=30)
import nodriver as uc
months = [
"january",
"february",
"march",
"april",
"may",
"june",
"july",
"august",
"september",
"october",
"november",
"december",
]
async def main():
driver = await uc.start()
tab = await driver.get("https://twitter.com")
# टेक्स्ट प्रकट होने की प्रतीक्षा करें, प्रतीक्षा करने के लिए स्थिर सेकंड की संख्या के बजाय
# यह हमेशा उम्मीद के मुताबिक काम नहीं करता है, गति के कारण।
print('"create account" बटन ढूंढ रहे हैं')
create_account = await tab.find("create account", best_match=True)
print('"create account" => क्लिक करें')
await create_account.click()
print("ईमेल इनपुट फ़ील्ड ढूंढ रहे हैं")
email = await tab.select("input[type=email]")
# कभी-कभी, ईमेल फ़ील्ड नहीं दिखाई जाती है, क्योंकि इसके बजाय फ़ोन मांगा जाता है
# जब ऐसा होता है, तो छोटा टेक्स्ट ढूंढें जो "use email instead" कहता है
if not email:
use_mail_instead = await tab.find("use email instead")
# और उस पर क्लिक करें
await use_mail_instead.click()
# अब ईमेल फ़ील्ड फिर से ढूंढें
email = await tab.select("input[type=email]")
randstr = lambda k: "".join(random.choices(string.ascii_letters, k=k))
# ईमेल फ़ील्ड में कुंजियाँ भेजें
print('"email" इनपुट फ़ील्ड भर रहे हैं')
await email.send_keys("".join([randstr(8), "@", randstr(8), ".com"]))
# नाम इनपुट फ़ील्ड ढूंढें
print("नाम इनपुट फ़ील्ड ढूंढ रहे हैं")
name = await tab.select("input[type=text]")
# फिर से, यादृच्छिक टेक्स्ट भेजें
print('"name" इनपुट फ़ील्ड भर रहे हैं')
await name.send_keys(randstr(8))
# चूंकि टैब पर 3 सेलेक्ट फ़ील्ड हैं, हम अनपैकिंग का उपयोग कर सकते हैं
# प्रत्येक फ़ील्ड को असाइन करने के लिए
print('"month", "day" और "year" फ़ील्ड एक साथ ढूंढ रहे हैं')
sel_month, sel_day, sel_year = await tab.select_all("select")
# await sel_month.focus()
print('"month" इनपुट फ़ील्ड भर रहे हैं')
await sel_month.send_keys(months[random.randint(0, 11)].title())
# await sel_day.focus()
# मैं महीने की लंबाई और लीप वर्षों की परवाह नहीं करना चाहता
print('"day" इनपुट फ़ील्ड भर रहे हैं')
await sel_day.send_keys(str(random.randint(0, 28)))
# await sel_year.focus()
# मैं आयु प्रतिबंधों की परवाह नहीं करना चाहता
print('"year" इनपुट फ़ील्ड भर रहे हैं')
await sel_year.send_keys(str(random.randint(1980, 2005)))
await tab
# चलिए कुकी नाग को भी संभालते हैं
cookie_bar_accept = await tab.find("accept all", best_match=True)
if cookie_bar_accept:
await cookie_bar_accept.click()
await tab.sleep(1)
next_btn = await tab.find(text="next", best_match=True)
# for btn in reversed(next_btns):
await next_btn.mouse_click()
print("2 सेकंड सो रहे हैं")
await tab.sleep(2) # देखने के लिए कि हम वास्तव में किस भाग में हैं
print('"next" बटन ढूंढ रहे हैं')
next_btn = await tab.find(text="next", best_match=True)
print('"next" बटन पर क्लिक कर रहे हैं')
await next_btn.mouse_click()
# जारी रखने से पहले बस किसी बटन की प्रतीक्षा करें
await tab.select("[role=button]")
print('"sign up" बटन ढूंढ रहे हैं')
sign_up_btn = await tab.find("Sign up", best_match=True)
# हमें दूसरे की आवश्यकता है
print('"sign up" बटन पर क्लिक कर रहे हैं')
await sign_up_btn.click()
print('बाकी "कार्यान्वयन" दायरे से बाहर है')
# आगे कार्यान्वयन दायरे से बाहर
await tab.sleep(10)
driver.stop()
# मेल द्वारा सत्यापन कोड
if __name__ == "__main__":
# चूंकि asyncio.run कभी काम नहीं किया (मेरे लिए)
# मैं उपयोग करता हूं
uc.loop().run_until_complete(main())