강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

양성현님의 프로필 이미지
양성현

작성한 질문수

남박사의 파이썬으로 실전 웹사이트 만들기

게시판만들기 - 글 리스트

google.py

해결된 질문

작성

·

22

0


강사님께서 알려주신


from googlesearch import search

query = "파이썬 강좌"
for r in search(query, num_results=10, advanced=True):
    title = r.title
    contents = r.description
    url = r.url
    print(f"Title: {title}")
    print(f"Contents: {contents}")
    print(f"URL: {url}")
    print("-" * 40)


요 코드대로 해보았으나

image.png

출력이 안됩니다. 뭐가문제일까요??

'''
게시판 리스트 테스트를 위한 Google 검색어 크롤링 프로그램

설치 해야하는 라이브러리
pip install --upgrade BeautifulSoup4 requests lxml pymongo googlesearch-python
'''

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
from datetime import datetime
import random
from googlesearch import search

# 몽고DB
client = MongoClient(host="localhost", port=27017)
# myweb 데이터베이스
db = client.myweb
# board 컬렉션
col = db.board

# 구글 검색시 헤더값을 설저하지 않으면 브라우저에서 보이는것과 다른 결과가 나옴
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36"}

# 검색 결과 30개 수집
query = "파이썬 강좌"
for r in search(query, num_results=30, advanced=True):
	# 구글 검색 URL, 검색어는 파이썬
    # 게시물 작성시간 기록을 위해 현재시간 저장 (utc 타임)
    current_utc_time = round(datetime.utcnow().timestamp() * 1000)

    try:
        title = r.title
        contents = r.description

        # 몽고DB에 저장
        # 작성자와 writer_id 설정 필요
        col.insert_one({
            "name": "테스터",
            "writer_id": "",
            "title": title,
            "contents": contents,
            "view": random.randrange(30, 777),
            "pubdate": current_utc_time
        })
    except:
        pass

이것도 수업자료에 있었던 코드입니다. 이대로 해도 진행이 안되네요..

답변 2

0

남박사님의 프로필 이미지
남박사
지식공유자

구글 정책이 변경되어 이제 앞으로 자바스크립트를 지원하지 않는 모든 브라우저에서 구글 지원을 종료했습니다. 따라서 requests 를 사용하는 방식으로는 구글 검색 결과를 받아낼 수 없을것으로 보입니다. 따라서 구글 검색 API 를 사용해서 직접 구글에서 검색 결과를 받아오는 방법과 혹은 다른 외부 도구, 혹은 다른 가상 브라우저 서비스를 통한 검색 등의 다른 접근법을 사용해야 할 듯 합니다.

다만, 이 강의는 웹사이트 개발을 어떻게 하는지에 대한 강의이며 구글 검색 기능은 단순히 게시판의 임시 게시물을 위한 방법이기 때문에 이런 주제를 벗어난 크롤링에 대한 내용을 중점적으로 다룰수는 없습니다.

 

from duckduckgo_search import DDGS

query = "파이썬 강좌"
with DDGS() as ddgs:
    results = ddgs.text(query, max_results=10)
    for r in results:
        title = r['title']
        contents = r['body']
        url = r['href']
        print(f"Title: {title}")
        print(f"Contents: {contents}")
        print(f"URL: {url}")
        print("-" * 40)

일단은 여러 방법중 가장 간단하게 사용해볼 수 있는 방법으로 위의 코드에서 처럼 구글 검색 대신 DuckDuckGo 를 사용해서 임시로 사용은 가능하니 참조하시기 바랍니다.

 

pip install duckduckgo-search

당연한 이야기겠지만 라이브러리를 먼저 설치하셔야 하는 점도 참고하시기 바랍니다.

양성현님의 프로필 이미지
양성현
질문자

from ddgs import DDGS
from googlesearch import search
from pymongo import MongoClient
from datetime import datetime
import random

QUERY = "파이썬 강좌"

def now_ms():
    return round(datetime.utcnow().timestamp() * 1000)

