وبلاگ فربد | Farbod Blog

توی این وبلاگ راجع به پروژه هام صحبت می کنم

وب اسکرپینگ در پایتون

  • ۱۰۱۲

سلام دوستان :)

 

توی این پست قراره با هم راجع به وب اسکرپینگ در پایتون صحبت کنیم.

همونطور که میدونید فضای وب یک فضای بسیار گسترده و عظیم هست که هر نوع داده و اطلاعاتی میشه توش پیدا کرد.

وب اسکرپینگ یعنی ساختن ربات هایی برای استخراج داده های فضای اینترنت.

 

برای انجام دادن این کار توی پایتون ماژول ها و کتابخونه های زیادی نوشته شده مثل requests , beautiful soup , selenium و...

 

ما توی این پست قراره با استفاده از ماژول selenium بریم و در سایت github لاگین کنیم.

برای این کار اول از همه باید یکسری اطلاعات راجع به فرم ورود گیت هاب جمع آوری کنیم.

بنابراین وارد صفحه لاگین github بشین:

 

خب قبل از اینکه بریم سراغ بقیه کار یک چیزی رو بهتون بگم.

توی زبان نشانه گذاری html ما برای هر تگ یک سری attribute مشخص می کنیم. یکی از این attribute ها name هست که در واقع یکی از شناسه های اون تگ هستش.

خب برای پر کردن این فرم بصورت خودکار ما نیاز داریم تا name یا شناسه اون تکست باکس رو بدونیم.

بنابراین باید یجوری به کد های html اون سایت دسترسی داشته باشیم تا بتونیم اتریبیوت های تگ مد نظرمون رو ببینیم.

برای اینکار از چیزی بنام inspector که توی تمام مرورگر ها موجوده استفاده میکنیم.

برای دسترسی به inspector توی مرورگر کروم باید روی تگ مد نظر راست کلیک کنید و گزینه inspect رو بزنید توی بقیه مرورگر ها هم یک چیزی شبیه به همینه.

پس روی تکست باکس username or email address راست کلیک کنید و گزینه inspect رو بزنین.

بعدش باید یک صفحه این شکلی براتون باز بشه:

خب حالا توی اون خطی که انتخاب شده بگردین و اتریبیوت name رو پیدا کنید:

 

خب حالا روی فیلد Password راست کلیک کنید و گزینه inspect رو بزنین

بعد هم دنبال اتریبیوت name بگردید و اون رو پیدا کنید:

بعد از اون هم باید name دکمه رو پیدا کنید پس دوباره روی دکمه راست کلیک کنید و گزینه inspect رو بزنید

بعد هم دنبال اتریبیوت name بگردید و اون رو پیدا کنید:

 

خب حالا که اطلاعات مورد نظر رو از فرم بدست آوردیم میریم سراغ برنامه.

 

اول از همه باید درایور مرورگر مد نظر خودتون رو دانلود کنید. برای دانلود این درایور ها میتونین توی گوگل سرچ کنید و درایور مرورگر مد نظر خودتون رو پیدا و دانلود کنید.

(درایور ها ابزار هایی هستند که کتابخونه selenium از اون برای باز کردن صفحات مختلف استفاده می کنه)

 

بعد از نصب درایور باید ماژول selenium رو نصب کنید.

 

برای نصب selenium در ویندوز برین توی cmd و کد زیر رو بزنین:

pip install selenium

برای نصب selenium در لینوکس برین توی ترمینال و کد زیر رو بزنین:

sudo pip3 install selenium

 

خب حالا تمام پیش نیاز ها رو داریم پس بریم سراغ برنامه.

 

سورس کد:

from logging import error
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait


username = "username"
password = "password"


driver = webdriver.Chrome(r"chromedriver")

driver.get("https://github.com/login")

driver.find_element_by_name("login").send_keys(username)

driver.find_element_by_name("password").send_keys(password)

driver.find_element_by_name("commit").click()

WebDriverWait(driver=driver, timeout=10).until(
    lambda x: x.execute_script("return document.readyState === 'complete'")
)
error_message = "Incorrect username or password."

errors = driver.find_elements_by_class_name("flash-error")

if any(error_message in e.text for e in errors):
    print("[!] Login failed")
