python3 와 selenium 그리고 BeautifulSoup를 활용한 instagram crawling
조회수 4112회
바쁘신분들은 # [ 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
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
사진이 안보이시는분들은
여기 참고 하셔도 됩니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력