• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

페이징 관련 문의

20.04.23 14:00 작성 조회수 142

1

키워드 검색후 여러 페이지에 걸친 결과물을 검색후 합치기(Extend) 위해

if start_page < end_page:
start_page += 10
results.extend(search_google(keyword,start_page,end_page=end_page))

코드를 사용하는걸로 이해하고있습니다.  첫페이지 리스트 결과물을 얻은 다음구글 2페이지 결과물을 찾기위해  위코드를 통해 start_page=10이 되어서 함수로 다시 되돌려 주는걸로 이해하고 있는데요,

함수 전달자 start_page=10이되더라도  url에는 그걸 받아주는 start_page 변수를 쓰지 않는데, 어떻게 2페이지 자료를 검색하는 건지 궁금합니다. 

def search_google(keyword,start_page, end_page=None):
url = 'https://www.google.com/search?q={0}+magnet%3A%3Fxt%3D&oq={0}+magnet%3A%3Fxt%3D'.format(keyword)

아래처럼 뭐 이런식으로 start_page 인자를 넣어줘야 하는거 아닌가 고민하다가 문의드립니다. 

url = "https://www.google.com/search?q={}+magnet:?xt=&start={}".format(keyword,start_page)

답변에 미리 감사드립니다. 

답변 1

답변을 작성해보세요.

1

말씀하신 부분이 맞습니다. 

제거 재귀함수 로직을 설명하고 테스트하는데만 집중하다보니 원래 코드에서 테스트 시간을 줄이기 위해 말씀하신 파라메터를 생략하고 다시 넣지 않고 진행을 한것 같습니다. 중요한 부분 알려주셔서 감사드립니다. 해당 수정된 코드도 강좌에 추가해놓도록 하겠습니다.

import requests
from bs4 import BeautifulSoup
import re

"리눅스 magent:?xt="


def search_google(keyword, start_page, end_page=None):
    url = "https://www.google.com/search?q={0}+magnet%3A%3Fxt%3D&oq={0}+magnet%3A%3Fxt%3D&start={1}".format(keyword, start_page)
    header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36,gzip(gfe)"}
    r = requests.get(url, headers=header)
    bs = BeautifulSoup(r.text, "lxml")
    links = bs.select("div.g > div.rc > div.r > a")

    results = []

    if end_page is None:
        # 페이징 될 경우 검색결과 약 100,000개 중 2페이지 (0.50초) 이런 형식으로 결과가 출력됩니다.
        # 그래서 "검색결과 약" 과 "개" 사이의 결과 갯수를 파싱하기 위해서 아래처럼 작업합니다.
        parse_text_1 = "검색결과 약"
        parse_text_2 = "개"
        # 최초의 검색 결과를 div 태그의 ID가 result-stats 인 요소의 text 값을 구합니다.
        text = bs.select("div#result-stats")[0].text

        # "검색결과 약" 에서부터 맨 뒤까지 문자열을 슬라이싱 해서 text에 다시 담습니다.
        text = text[text.find(parse_text_1) + len(parse_text_1):]
        # "검색결과 약" 이 제거된 text 에서 "개" 를 찾아 그곳까지 슬라이싱해서 다시 text에 담습니다.
        text = text[:text.find(parse_text_2)]
        # 최종적으로 , 를 제거하고 공백제거 후 counts 변수에 담으면 숫자만 담겨 집니다.
        counts = text.replace(",", "").strip()

        # 이전코드
        # counts = bs.select("div#result-stats")[0].text.replace("검색결과 약", "").replace("개", "").replace(",", "").split("(")[0].strip()

        print(counts)
        end_page = int(int(counts) / 10)
        if end_page > 20:
            end_page = 20

    for a in links:
        href = a["href"]
        text = a.select("h3")
        if len(text) <= 0:
            continue
        title = text[0].text

        try:
            r = requests.get(href)
            bs = BeautifulSoup(r.text, "lxml")
            magnets = bs.find_all("a", href=re.compile(r'magnet:\?xt=*'))

            if len(magnets) > 0:
                magnet = magnets[0]["href"]
                results.append((title, magnet))
        except:
            pass
    if start_page < end_page:
        start_page += 10
        results.extend(search_google(keyword, start_page, end_page=end_page))

    return results

results = search_google("리눅스", 1)

for r in results:
    print(r)