• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

google.py 데이터가 안생깁니다.

20.12.16 21:50 작성 조회수 125

1

3시간 가까이. 고민하고 찾아보고 해도 도저히 해결방법을 못찾겠습니다..

디비를 못넣으면 수업진도를 나갈수가 없으니, 괴롭네요 

문제점이 무엇인지 알려주시면 정말 감사하겠습니다.

---아래는 코드-----

import requests
from bs4 import BeautifulSoup
from pymongo import MongoClient
from datetime import datetime


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

# 구글 검색시 헤더값을 설저하지 않으면 브라우저에서 보이는것과 다른 결과가 나옴
header = {
    "user-agent""Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36"}

# 검색 결과의 5페이지까지만 수집
for i in range(6):
    # 구글 검색 URL, 검색어는 파이썬
    url = "https://www.google.com/search?q={}&start={}".format("파이썬", i * 10)
    # url 접속
    r = requests.get(url, headers=header)

    # 웹페이지의 검색 결과를 파싱하기 위한 준비
    # lxml 라이브러리 사용(설치 요망)
    bs = BeautifulSoup(r.text, "lxml")

    # 검색 결과는 div 태그의 g 클래스 단위로 반복됨
    lists = bs.select("div.CAEQAA")

    # 검색결과 루프
    for l in lists:
        # 게시물 작성시간 기록을 위해 현재시간 저장 (utc 타임)
        current_utc_time = round(datetime.utcnow().timestamp() * 1000)

        try:
            # 검색 결과의 제목은 h3 태그의 LC20lb 클래스에 있음
            title = l.select_one("div.V7Sr0.p5AXld.PpBGzd.YcUVQe").text

        # 검색결과의 요약내용은 div 태그의 s 클래스에 있음
            contents = l.select_one("div.MUxGbd.yDYNvb").text

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

답변 1

답변을 작성해보세요.

0

구글 검색 결과 출력 구조가 변경되어 동작을 안하는것 같습니다. 이런 문제는 크롤링에 대한 기술이 조금 필요하나 해당 강좌는 웹사이트 제작 강좌이므로 그런 디테일한 부분에 대해서는 설명하지 않았습니다만.. 아래 코드를 확인하시어 테스트 해보시기 바랍니다.

import requests

from bs4 import BeautifulSoup

from pymongo import MongoClient

from datetime import datetime




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

# 구글 검색시 헤더값을 설저하지 않으면 브라우저에서 보이는것과 다른 결과가 나옴
header = {
    "user-agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Mobile Safari/537.36"}

# 검색 결과의 5페이지까지만 수집
for i in range(1):
    # 구글 검색 URL, 검색어는 파이썬
    url = "https://www.google.com/search?q={}&start={}".format("파이썬", i * 10)
    # url 접속
    r = requests.get(url, headers=header)
    # print(url)    # 실제 접속되는 URL
    # print(r.text)

    # 실제 어떤 내용이 넘어왔는지 print 로 내용이 짤리던가 알아보기 힘드므로
    # 좀 더 디테일하게 분석하기 위해 파일에 직접 저장
    # f = open("c":\\google_test.txt", 'w', encoding="utf-8")
    # f.write(r.text)
    # f.close()

    # 웹페이지의 검색 결과를 파싱하기 위한 준비
    # lxml 라이브러리 사용(설치 요망)
    bs = BeautifulSoup(r.text, "lxml")

    # 검색 결과는 div 태그의 g 클래스 단위로 반복됨
    # !!!!!!!!!!!!!!!!!!! 변경된 부분!!!!!!!!!!!!!!
    lists = bs.select("div.mnr-c.xpd")

    # 검색결과 루프
    for l in lists:
        # print(l)  어떤 내용이 반복되는지 확인하기 위해 화면 출력 해봄
        # 게시물 작성시간 기록을 위해 현재시간 저장 (utc 타임)
        current_utc_time = round(datetime.utcnow().timestamp() * 1000)

        try:
            # 검색 결과의 제목은 h3 태그의 LC20lb 클래스에 있음
            title = l.select_one("div.V7Sr0.p5AXld.PpBGzd.YcUVQe").text
            # 검색결과의 요약내용은 div 태그의 s 클래스에 있음
            contents = l.select_one("div.MUxGbd.yDYNvb").text
            print(title, contents)            # 화면 출력해봄

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