else:
    print("[+] Login successful")


driver.close()

 

خب اول ماژول های مورد نیاز رو ایمپورت کردیم. بعد متغییر های username و password رو تعریف کردیم. توی متغییر یوزرنیم شما باید یوزرنیم اکانت github خودتون رو وارد کنید و در متغییر password هم باید پسورد خودتون رو.

توی خط بعد شی درایور خودمون رو ساختیم. بعد توی خط بعدی گفتیم که وارد آدرس gtihub.com/login بشه. بعدش توی دو خط بعد گفتیم که توی فیلد های یوزر و پسورد رو با استفاده از اتریبیوت name پیدا کنه و داخل اونها مقادیری که دادیم رو بنویسه. توی خط بعد هم بهش گفتیم که روی دکمه کلیک کنه.

دو خط بعدی هم خیلی مهم نیستن. توی خط بعد پیام اروری که به کاربر نشون میده رو تعریف کردیم.

خب وقتی که یوزرنیم و پسورد رو اشتباه توی گیت هاب وارد میکنیم یک پاپ آپ با کلاس flash-error ظاهر میشه بنابراین گفتیم که اگر همچین چیزی روی صفحه ظاهر شد چاپ کنه که لاگین با خطا مواجه شد و اگر نه چاپ میکنه لاگین موفقیت آمیز بود.

 

خب دوستان این برنامه هم تموم شد.

