التصنيفات
الترميز

هل من الممكن التحقق تلقائيًا من حالة Instagram F4F (متابعة)؟

أهلا.

أنا أيضًا أجرب أشياء مختلفة أثناء دراسة الزحف لأول مرة.

هذه المرة ، أود تطبيقه على Instagram ، أحد أشهر مواقع التواصل الاجتماعي مؤخرًا.

لجعل الأمر ممتعًا ، أحاول القيام بما يلي باستخدام القليل من علم النفس البشري.

ماذا عنها؟ لا تريد المحاولة 🙂

في بعض الأحيان يتوقف الناس عن ملاحقتي. TT

الآن ، دعنا نفعل ذلك خطوة بخطوة.

استيراد الوحدات المطلوبة

import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup

تقوم وحدة webdriver الخاصة بحزمة السيلينيوم بتشغيل مستعرض ويب وتسمح لك بتنفيذ الإجراءات وفقًا لأوامر البرنامج النصي ، وتحتوي الوحدة النمطية BeautifulSoup في حزمة bs4 على وظيفة تتيح لك استخراج المحتويات المرغوبة بسهولة من بيانات HTML DOM.

في حالة عدم وجود حزم السيلينيوم و bs4 ، قم بتثبيتها عن طريق إدخال ما يلي في نافذة الأوامر.

pip install bs4
pip install selenium

ويمكن تنزيل محرك الويب Chrome من الرابط أدناه.

https://sites.google.com/a/chromium.org/chromedriver/downloads

الباقي عبارة عن وحدات نمطية أساسية ، لذا يمكنك استيرادها واستخدامها على الفور.

سجّل الدخول إلى Instagram

افتح الآن متصفح Chrome وحاول تسجيل الدخول عن طريق الوصول إلى عنوان Instagram.

لنأخذ المدخلات مباشرة من نافذة الأوامر.

على سبيل المثال ، افترض أنك كتبت ما يلي في نافذة الأوامر.

python crawling_instagram.py sangminem 123456

حيث يصبح sys.argv [0] crawling_instagram.py ، يصبح sys.argv [1] sangminem و sys.argv [2] يصبح 123456.

دعنا نستخدم هذا لكتابة رمز لتسجيل الدخول إلى Instagram كما هو موضح أدناه.

browser = webdriver.Chrome('./chromedriver')
browser.get('https://www.instagram.com/'+sys.argv[1])
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(2)
browser.find_element_by_name('username').send_keys(sys.argv[1])
browser.find_element_by_name('password').send_keys(sys.argv[2])
browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/div[3]/button').submit()
time.sleep(5)
browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/button').click()

فتحت متصفح الويب Chrome باستخدام chromedriver ومتصلًا من خلال الجمع بين عنوان Instagram واسم المستخدم.

قمت بالنقر فوق زر المتابع باستخدام browser.execute_script لفتح نافذة تسجيل الدخول.

(إذا نقرت فوق عندما لا تكون مسجلاً للدخول ، فسيتم عرض نافذة تسجيل الدخول.)

بعد ذلك ، انتظرت لمدة ثانيتين في حال كان التحميل أطول.

بعد ذلك ، يبحث نوع الإدخال عن أجزاء اسم المستخدم وكلمة المرور ، ويتم استخدام طريقة send_keys لإدخال اسم المستخدم وكلمة المرور.

ووجدت زر تسجيل الدخول في النموذج مع xpath ويسمى طريقة الإرسال.

يمكنك الحصول على xpath بالنقر بزر الماوس الأيمن على العنصر الذي تريد البحث عنه في علامة تبويب العناصر الخاصة بالمطور ، والتي تظهر عند الضغط على F12 في Chrome ، وتحديد نسخ> نسخ xpath.

انتظر 5 ثوان لتسجيل الدخول التالي.

هذا هو الكود الذي كتبته للنقر فوق الزر Do لاحقًا باستخدام xpath مرة أخرى.

نظرًا لأنه سيتم تخطي هذا الجزء ببساطة ، فسيتم حذف الشرح التفصيلي.

احصل على قائمة المتابعين

الآن بعد اكتمال تسجيل الدخول ، دعنا نطبق المنطق للحصول على عدد المتابعين.

time.sleep(2)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followers = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followers_text = []
for follower in followers:
    followers_text.append(follower.get_text())
print("Number of followers: " + str(len(followers_text)))

بعد الانتظار لمدة ثانيتين مرة أخرى لمنع حدوث خلل ، قمت بالنقر فوق بارتون التابع مرة أخرى.

وهذا هو الجزء الذي ينتظر لمدة ثانية واحدة ويحصل على اسم مستخدم التابع بشكل جدي.

نظرًا لأننا نحتاج إلى الحصول على جميع المتابعين أولاً ، فقد طبقنا المنطق لخفض التمرير بشكل متكرر من أجل تحميل الجميع من خلال بيان while.

إذا كان ارتفاع التمرير القديم مختلفًا عن ارتفاع التمرير الجديد ، فهذا يعني أن هناك المزيد للتحميل ، لذا فهذه البنية التي تستمر في التكرار حتى يتطابق ارتفاع التمرير القديم مع ارتفاع التمرير الجديد.

