如何使用 Python 從 Instagram 抓取數據
已發表: 2018-10-27如果全鎮都在談論視頻,它必須在 YouTube 上;如果全鎮都為一篇文章發瘋,它必須在 Facebook 上;如果全鎮都在討論最新照片,他們只需要在 Instagram 上。 以下是如何抓取 Instagram 數據
Instagram 成立於 2010 年,現已成為全球最大的照片分享應用,其網站功能在 Alexa 排名前 15 的網站中排名最高。 從僅 1×1 圖片上傳限制的早期開始,Instagram(被大多數人親切地稱為“insta”)已經走過了漫長的道路。 如今,您可以在 Instagram 上上傳幾乎任何媒體,包括一組照片、視頻、配音等等。 然而,Instagram 上最受歡迎的東西是名人資料和主題標籤。 事實上,維基百科列出了一些頂級的 Instagram 個人資料——全球關注者最多的個人資料。 每天都有數百萬追隨者查看他們的帖子。 同時,標籤是 Instagram 的另一個重要功能。 他們創建了一組相似的圖像,因此如果有人在 Instagram 中搜索主題標籤,他們一定會找到具有相似性或文字聯繫的圖像。 一個簡單的例子——“#hot”可能會讓你看到燃燒、著火的圖像以及認為自己很有吸引力的人的圖像。
如何抓取 Instagram 數據
因此,今天我們將研究從 Instagram 抓取數據,更具體地說,是從 Instagram 頁面抓取數據。 我們還將抓取一些頂級 Instagram 個人資料的關注者數量、關注人數和帖子數量。 我們將使用帶有配置文件鏈接的文本文件來完成任務。 您可以將更多配置文件添加到列表中,該程序還將打印您粘貼的新鏈接的詳細信息。
其次,我們將抓取數據並將其保存到文本文件中,即帶有給定主題標籤的圖像鏈接,由您提供。 在這裡,我們還將有一個存儲在文本文件中的單詞列表,我們將在 python 中讀取該列表,並且對於每個單詞,我們將執行 #word 並在 Instagram 中搜索並獲取與主題標籤關聯的圖像的鏈接。
這兩項活動都會有一定的限制,例如您無法獲取私人資料的詳細信息,並且只會下載一定數量的鏈接(Instagram 有上限)。
像往常一樣,在我們開始之前,我將再次要求您查看此鏈接並設置 python,並安裝文本編輯器。 我更喜歡 atom,如果您點擊鏈接,您將獲得鏈接以及如何下載和安裝它的步驟。 還按照要求安裝使用 pip 提到的 python 包。 如果我要求您安裝更多軟件包,這些可以在旅途中完成。
提取頂級 Instagram 用戶的 Instagram 數據
因此,深入了解代碼,這裡是給定程序的鏈接。 我們基本上所做的是,從給定的文本文件中讀取鏈接,為每個鏈接提取的 html 創建一個 beautifulsoup 對象,並從 URL 中提取一些特定信息。 這是我們使用的文本文件的鏈接。 這些是維基百科中提到的一些頂級用戶。 雖然我從 Wikipedia 手動複製了鏈接,但也可以通過抓取來完成,但我將把它留給另一篇 DIY 文章。
[代碼語言=“python”]
#!/usr/bin/python
# -*- 編碼:utf-8 -*-
導入請求
導入 urllib.request
導入 urllib.parse
導入 urllib.error
從 bs4 導入 BeautifulSoup
導入 ssl
導入json
Insta_Info_Scraper 類:
def getinfo(自我,網址):
html = urllib.request.urlopen(url, context=self.ctx).read()
湯 = BeautifulSoup(html, 'html.parser')
數據 = soup.find_all('meta', attrs={'property': 'og:description'
})
text = data[0].get('content').split()
用戶 = '%s %s %s' % (text[-3], text[-2], text[-1])
追隨者=文本[0]
以下=文本[2]
帖子=文本[4]
打印('用戶:',用戶)
打印('追隨者:',追隨者)
打印('以下:',以下)
打印('帖子:',帖子)
打印 (' - - - - -')
定義主要(自我):
self.ctx = ssl.create_default_context()
self.ctx.check_hostname = False
self.ctx.verify_mode = ssl.CERT_NONE
使用 open('users.txt') 作為 f:
self.content = f.readlines()
self.content = [x.strip() for x in self.content]
對於 self.content 中的 url:
self.getinfo(url)
如果 __name__ == '__main__':
obj = Insta_Info_Scraper()
obj.main()
[/代碼]
將程序和文本文件保存在同一文件夾中並運行命令後-
python insta_info_scraper.py,這將出現在命令提示符中-
[代碼語言=“python”]
H:Python_Algorithmic_ProblemsScraping_assignmentsInstagram-Data-Extractor>python insta_info_scraper.py
用戶:賽琳娜·戈麥斯 (@selenagomez)
追隨者:144.1m
關注:49
帖子:1,468
—————————
用戶:克里斯蒂亞諾·羅納爾多 (@cristiano)
追隨者:143.1m
關注:416
帖子:2,366
—————————
用戶:阿麗亞娜格蘭德(@arianagrande)
追隨者:130.5m
關注:1,348
帖子:3,669
—————————
用戶:泰勒斯威夫特 (@taylorswift)
追隨者:112.1m
關注:0
帖子:233
—————————
用戶:<img draggable=”false” data-mce-resize=”false” data-mce-placeholder=”1″ data-wp-emoji=”1″ class=”emoji” alt=”👻” src=”https://sworg/images/core/emoji/11/svg/1f47b.svg”> neymarjr (@neymarjr)
追隨者:103.4m
關注:817
帖子:4,263
—————————
用戶:賈斯汀比伯(@justinbieber)
追隨者:102.5m
關注:92
帖子:4,367
—————————
[/代碼]
儘管這是命令提示符輸出,但您可以使用以下命令將詳細信息保存到文本文件中:
python insta_info_scraper.py > info.txt
這將導致輸出轉到文本文件,或者更好的是,您可以將其全部保存到 json。 現在,如何創建一個包含所有這些信息的 json 文件? 我將在下面展示:
[代碼語言=“python”]
#!/usr/bin/python
# -*- 編碼:utf-8 -*-
導入請求
導入 urllib.request
導入 urllib.parse
導入 urllib.error
從 bs4 導入 BeautifulSoup
導入 ssl
導入json
Insta_Info_Scraper 類:
def getinfo(自我,網址):
html = urllib.request.urlopen(url, context=self.ctx).read()
湯 = BeautifulSoup(html, 'html.parser')
數據 = soup.find_all('meta', attrs={'property': 'og:description'
})
text = data[0].get('content').split()
用戶 = '%s %s %s' % (text[-3], text[-2], text[-1])
追隨者=文本[0]
以下=文本[2]
帖子=文本[4]
信息={}
信息[“用戶”] = 用戶
info[“關注者”] = 關注者
信息[“關注”] =關注
信息[“帖子”] =帖子
self.info_arr.append(信息)

