python3 와 selenium 그리고 BeautifulSoup를 활용한 instagram crawling


바쁘신분들은 # [ SEARCH COMPLETE ] # 아래의 코드만 보셔도 무방합니다.

python3 와 selenium 그리고 BeautifulSoup를 활용하여 instagram crawling 중에 질문드립니다. selenium을 활용하여 원격으로 로그인과 검색을 하는것 까진 성공을 하였습니다.

허나 문제는 검색완료후에 노출된 리스트들 중에서 제가 원하는 정보들을 뽑아내고자 함에 있습니다,

![이미지][1]

검색 완료후에 해당 페이지를 소스보기하여 보시면

![이미지][2]

제가 빨간색 박스를 그려둔것 처럼 caption 안에 해시태그들이 들어있습니다. 해당 소스는 soup = urllib.request.urlopen("https://www.instagram.com/explore/tags/"+hashTag[1:]) bssource = soup.read() print(bssource) 로 가져온 소스 입니다.

여기서 각각의 caption 에 나열되어 있는 해시태그나 좋아요 수 id 값 등을 가져오고자 하는데 어떤식으로 어떻게 접근을 해야하는지 모르겠네요 ![이미지][3]

원래는 find_element_by_xpath 나 find_element_by_class_name 등을 활용하여 가져오고자 했으나 그 방법또한 여의치 않은것 같습니다. 계속 빈값을 리턴합니다.

![이미지][4]

[소스 첨부합니다.]

# -*- coding: UTF-8 -*- 
# [ IMPORT ] #
import requests
from bs4 import BeautifulSoup
import pymysql
from  selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import getpass
import urllib.request
# [] #

username = input("Input ID : ")# User ID
password = getpass.getpass("Input PWD : ")# User PWD
hashTag = input("Input HashTag # : ")# Search #

checkTag = hashTag.find('#')

# [ HASHTAG USING CHECK ] #

if checkTag==-1:
    hashTag = '#'+hashTag

driver = webdriver.Chrome("C:/Users/LEEJIYONG/Desktop/crawling/chromedriver.exe")# Chromedriver PATH
driver.get("https://www.instagram.com/accounts/login/")

# [ LOGIN ] #

element_id = driver.find_element_by_name("username")
element_id.send_keys(username)
element_password = driver.find_element_by_name("password")
element_password.send_keys(password)

password = 0 #RESET Password

driver.find_element_by_xpath("""//*[@id="react-root"]/section/main/div/article/div/div[1]/div/form/div[1]/div/input""").submit()
driver.implicitly_wait(5)

# [ LOGIN COMPLETE and SEARCH ] #

driver.find_element_by_xpath("""//*[@id="react-root"]/section/nav/div[2]/div/div/div[2]/input""").send_keys(hashTag)
driver.find_element_by_xpath("""//*[@id="react-root"]/section/nav/div[2]/div/div/div[2]/div[2]/div[2]/div/a[1]""").click()

searchTotalCount = driver.find_element_by_xpath("""//*[@id="react-root"]/section/main/article/header/span/span""").text
print('검색결과  Total : '+ searchTotalCount +' 건 의 게시물이 검색되었습니다.')

elem = driver.find_element_by_tag_name("body")

# [ AUTO PAGE DOWN ] #
# 자동으로 스크롤을 두번 내려줌
no_of_pagedowns = 2

while no_of_pagedowns:
    elem.send_keys(Keys.PAGE_DOWN)
    time.sleep(0.5)
    no_of_pagedowns-=1

# [ SEARCH COMPLETE ] #
# 검색하여 현재 노출된 페이지 안의 사진수 만큼의 빈 배열을 만들어둠
resultCnt = len(driver.find_elements_by_class_name("_2di5p"))
resultValues =[]

for i in range(resultCnt):
    resultValues.append('')

print(resultCnt)
print(resultValues)
# 사진수 만큼의 index를 가진 빈배열 만들기 끝

#원하는 정보 가져오기
soup = urllib.request.urlopen("https://www.instagram.com/explore/tags/"+hashTag[1:])
bssource = soup.read()

searchvalues = BeautifulSoup(bssource, 'lxml')
print(searchvalues)
prodList = soup.find_all('div')#혹시나 써봤지만 역시 될리 없음
print(prodList)```





짧게 설명하자면
예를들어 해시태그 검색후에 21개의 게시글이 나왔다는 가정하에
해당 21개의 게시물에 해시태그 좋아요 수 등의 정보를 배열에 차례로 저장하려고 합니다.
도움부탁드립니다.


  [1]: https://res.cloudinary.com/eightcruz/image/upload/v1512639450/ef2mtyx9656n2m2c9n7o.jpg
  [2]: https://res.cloudinary.com/eightcruz/image/upload/v1512639473/inyiupcqfqqz0lpskvmq.jpg
  [3]: https://res.cloudinary.com/eightcruz/image/upload/v1512639489/n16541f47tpwk92magic.jpg
  [4]: https://res.cloudinary.com/eightcruz/image/upload/v1512639504/qsfeg9i3dckxoakdrhmo.jpg
  • 2017년 12월 07일에 작성됨

조회수 60


1 답변


사진이 안보이시는분들은

https://www.facebook.com/photo.php?fbid=1342381782557288&set=pcb.1545783272171495&type=3&theater&ifg=1

여기 참고 하셔도 됩니다.

  • 2017년 12월 07일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close