اسم الفئة ، وهو قيمة وسيطة أسلوب querySelectorAll ، هو القيم التي يتم عرضها واستيرادها مباشرة من علامة التبويب عناصر وضع المطور.

بعد التحميل ، قم باستيراد بيانات html من خلال وحدة BeautifulSoup ، وتحقق من العلامات والفئات بأسماء المستخدمين ، واستخرجها جميعًا وضعها في مصفوفة.

حصلت على طول المصفوفة بطريقة الطباعة وطبع عدد المتابعين على الشاشة.

احصل على القائمة التالية الخاصة بك

بعد ذلك ، دعنا نحصل على عدد المتابعين.

browser.find_element_by_xpath('/html/body/div[4]/div/div/div[1]/div/div[2]/button').click()
time.sleep(0.5)
browser.execute_script("document.querySelectorAll('.-nal3')[2].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followings = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followings_text = []
for following in followings:
    followings_text.append(following.get_text())
print("Number of followings: " + str(len(followings_text)))

انقر فوق زر الإغلاق باستخدام xpath لإغلاق نافذة المتابعين.

ثم انتظرت نصف ثانية وقمت بالنقر فوق الزر التالي.

ثم انتظرت ثانية واحدة مرة أخرى وحصلت على اسم المستخدم الذي كنت أتبعه.

نمط الحصول على اسم مستخدم تابع مشابه تقريبًا ، لذلك لن أخوض في هذا مرة أخرى.

احصل على الأشخاص الذين تتابعهم فقط

أخيرًا ، دعنا نقارن قائمة أسماء المستخدمين التابعين لقائمة أسماء المستخدمين التالية للعثور على غير المتابعين.

result = []
for following in followings_text:
    cnt = 0
    for follower in followers_text:
        if following == follower:
            cnt += 1
            break
    if cnt == 0:
        result.append(following)
print('List of people who did not F4F: '+str(result))

استنادًا إلى اسم المستخدم التالي ، قمنا بفحص قائمة جميع أسماء المستخدمين المتابعين واحدًا تلو الآخر ، وتم عدها إذا كان هناك ، وقمنا بتنفيذ المنطق بشكل متكرر للخروج.

إذا كان العد 0 ، فهذا يعني أنني أتابع ولكن ليس في قائمة المتابعين ، لذلك لم أقم F4F وقم بإضافته إلى مصفوفة النتائج.

أخيرًا ، يؤدي إخراج المصفوفة الناتجة إلى تحقيق الغرض المطلوب.

تماما مثل هذا.

تابعت لكنك لم تفعل؟ ㅠ

كمرجع ، أنا أتابع معارفي فقط ، لذلك لا يوجد الكثير من الأشخاص الذين لا يتبعونني.

لقد خدم غرضه ببساطة.

تقاسم المصدر الكامل

إذا أراد أي شخص ذلك ، يرجى مشاركته.

import time
import sys
from selenium import webdriver
from bs4 import BeautifulSoup
username = sys.argv[1]
browser = webdriver.Chrome('./chromedriver')
browser.get('https://www.instagram.com/'+username)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(2)
browser.find_element_by_name('username').send_keys(sys.argv[1])
browser.find_element_by_name('password').send_keys(sys.argv[2])
browser.find_element_by_xpath('//*[@id="loginForm"]/div[1]/div[3]/button').submit()
time.sleep(5)
browser.find_element_by_xpath('//*[@id="react-root"]/section/main/div/div/div/div/button').click()
time.sleep(5)
if len(sys.argv) > 3:
    username = sys.argv[3]
print('Account: ' + username)
browser.get('https://www.instagram.com/'+username)
time.sleep(2)
browser.execute_script("document.querySelectorAll('.-nal3')[1].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('.jSC57')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('.jSC57')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followers = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followers_text = []
for follower in followers:
    followers_text.append(follower.get_text())
print("Number of followers: " + str(len(followers_text)))
browser.find_element_by_xpath('/html/body/div[4]/div/div/div[1]/div/div[2]/button').click()
time.sleep(0.5)
browser.execute_script("document.querySelectorAll('.-nal3')[2].click();")
time.sleep(1)
oldHeight = -1
newHeight = -2
while oldHeight != newHeight:
    oldHeight = newHeight
    newHeight = browser.execute_script("return document.querySelectorAll('._aano')[0].scrollHeight")
    browser.execute_script("document.querySelectorAll('.isgrP')[0].scrollTo(0,document.querySelectorAll('._aano')[0].scrollHeight)")
    time.sleep(0.5)
soup = BeautifulSoup(browser.page_source, 'html.parser')
followings = soup.findAll('a',['FPmhX','notranslate','_0imsa'])
followings_text = []
for following in followings:
    followings_text.append(following.get_text())
print("Number of followings: " + str(len(followings_text)))
result = []
for following in followings_text:
    cnt = 0
    for follower in followers_text:
        if following == follower:
            cnt += 1
            break
    if cnt == 0:
        result.append(following)
print('List of people who did not F4F: '+str(result))

نراكم في المرة القادمة بموضوع آخر. 🙂

(تحذير) يمكن تغيير اسم الفئة من وقت لآخر ، لذلك إذا لم يعمل البرنامج ، فقد تضطر إلى اكتشاف بنية علامة Instagram بنفسك لإصلاحها.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني.

arالعربية