定義主要(自我):
self.ctx = ssl.create_default_context()
self.ctx.check_hostname = False
self.ctx.verify_mode = ssl.CERT_NONE
self.info_arr=[]
使用 open('users.txt') 作為 f:
self.content = f.readlines()
self.content = [x.strip() for x in self.content]
對於 self.content 中的 url:
self.getinfo(url)
使用 open('info.json', 'w') 作為輸出文件:
json.dump(self.info_arr, outfile, indent=4)
print(“已創建包含所需信息的 Json 文件…………”)
如果 __name__ == '__main__':
obj = Insta_Info_Scraper()
obj.main()
[/代碼]
當您運行此代碼時,您只會看到一個正在打印的語句 -
[代碼語言=“python”]
H:Python_Algorithmic_ProblemsScraping_assignmentsInstagram-Data-Extractor>python insta_info_scraper_json_format.py
創建包含所需信息的 Json 文件…………
[/代碼]
但是,與此同時,會在您的文件夾中創建一個名為info.json的 json 文件-
json 看起來像這樣-
[代碼語言=“python”]
[
{
“用戶”:“賽琳娜·戈麥斯 (@selenagomez)”,
“追隨者”:“144.1m”,
“以下”:“49”,
“帖子”:“1,468”
},
{
“用戶”:“克里斯蒂亞諾·羅納爾多(@cristiano)”,
“追隨者”:“143.1m”,
“以下”:“416”,
“帖子”:“2,366”
},
{
“用戶”:“Ariana Grande (@arianagrande)”,
“追隨者”:“130.5m”,
“以下”:“1,348”,
“帖子”:“3,669”
},
{
“用戶”:“泰勒·斯威夫特 (@taylorswift)”,
“追隨者”:“112.1m”,
“以下”:“0”,
“帖子”:“233”
},
{
“用戶”:“ud83dudc7b neymarjr (@neymarjr)”,
“追隨者”:“103.4m”,
“關注”:“817”,
“帖子”:“4,263”
},
{
“用戶”:“賈斯汀比伯(@justinbieber)”,
“追隨者”:“102.5m”,
“以下”:“92”,
“帖子”:“4,367”
}
[/代碼]
您可以看到數據是相同的,但它的格式更易於管理和使用。 我們所做的只是以不同的格式存儲提取的數據。 但是想像一下,如果您正在編寫一個程序或創建一個應用程序,它將使用從一千個 Instagram 個人資料中提取的數據,那麼哪種類型的數據結構更容易在您的代碼中使用? 一個json文件,還是一個文本文件? 數據清理經常被忽視,但卻是非常重要的一步。 事實上,許多數據科學家已經承認,儘管他們確實從事複雜的模型和模擬工作,但數據提取、清理和重新排列幾乎佔了他們工作的 70%。 現在,您一定已經詳細了解瞭如何抓取 Instagram 數據。
提取給定標籤的圖像鏈接
圖片不是來自名人帳戶的信息,而是 Instagram 的主要資源。 還有什麼比使用 Instagram 主題標籤和下載具有特定主題標籤的圖像更好的方法是讓圖像形成集群並建立機器學習模型。
這是下面給出的代碼 -
[代碼語言=“python”]
#!/usr/bin/python
# -*- 編碼:utf-8 -*-
導入請求
導入 urllib.request
導入 urllib.parse
導入 urllib.error
從 bs4 導入 BeautifulSoup
導入 ssl
導入json
Insta_Image_Links_Scraper 類:
def getlinks(self, hashtag, url):
html = urllib.request.urlopen(url, context=self.ctx).read()
湯 = BeautifulSoup(html, 'html.parser')
script = soup.find('script', text=lambda t:
t.startswith('window._sharedData'))
page_json = script.text.split('=', 1)[1].rstrip(';')
數據 = json.loads(page_json)
print ('用#刮掉鏈接' + hashtag+”…………..”)
用於發布數據['entry_data']['TagPage'][0]['graphql'
]['hashtag']['edge_hashtag_to_media']['edges']:
image_src = post['node']['thumbnail_resources'][1]['src']
hs = open(hashtag + '.txt', 'a')
hs.write(image_src + 'n')
hs.close()
定義主要(自我):
self.ctx = ssl.create_default_context()
self.ctx.check_hostname = False
self.ctx.verify_mode = ssl.CERT_NONE
使用 open('hashtag_list.txt') 作為 f:
self.content = f.readlines()
self.content = [x.strip() for x in self.content]
對於 self.content 中的主題標籤:
self.getlinks(標籤,
'https://www.instagram.com/explore/tags/'
+ 主題標籤 + '/')
如果 __name__ == '__main__':
obj = Insta_Image_Links_Scraper()
obj.main()
[/代碼]
對於該程序,我們使用了幾個主題標籤的文本文件,即野馬、自然、耐克、足球和國際足聯,其中一些詞是隨機選擇的。 您可以更改文本文件中的單詞或添加一些新單詞,它們將用於形成主題標籤,並且還將下載它們的圖像鏈接。
當您運行給定的程序時,這就是您將在命令提示符中看到的內容 -
[代碼語言=“python”]
H:Python_Algorithmic_ProblemsScraping_assignmentsInstagram-Data-Extractor>python insta_image_link_scraper.py
使用#mustang 抓取鏈接…………
使用#nature 抓取鏈接…………
使用#nike 抓取鏈接…………..
使用#football 抓取鏈接…………..
使用#fifa 抓取鏈接…………
[/代碼]
同時,您會看到在當前文件夾中創建了 5 個文件-
Mustang.txt、nature.txt、nike.txt、football.txt、fifa.txt
由於安全原因,我沒有上傳為我生成的這些文件的鏈接,當然,當你運行程序時,你會得到一組不同的鏈接——與主題標籤相關的最新鏈接。 現在,您一定已經詳細了解瞭如何抓取 Instagram 數據。
為什麼要努力?
現在你可能會想,為什麼要努力,為什麼不在我需要的時候從谷歌下載一些圖片。 好吧,這取決於您要達到的目標。 如果您的文章需要少量圖片,您可以使用谷歌圖片。 但是,如果您想獲取與某個事件、某個人或其他事物相關的所有圖像,您可以嘗試使用主題標籤從 Instagram 獲取圖像。 這樣,您將獲得大量圖像,您可以從中編寫程序以刪除相同和相似的圖像,然後將帶有文本的圖像和不帶文本的圖像分開,然後適當地使用這兩種類型的圖像進行分析。
從 SURF 和 SIFT(兩種最好的圖像處理算法)開始,圖像識別和圖像處理技術在過去幾年中不斷發展。 超速行駛的汽車,運動感應相機都使用圖像進行推理。 借助 Instagram 幾乎無限量的圖像供應,您的研究項目可能會大有幫助。 現在,您一定已經詳細了解瞭如何抓取 Instagram 數據。
如何將抓取系統與您的業務集成?
根據您的要求從 Instagram 之類的網站上抓取數據可能最終會成為一項令人厭煩的任務,並且會讓您的注意力從很多重要的事情上轉移,例如您的業務。 如果沒有經驗豐富的 R 和 Python 開發人員,您可能需要幾個月的時間來構建一個完整的系統,該系統將根據您的確切要求從 Instagram 獲取數據,因為該網站具有很高的安全性,並且會不斷更改其佈局。 對於完整的解決方案,您應該聯繫經驗豐富的網絡抓取團隊,例如 PromptCloud。 您需要做的就是向我們提供您的要求,然後您將獲得適合您業務的格式的數據。 這可以節省您的時間、精力、金錢和人力,讓您在我們擔心技術的同時應對更艱鉅的業務挑戰。 現在,您一定已經詳細了解瞭如何抓取 Instagram 數據。
在提取 Web 數據方面需要幫助?
通過我們的網絡抓取服務,從用於業務應用程序的網站獲取乾淨且隨時可用的數據。
免責聲明:本教程中提供的代碼僅用於學習目的。 我們不對它的使用方式負責,也不對源代碼的任何有害使用承擔任何責任。