# MongoDB는 with로 열고 자동 close
with MongoClient("mongodb://localhost:27017", serverSelectionTimeoutMS=3000) as client:
    client.admin.command("ping")  # 연결 확인
    col = client.myweb.board

    before = col.count_documents({})
    print("[Mongo] before:", before)

    inserted = 0

    # 1) DDGS 결과 저장
    try:
        with DDGS() as ddgs:
            for r in ddgs.text(QUERY, max_results=50):
                title = r.get("title", "")
                contents = r.get("body", "")
                url = r.get("href", "")

                if not url:
                    continue

                doc = {
                    "name": "테스터",
                    "writer_id": "",
                    "title": title,
                    "contents": contents,
                    "url": url,
                    "view": random.randrange(30, 777),
                    "pubdate": now_ms(),
                    "source": "ddgs",
                }
                res = col.update_one({"url": url}, {"$setOnInsert": doc}, upsert=True)
                if res.upserted_id:
                    inserted += 1
                    print("[저장:DDGS]", res.upserted_id, "→", title)
                else:
                    print("[중복:DDGS]", url)
    except Exception as e:
        print("[DDGS ERR]", type(e).__name__, e)

    # 2) googlesearch-python 결과 저장
    try:
        for r in search(QUERY, num_results=30, advanced=True):
            title = getattr(r, "title", "") or ""
            contents = getattr(r, "description", "") or ""
            url = getattr(r, "url", "") or ""
            if not url:
                continue

            doc = {
                "name": "테스터",
                "writer_id": "",
                "title": title,
                "contents": contents,
                "url": url,
                "view": random.randrange(30, 777),
                "pubdate": now_ms(),
                "source": "google",
            }
            res = col.update_one({"url": url}, {"$setOnInsert": doc}, upsert=True)
            if res.upserted_id:
                inserted += 1
                print("[저장:GOOG]", res.upserted_id, "→", title)
            else:
                print("[중복:GOOG]", url)
    except Exception as e:
        print("[GOOGLE ERR]", type(e).__name__, e)

    after = col.count_documents({})
    print("[Mongo] after:", after, "/ inserted this run:", inserted) 이 코드로 해결했습니다. 감사합니다.
남박사님의 프로필 이미지
남박사
지식공유자

잘 작성하셨네요. 지금 이 강의의 논외긴 하지만 google api 를 사용하는 방법도 추후 알아두시면 좋을듯 합니다. 또 궁금하신 사항이 있으시면 언제든 질문 주시기 바랍니다. :)

0

안녕하세요, 인프런 AI 인턴입니다. 양성현님께서 실행한 코드가 아마 특정 환경에서 적절한 결과를 출력하지 못하고 있는 것 같습니다. googlesearch-python 라이브러리를 사용하는 동안 발생할 수 있는 몇 가지 일반적인 문제와 해결 방법에 대해 말씀드리겠습니다.

  1. 검색 설정 확인: googlesearch 모듈이 차단되지 않고 작동하려면 설정된 헤더 값이 적절해야 합니다. 구글은 자동 검색을 방지하기 위해 IP 차단을 포함한 여러 방어 메커니즘을 사용하므로, 헤더 값이 최신 브라우저와 호환되는지 확인하세요.

  2. 라이브러리 호환성 문제: googlesearch-python 라이브러리의 버전과 관련된 호환성 문제일 수 있습니다. 라이브러리를 최신 버전으로 업데이트 해보세요. 설치된 라이브러리는 다음과 같이 업데이트 가능합니다:

    pip install --upgrade googlesearch-python
    
  3. IP 차단 문제: 구글에서 과도한 요청이나 스크래핑 검사에 의해 IP가 차단될 수 있습니다. VPN을 사용하거나 검색 요청을 줄여 빈도를 조절해 보세요.

  4. 출력 설정 및 로그 확인: 에러가 없는 경우 코드의 특정 부분에서 변화가 있는지 확인하기 위해 요청들이 실제로 실행되는지에 대한 로그를 추가하는 것도 문제를 추적하는 데 도움이 됩니다.

  5. 트라이블록 제거: try 블록이 모든 예외를 침묵시키고 있을 수 있습니다. 문제 해결을 위해 tryexcept 구문을 일시적으로 제거하고, 발생하는 오류 메시지를 확인하세요. 이렇게 하면 어떤 예외가 발생하는지를 알 수 있습니다.

  6. 데이터베이스 문제: MongoDB의 연결 상태를 확인하고, 데이터베이스 상태를 체크하세요. MongoDB가 정상적으로 작동하는지, col.insert_one() 호출이 성공적으로 수행되는지 확인이 필요합니다.

여기 유사한 문제 해결에 대한 관련 질문과 답변을 참고하실 수 있습니다:
- Google.py 데이터가 안생깁니다.

해당 페이지에서는 비슷한 문제에 대한 여러 풀이 예시가 제공되고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

양성현님의 프로필 이미지
양성현

작성한 질문수

질문하기