본문 바로가기

Python/crawling-instagram

Python 인스타그램 크롤링-크롤링관련 소스(2)

반응형

 

안녕하세요. 인스타그램 크롤링 프로젝트 중 크롤링과 관련된 소스에 대한 설명을 이어서 하겠습니다.

 

이전 글은 Python 인스타그램 크롤링-크롤링관련 소스(1)이니 참고하시기 바랍니다.

 

 

URL 검색

키워드 검색 및 사용자 검색에서 얻어은 URL을 이용해서 인스타 그램 URL을 검색하는 것입니다. 아래 그림과 같이 URL을 통해 게시글에 접근하는 기능을 제공합니다.

 

 

인스타그램의 url검색은 사용자ID와 동일한 형태의 URL를 붙여서 검색합니다.(사실상 URL은 유일한 Key로 보입니다.)

해시태그 : http://www.inwww.instagram.com/URL

    def searchInstaUrl(self, strUrl):
        url = "https://www.instagram.com/{0}".format(strUrl)
        self.driver.get(url)
        time.sleep(3)

 

게시글  얻기

게시글은 게시글, 올린날짜, 좋아요 개수, 위치, 게시글 해시태그 등의 정보를 얻는 기능을 제공합니다. 

 

 

 

    def get_content(self):
        #get_content()
        #현재 선택된 항목을 읽어온다.
        # return [URL, 게시글, 올린 날짜, 좋아요 개수, 지정 위치, 해쉬태그]

        ################################################
        # 1. 현재 페이지의 HTML 정보 가져오기
        html = self.driver.page_source
        soup = BeautifulSoup(html, 'lxml')    
        
        ################################################
        ### 2. 본문 내용 가져오기
        try:  			#여러 태그중 첫번째([0]) 태그를 선택  
            strInstaId = soup.select('div.e1e1d')[0].text
        except:
            strInstaId = ' ' 

        contentTmp = str()
        try:  			#여러 태그중 첫번째([0]) 태그를 선택  
            content2 = soup.select('div.C4VMK > span')[0]
            for contentDetail in content2.contents :
                
                if( type(contentDetail).__name__ is "NavigableString") :
                    #공백, 스페이스 1번을 없애주기위해서.. len을 넣은 이유는 공백과 스페이스바를 추가해도 분기 무시를 안하는 경우가 있어서!
                    if contentDetail is not "" and contentDetail is not " " and len(contentDetail) is not 1 and len(contentDetail) is not 0: 
                        contentTmp += contentDetail + "\t"
                elif( type(contentDetail).__name__ is "Tag") :
                    if contentDetail.text is not "" and contentDetail.text is not " " :
                        contentTmp += contentDetail.text + "\t"

        #첫 게시글 본문 내용이 <div class="C4VMK"> 임을 알 수 있다.
        #태그명이 div, class명이 C4VMK인 태그 아래에 있는 span 태그를 모두 선택.
        except:
            content2 = ' ' 

        ################################################
        # 3. 본문 내용에서 해시태그 가져오기(정규표현식 활용)
        tags = re.findall(r'#[^\s#,\\]+', contentTmp) # content 변수의 본문 내용 중 #으로 시작하며, #뒤에 연속된 문자(공백이나 #, \ 기호가 아닌 경우)를 모두 찾아 tags 변수에 저장
        
        # 4. 작성 일자 가져오기
        try:
            date = str(soup.select('time._1o9PC.Nzb55')[0]['datetime']) #앞에서부터 10자리 글자
        except:
            date = ''

        TIdx = date.find('T')
        dateValue = date[0:TIdx] + " " + date[TIdx + 1:TIdx+9]

        # 5. 좋아요 수 가져오기
        try:
            strTemp = str(soup.select('div.Nm9Fw > button')[0].text)
            strTemp = strTemp.replace(",","");
            strTemp = strTemp.replace("외","");
            strTemp = strTemp.replace("명","");
            strTemp = strTemp.replace(" ","");

            like = strTemp
        except:
            like = 0
        # 6. 위치 정보 가져오기
        try:
            place = str(soup.select('div.JF9hh')[0].text)
        except:
            place = ''

        data = [self.driver.current_url, strInstaId, contentTmp, dateValue, like, place, tags]
        return data

개발 도중 soup Select과정에서 변경되는 경우가 있는것 같습니다. 그럴 때는 개발자 도구의 위치를 분석하며 맞춰줘야할것 같습니다.

 

반응형

이미지  얻기

게시글의 이미지 url을 추출하여 게시글의 메인 이미지를 얻어오는 기능을 제공합니다. 소스코드를 보면 첫 위치가 아닌 두번째 이미지가 게시글의 메인 이미지인 것을 확인할 수 있습니다. (아래 그림과 같이 게시자의 이미지가 첫 이미지이며 2번째 이미지 URL이 게시글의 이미지입니다.)

 

따라서 소스코드에서 2번째 이미지 URL을 찾아서 추출하여야합니다.

    def get_imageUrl(self):
        imageUrl = list()
        while(1) :

            html = self.driver.page_source
            soup = BeautifulSoup(html, 'lxml')

            #0이 아닌 1의 위치에 게시글의 이미지가 담겨있다!
            try : 
                imgs = soup.select('img')[1].attrs['src']
                imageUrl.append(str(imgs))
            except :
                print("error" + str(self.driver.current_url))

            if self.select_first("div.coreSpriteRightChevron") is False : 
                break

        setImg = set(imageUrl)
        listImg = list(setImg)

        return listImg

 

 

 

반응형