امیدوارم براتون مفید بوده باشه D:


  • بابت راهنمایی تان سپاسگزارم. همان کاری که گفتید انجام دادم و، با استفاده از صفت ها دیگر،مشکلم حل شد.
    پاسخ:
    خواهش می‌کنم.
    خوشحالم که تونستم بهتون کمک کنم.
    موفق باشید.
  • سلام.
    ضمن سپاس بابت راهنمایی سازنده پیشینتان. یک مشکلی دیگری که در فرآیند web scrapping ، برایم به وجود آمده عدم شناسایی عنصرهایی با نام فارسی است. برای مثال، دستور زیر در جعبه چند گزینه (drop (down listنمی تواند نام فارسی «پارسیان»را پیدا کند و خطا می دهد.
    bank_branch="پارسیان"
    driver.find_element(By.NAME,"bankAccount.bankBranch.bank.bankId")
    dropdown = Select(WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.NAME, "bankAccount.bankBranch.bank.bankId"))))
    dropdown.select_by_value(bank_branch)
    (اگر از دستور dropdown.select_by_index استفاده کنم خطایی وجود ندارد و انگار این مشکل به خاطر فارسی بودن صفت Name است. به خاطر تغییرات وب سایت و ...باید حتما از صفت NAME استفاده کنم و امکان استفاده از Index برایم وجود ندارد.)
    دستور HTML جعبه چند گزینه ای:
    آینده
    اقتصاد نوین
    انصار
    ایران زمین
    ایران کیش
    ایوان رایان پیام (جیبیت)
    بانک مرکزی
    بانک مشترک ایران و ونزوئلا
    بانکسا
    تجارت
    تسویه حساب الکترونیک
    تعاونی اعتبار صالحین
    توسعه تعاون
    توسعه صادرات
    حکمت ایرانیان
    خاورمیانه
    خاورمیانه-2
    دی
    رفاه کارگران
    سامان
    سامان - درگاه جدید
    سامان(تسویه به چند حساب)
    سایان کارت
    سرمایه
    سینا
    سپه
    شهر
    صادرات
    صندوق تعاون
    صنعت و معدن
    عابر بانک
    قرض الحسنه باب الحوائج
    قرض الحسنه رسالت
    قرض الحسنه مهر ایران
    قوامین
    کارآفرین
    کشاورزی
    مؤسسه مالی و اعتباری آتی
    مبنا
    مرکزی
    مسکن
    ملت
    ملی
    مهر اقتصاد
    موسسه اعتباری بنیاد
    موسسه اعتباری توسعه
    موسسه اعتباری ثامن الائمه
    موسسه اعتباری ثامن الحجج
    موسسه اعتباری مهر
    موسسه اعتباری پیشگامان
    موسسه اعتباری افضل توس
    موسسه اعتباری ملل
    موسسه اعتباری نور
    موسسه مالی مولی الموحدین
    موسسه مالی و اعتباری رضوی
    موسسه مالی و اعتباری صالحین
    موسسه مالی و اعتباری فردوسی
    موسسه مالی و اعتباری کوثر
    نامشخص
    پارسیان
    پارسیان ۲
    پارسیان(تسویه به چند حساب)
    پاسارگاد
    پرشین
    پرشین (MPG)
    پست بانک
    کارا پی
    گردشگری
    پاسخ:
    سلام دوست عزیز.
    خواهش میکنم.
    شما باید ببینید غیر از اسم و ایندکس دیگه چه صفت هایی توی ورودی شما هست.
    برای مثال از طریق tag, class, id و... که باید ببینید بستگی به شرایطتون کدوم مناسب تر هست.
    اگر میتونید کد html اون بخش رو ارسال کنید تا من بیشتر بررسی کنم.
    موفق باشید.
  • با سلام
    من در حال نوشتن یک برنامه برای خودکارسازی فرآیند پر کردن فرم ها در اینترنت هستم.
    دستور اولیه من به شکل زیر است
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    username="rahbar"
    password="password"
    options = webdriver.ChromeOptions()
    options.add_argument(r"C:\Users\s.kalantari\AppData\Local\Google\Chrome\User Data\Default") #Path to your chrome profile

    print("something befor scrap")
    driver = webdriver.Chrome()

    driver.get("https://plp.irbroker.com/index.do")


    time.sleep(100) #waits 100 seconds
    driver.maximize_window()
    driver.find_element("name", "j_username").send_keys(username)

    driver.find_element_by_name( name="j_password" ).send_keys(password)
    print("something after scrap")
    وقتی دستور را اجرا می کنم بسیار کند اجرا می شود و متن زیر در خط فرمان به نمایش در می آید:
    something berfor scrap

    DevTools listening on ws://127.0.0.1:57315/devtools/browser/fd73344f-c857-439e-b20c-c0e76d39f389
    Created TensorFlow Lite XNNPACK delegate for CPU.
    Attempting to use a delegate that only supports static-sized tensors with a graph that has dynamic-sized tensors (tensor#58 is a dynamic-sized tensor).
    something after scrap
    PS C:\Users\s.kalantari>
    دستورهای .send_keys هم اجرا نمی شوند و چیزی در جعبه های صفحات باز شده نمی نویسند.
    در صورت امکان، در مورد این موضوع مرا راهنمایی کنید.
    پاسخ:
    سلام دوست عزیز.
    مشکل شما در بخشی هست که از دستور time.sleep(100) استفاده کردید این دستور باعث میشه که در کد شما ۱۰۰ ثانیه وقفه بیفته! کلا وقفه رو کم کنید یا که از WebDriverWait استفاده کنید.
    اگر باز هم به راهنمنایی نیاز داشتید خوشحال میشم بتونم کمک کنم.
    موقق باشید.
  • Mohammad Mahyar Pourabdollah Khadar
    سلام من کد رو وارد می کنم فقط سایت گیت هاب و قسمت لاگین واسم باز میشه و یوزر و پسورد رو نمی خونه که وارد پیج من بشه با اینکه طبق توضیجات شما یوزر نیم و پسورد خودم رو در کد قرار دادم
    میشه راهنمایی کنید
    ممنون
    پاسخ:
    سلام دوست عزیز
    کد کاملا تست شده و کار میکنه.
    میتونین کد کامل و هر ارور احتمالی رو برای ایمیل farbodmblog@gmail.com ارسال کنین تا من بررسی کنم.
    ضمنا از این که driver شما به درستی کار میکنه هم مطمئن بشین.
    موفق باشید.
  • سلام خیلی عالی بود لطفاً از این سری آموزش ها بیشتر بزارین خدا قوت
    پاسخ:
    سلام دوست عزیز 
    حتما
    موفق باشید‌
  • سلام
    آموزش هاتون فوق‌العاده هستن
    کاملا مشخصه که برای آموزش برنامه ها خیلی وقت میذارید و زحمت میکشید
    سپاس از شما
    پاسخ:
    خیلی ممنون دوست عزیز
    موفق باشید
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی