افزایش فالوورهای اینستاگرام با ربات پایتون — راهنمای کاربردی
رشد مخاطبان در شبکههای اجتماعی کاری پر هزینه و پرمشقت است. انجام این کار برای افرادی که تمایل به افزایش جمعیت مخاطبانی با زمینه فعالیت مرتبط و علایق مشترک با خود دارند، دشوارتر نیز میشود. «فابیو نِوِس» (Fábio Neves) در مطلبی با عنوان «Increase your Instagram followers with a simple Python bot»، به موضوع چگونگی افزایش فالوورهای اینستاگرام می پردازد. نسخه فارسی این مطلب در ادامه ارائه شده است.
اینستاگرام همواره گزینه خوبی برای تبلیغ تصاویر است، اما گاه جمعیت فالوورهای فرد بسیار کم است. از این رو، بسیاری از افرادی که زمانی را به ارسال مطلب به صورت منظم در اینستاگرام اختصاص میدهند، پس از مدتی انگیزهای برای فعالیت به شکل منظم و برنامهریزی شده ندارند.
هدف این مطلب، ساخت جمعیت بزرگتری از مخاطبان برای یک حساب کاربری اینستاگرام است، که ممکن است منجر به افزایش ترافیک وبسایت فرد نیز بشود.
نرمافزارهای گوناگونی برای ردگیری کردن افرادی که فرد را در اینستاگرام آنفالو میکنند وجود دارد. یک سال پیش، هنگامی که جمعیت فالوورهای اینستاگرام شخصیم به دلایل مبهمی به ناگهان ریزش کرد، یکی از این برنامهها را نصب کردم. پس از اندکی پژوهش، متوجه شدم که برخی از کاربران برای افزایش فالوور «خزش» (crawl) میکنند. آنها تنها با انگیزه دنبال شدن متقابل (follow back)، به ارسال «نظر» (کامنت | Comment)، لایک و دنبال کردن افراد میپردازند.
نمیتوانم بگویم موضوع وجود رباتها در اینستاگرام من را شگفت زده کرد، بلکه تنها موجب شد من هم یک ربات برای خودم بسازم.
به همین دلیل، این مطلب را نوشته و در آن شیوه کار خودم را شرح دادم. رباتی که برای این کار ساختهام به زبان برنامهنویسی پایتون و در «چارچوب آزمون-نرمافزار» (Software-Testing Framework) «سلنیوم» (Selenium) نوشته شده است.
به طور ایدهآل، افزایش مخاطبان اینستاگرام موجب میشود من انگیزه لازم برای ارسال مطالب به طور منظم را داشته باشم. به عنوان یک حرکت دیگر در همین راستا، آدرس وبسایت خودم را نیز که مردم میتوانند در آنجا کارهای عکاسیم را خریداری کنند، در قسمت بیوگرافی پروفایلم قرار دادم.
ساخت ربات اینستاگرام با پایتون
پس از اندکی فکر کردن پیرامون این پروژه، هدف نهایی افزایش تعداد مخاطبان مرتبط تعیین شد. من میخواهم دنبالکنندگانی را به دست بیاورم که تمایل به فالو کردن و مشاهده نمونه کارهایم دارند. پرداختن به این موضوع با استفاده از هشتگها کار سادهتری بود، بنابراین ربات را به گونهای تنظیم کردم که به دنبال هشتگهای خاصی بگردد و با تصاویر موجود در آنها تعامل برقرار کند.
بدین شکل، میتوانستم مشخصا به این موضوع بپردازم که میخواهم مخاطبانم چه نوع علاقمندیهایی داشته باشند. برای مثال، من به عکاسی «نوردهی طولانی» (Long-exposure) علاقمند هستم، بنابراین میتوانم افرادی را هدف بگیرم که از این هشتگ استفاده کردهاند و مخاطبانی پیرامون این نوع از محتوا برای خودم بسازم. ساده و موثر!
گالری من ترکیبی از موضوعات و سبکهای مختلف از عکاسی خیابانی گرفته تا هوایی است و برخی از تصاویر نیز مربوط به سفر هستند. با توجه به اینکه «لیسبون» (Lisbon) شهر مادری من است، تعداد زیادی تصویر هم از آنجا گذاشتهام. اینها موضوعات کلیدی هستند که من به هشتگهایی که قصد هدفگیری آنها را دارم مورد استفاده قرار میدهم.
این ربات از مدل رباتهای «دریافت ۱۰۰۰ فالور در ۲۴ ساعت» نیست!
رباتی که آموزش ساخت آن در اینجا ارائه شده روی هشتگهای گوناگونی مانند «lisbon» ،«travelgram» ،«travelblogger» و «dronephotography» اجرا شده است. با استفاده از این ربات، تعداد فالوورهای من طی سه روز از ۳۸۰ به ۸۰۰ رسیده. لایکها، نظرات و همچنین مقداری رشد طبیعی (افرادی که من را فالو کردهاند اما توسط ربات دنبال نشدهاند) به وقوع پیوسته است.
لازم به ذکر است که از این ربات بیش از اندازه استفاده نکردهام، زیرا، در صورت فعالیت خیلی سریع و زیاد، اینستاگرام پاسخگویی به ربات را متوقف میکند. بنابراین نیاز به تعدادی دستور «sleep» در میان اقدامات در حال انجام توسط بات است، زیرا پس از ارسال تعدادی نظر و دنبال کردن چند نفر در بازه زمانی کوتاهی، اینستاگرام پاسخگویی به ربات را متوقف کرده و بات از کار میافتد.
از آنجا که فرد به اکانت خود وارد میشود، تقریبا اطمینان دارم که در صورت سرعت بخشیدن به فرآیند، اینستاگرام میتواند بفهمد که کاربر در حال انجام کاری عجیب و غریب است. مهمتر از همه آنکه، برای برخی از هشتگها پیدا کردن کاربران جدید که از هشتگ مشابهی استفاده کرده باشند کار دشواری است. در این راستا نیاز به آن است که چند روز زمان به تازهسازی پایگاه کاربری داده شود.
موثرترین راه برای جلب دنبالکننده در اینستاگرام (فارغ از بحث ارسال تصاویر خوب)، دنبال کردن (Follow) افراد جدید است. برای شخص من اهمیتی نداشت که برای به دست آوردن ۴۰۰ فالور، ۳۰۰۰۰ نفر را دنبال کنم (اما برخی افراد اصرار دارند که تعداد فالووینگهای آنها بسیار کم باشد). ربات، لیستی از همه کاربرانی که ضمن اجرای آن دنبال شدهاند را فراهم میکند. بنابراین میتوان در صورت تمایل اقدامات خاصی را نسبت به این لیست انجام داد.
برای مثال، میتوانم پروفایل آنها را مشاهده و ارزیابی کنم که چه تعداد دنبالکننده یا پست دارند و متعاقبا تصمیم بگیرم که آنها را دنبال کنم یا خیر. یا حتی میتوان اولین تصویر از گالری آنها را دریافت و بررسی کرد که آیا به روز هستند یا خیر تا مشخص شود که آیا کاربر فعال است یا نه. اگر اقدام «فالو کردن» از ربات حذف شود، میتوان اطمینان حاصل کرد که تعداد فالورها به سختی افزایش پیدا میکند، زیرا افراد کمتری صرفا به خاطر لایک و نظر کسی را دنبال میکنند.
چرا کد را به اشتراک میگذارم؟
این قول و قراری بین من و خودم است. من حقیقتا به خروجی دادن به جامعه معتقدم (در عین حال محتوای زیادی نیز از آن میآموزم). چندین پلتفرم پولی وجود دارند که کاری مشابه این پروژه انجام میدهند؛ برخی از آنها مشکوک هستند و برخی توسط افراد مشهور نیز مورد استفاده قرار میگیرند. احتمال آغاز یک پلتفرم مشابه توسط خود من نیز منتفی نیست. پس چرا کدم را به صورت عمومی منتشر میکنم؟
با در نظر داشتن این موضوع، تصمیم گرفتم که سطح سختی دیگری به فرآیند انتشار کد اضافه کنم. بنابراین، قصد داشتم کد را به صورت فایل تصویر ارسال کنم. اما، متوجه شدم تصویری که ارسال میکنم بیکیفیت است. بنابراین با انجام بازنگری در این موضوع، تصمیم گرفتم خود کد را ارسال کنم. ایده ارسال تصویر به این دلیل شکل گرفت که افرادی که واقعا قصد دارند از کد استفاده کنند، دستکم آن را تایپ کنند.
این محدودیتی بود که من قصد داشتم روی این ابزار برای استفاده عموم قرار دهم تا افراد این پروژه را بازنویسی کنند و در صورت امکان بهبود ببخشند. شخصا، هر بار که کد را به جای کپی/پیست کردن اسکریپت، خودم مینویسم چیزهای زیادی میآموزم. امیدوارم دیگران نیز چنین حسی داشته باشند! این اسکریپت خیلی هم پیچیده نیست و راههای بسیاری برای بهبود آن وجود دارد، اما در حال حاضر همین کد کار میکند.
نکاتی پیرامون کدنویسی این پروژه
برای نوشتن این کد از پایتون (نسخه ۳.۷)، سلنیوم، یک مرورگر وب (کروم | Chrome) و البته اکانت اینستاگرام استفاده شده است. چشمانداز کوتاهی از کاری که ربات ارائه میکند در زیر وجود دارد.
- باز کردن مرورگر و وارد شدن به اکانت اینستاگرام فرد
- برای هر هشتگ در لیست هشتگها، ربات یک صفحه را باز و اولین تصویر موجود در آن را کلیک میکند تا باز شود.
- در ادامه، ربات به لایک، دنبال کردن و نظردهی برای تصویر دارای هشتگ موجود در لیست هشتگها پرداخته و به تصویر بعدی میرود. این کار در یک حلقه تکرار ۲۰۰ تایی انجام میشود (عدد قابل تنظیم است).
- لیستی با همه کاربرانی که فرد فالو میکند را با استفاده از ربات ذخیره میکند.
کد مراحل بالا، در ادامه آورده شده است.
1import pandas as pd
2from selenium import webdriver
3from selenium.webdriver.common.keys import Keys
4from time import sleep, strftime
5from random import randint
6import pandas as pd
7
8chromedriver_path = 'C:/Users/User/Downloads/chromedriver_win32/chromedriver.exe' # Change this to your own chromedriver path!
9webdriver = webdriver.Chrome(executable_path=chromedriver_path)
10sleep(2)
11webdriver.get('https://www.instagram.com/accounts/login/?source=auth_switcher')
12sleep(3)
13
14username = webdriver.find_element_by_name('username')
15username.send_keys('your_username')
16password = webdriver.find_element_by_name('password')
17password.send_keys('your_password')
18
19button_login = webdriver.find_element_by_css_selector('#react-root > section > main > div > article > div > div:nth-child(1) > div > form > div:nth-child(3) > button')
20button_login.click()
21sleep(3)
22
23notnow = webdriver.find_element_by_css_selector('body > div:nth-child(13) > div > div > div > div.mt3GC > button.aOOlW.HoLwm')
24notnow.click() #comment these last 2 lines out, if you don't get a pop up asking about notifications
به منظور استفاده از کروم با سلنیوم، نیاز به نصب «کرومدرایور» (ChromeDriver) (+) است. این فرآیند بسیار ساده خواهد بود. برای این کار، ابتدا بایدChromeDriver را نصب و سپس مسیر موجود در کد بالا را با مسیر (Path) صحیح جایگزین کرد.
در سلول شماره ۳، باید رشتهها را با نام کاربری و گذرواژه آن جایگزین کرد. این کار برای آن است که ربات بتواند در فیلدهای نمایش داده شده اطلاعات را تایپ کند. ممکن است که برخی مخاطبان تاکنون متوجه شده باشند که هنگام اجرای سلول ۲، کروم یک تب جدید باز میکند. پس از گذرواژه، دکمه Login به عنوان یک «شی» (Object) تعریف شده و با خط کدی که در ادامه آمده روی آن کلیک میشود.
در پاسخ به افرادی که با این پرسش مواجه هستند که این رشتههای عجیب و غریب چیست، باید بگویم جای نگرانی وجود ندارد. این موارد در راستای خزش در یک صفحه وبسایت، برای «وارسی» (Inspecting) صفحه وب به منظور آن است که به ربات بگوید کجا را بررسی کند. این کار را میتوان به سادگی با کلیک راست روی عنصری که قصد نگاشت آن وجود دارد و انتخاب گزینه Inspect انجام داد.
پس از ورود به «حالت وارسی» (Inspect Mode)، تکه کد HTML که شامل چیزی است که قصد نگاشت آن وجود دارد را باید پیدا کرد. سپس روی آن کلیک راست کرده و آن را Copy کنید. همانطور که از تصویر نیز مشهود است، برای کپی کردن، چندین گزینه وجود دارند. ترکیبی از XPath و انتخابگرهای CSS در کد مورد استفاده قرار میگیرند (در قسمت find_element_ method قابل مشاهده هستند). انجام این کار برای دریافت همه منابع برای اجرا، مقداری زمان میبرد. در برخی نقاط، CSS یا مسیرهای xpath شکست میخورند، اما از آنجا که زمانهای sleep در نظر گرفته شده، همه چیز به آرامی آغاز به کار میکند.
در این مثال، من «copy selector» را انتخاب و آن را داخل find_element_ method کپی کردم (سلول شماره ۳). بدین شکل، اولین نتیجه یافت شده را نمایش میدهد. اگر _find_elements بود، همه عناصر بازیابی میشدند و کاربر میتوانست انتخاب کند که کدام را بگیرد.
پس از آنکه این کار انجام شد، نوبت حلقهها فرا میرسد. میتوان هشتگهای بیشتری را به hashtag_list اضافه کرد. اگر این کد برای اولین بار اجرا شود، همچنان فایلی با کاربرانی که دنبال شدهاند وجود نخواهد داشت، بنابراین میتوان prev_user_list را به سادگی به عنوان یک لیست خالی ساخت.
پس از آنکه این کار انجام شد، یک فایل csv حاوی کاربرانی که در آن زمان دنبال شدهاند و برچسبهای زمانی مربوط به زمان دنبال شدن آنها ایجاد میشود. این فایل در دومین اجرا به صورت prev_user_list است. پیگیری آنچه ربات انجام میدهد ساده و آسان است. به روز رسانی با آخرین برچسبهای زمانی در اجراهای بعدی انجام میشود و این کار مجموعهای از backlogها را برای هر اجرای ربات فراهم میکند.
1hashtag_list = ['travelblog', 'travelblogger', 'traveler']
2
3# prev_user_list = [] - if it's the first time you run it, use this line and comment the two below
4prev_user_list = pd.read_csv('20181203-224633_users_followed_list.csv', delimiter=',').iloc[:,1:2] # useful to build a user log
5prev_user_list = list(prev_user_list['0'])
6
7new_followed = []
8tag = -1
9followed = 0
10likes = 0
11comments = 0
12
13for hashtag in hashtag_list:
14 tag += 1
15 webdriver.get('https://www.instagram.com/explore/tags/'+ hashtag_list[tag] + '/')
16 sleep(5)
17 first_thumbnail = webdriver.find_element_by_xpath('//*[@id="react-root"]/section/main/article/div[1]/div/div/div[1]/div[1]/a/div')
18
19 first_thumbnail.click()
20 sleep(randint(1,2))
21 try:
22 for x in range(1,200):
23 username = webdriver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/article/header/div[2]/div[1]/div[1]/h2/a').text
24
25 if username not in prev_user_list:
26 # If we already follow, do not unfollow
27 if webdriver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/article/header/div[2]/div[1]/div[2]/button').text == 'Follow':
28
29 webdriver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/article/header/div[2]/div[1]/div[2]/button').click()
30
31 new_followed.append(username)
32 followed += 1
33
34 # Liking the picture
35 button_like = webdriver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/article/div[2]/section[1]/span[1]/button/span')
36
37 button_like.click()
38 likes += 1
39 sleep(randint(18,25))
40
41 # Comments and tracker
42 comm_prob = randint(1,10)
43 print('{}_{}: {}'.format(hashtag, x,comm_prob))
44 if comm_prob > 7:
45 comments += 1
46 webdriver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/article/div[2]/section[1]/span[2]/button/span').click()
47 comment_box = webdriver.find_element_by_xpath('/html/body/div[3]/div/div[2]/div/article/div[2]/section[3]/div/form/textarea')
48
49 if (comm_prob < 7):
50 comment_box.send_keys('Really cool!')
51 sleep(1)
52 elif (comm_prob > 6) and (comm_prob < 9):
53 comment_box.send_keys('Nice work :)')
54 sleep(1)
55 elif comm_prob == 9:
56 comment_box.send_keys('Nice gallery!!')
57 sleep(1)
58 elif comm_prob == 10:
59 comment_box.send_keys('So cool! :)')
60 sleep(1)
61 # Enter to post comment
62 comment_box.send_keys(Keys.ENTER)
63 sleep(randint(22,28))
64
65 # Next picture
66 webdriver.find_element_by_link_text('Next').click()
67 sleep(randint(25,29))
68 else:
69 webdriver.find_element_by_link_text('Next').click()
70 sleep(randint(20,26))
71 # some hashtag stops refreshing photos (it may happen sometimes), it continues to the next
72 except:
73 continue
74
75for n in range(0,len(new_followed)):
76 prev_user_list.append(new_followed[n])
77
78updated_user_df = pd.DataFrame(prev_user_list)
79updated_user_df.to_csv('{}_users_followed_list.csv'.format(strftime("%Y%m%d-%H%M%S")))
80print('Liked {} photos.'.format(likes))
81print('Commented {} photos.'.format(comments))
82print('Followed {} new people.'.format(followed))
این کد واقعا ساده است. افرادی که دانش اولیهای پیرامون پایتون دارند، میتوانند به سرعت آن را درک کنند.
عبارت چاپ شده درون حلقه، راهی است برای داشتن یک «tracker» که این امکان را فراهم میکند تا بدانم ربات در کدام تکرار قرار دارد. ربات، هشتگی که در آن است، تعداد تکرار و عدد تصادفی تولید شده عمل نظرگذاری (Comment) را پرینت میکند. من تصمیم گرفتم که در همه صفحات نظر نگذارم، بنابراین، سه نوع نظر مختلف و یک عدد تصادفی بین ۱ و ۱۰ را تعریف کردم که تعیین میکند نظری گذاشته شود یا خیر و اینکه کدام یک از سه نوع نظر ارسال شود. در پایان حلقه، new_followed users به «پایگاه داده» (Database) کاربران قبلی «الحاق» (Append) میشود و فایل جدید را با برچسب زمانی ذخیره میکند. شما همچنین باید یک گزارش کوتاه نیز دریافت کنید.
پس از چند ساعت، بدون استفاده از تلفن و گشت و گذار در اینستاگرام، تعداد فالورهایی که در تصویر قابل مشاهده است به فالورهای من اضافه شدهاند. در حدود ۴ روز اولی که شروع به تست این الگوریتم کردم، ۵۰۰ فالور جدید پیدا کردم و این یعنی من تعداد مخاطبانم را در چند روز دو برابر کردهام. اکنون کنجکاوم که بدانم چه تعداد از این فالوورها را طی روزهای آتی از دست خواهم داد تا مشخص شود چه میزان از این فالوورها پایدار هستند. همچنین، «لایک»های بیشتری نیز روی تصاویر جدیدم زده میشوند که البته انتظار آن میرفت.
اجرای این ربات روی سرور هم مناسب است، اما انجام آن نیاز به پیکربندی سرور دارد.
اگر نوشته بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون
- مجموعه آموزشهای برنامهنویسی
- مجموعه آموزشهای طراحی و توسعه پروژه های وب
- وب اسکرپینگ (Web Scraping) با پایتون و کتابخانه Beautiful Soup — راهنمای جامع
^^
سلام
یعنی تمام کد هایی که در تصویر هست به همین صورت تایپ کنم؟
سلام خسته نباشید ممنون میشم راهنمایی کنید.
از این خط ارور میده
prev_user_list = pd.read_csv(‘155_users_followed_list.csv’, delimiter=’,’).iloc[:,1:2]
باید به جز کد اول تنظیمات دیگه ای هم در سلنیوم انجام بدیم؟ من از همون اولین کد ارور میگیرم.
درود بر شما
از خط دوم ایراد میگیرد لطفا توضیحات کاملتری بفرمایید که چطور اجرا کنیم
prev_user_list = pd.read_csv(‘20181203-224633_users_followed_list.csv’, delimiter=’,’).iloc[:,1:2] # useful to build a user log
سپاس از سایت خوبتون
سلنیوم چیه و چطور نصب میشه؟ خیلی عالی میشد اگه یک ویدیو از این آموزش میزاشتین.
اگر مطلب ترجمس منبع اصلی هم قرار بدید.
درود
از شما برای ارائه بازخورد و پیگیری مطالب وبلاگ فرادرس سپاسگزارم. منبع اصلی کلیه مطالب وبلاگ فرادرس که به صورت ترجمه هستند در انتهای آنها درج شده است. منبع اصلی این مطلب نیز در پایان مطلب قرار گرفته است.
از همراهی شما با وبلاگ فرادرس سپاسگزارم.