inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

남박사의 파이썬 기초부터 실전 100% 활용

토렌트 마그넷 자동 검색기 만들기

페이징 관련 문의

229

페파

작성한 질문수 9

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)

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

웹-크롤링 python

답변 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)

38강 = 연산자 더하고 빼기

0

60

2

주석처리

0

116

1

함수의 파라미터값 msg

0

155

1

강의자료 이미지 안나옴

0

239

3

강의자료 질문 두번째

0

165

3

강의자료 관련 질문

0

116

1

파이썬 예외 처리 try / except 파일 처리 코드가 실행이 안됩니다.

0

235

1

소수 너무 어려워요

0

245

1

imagefont 함수 사용

0

239

1

pylint

0

357

1

add 함수 문의 ㅠㅠ

0

283

1

형식 문의드립니다.

0

209

1

변수 명을 왜 src, tar로 하셨는지 궁금합니다.

0

602

1

숫자야구 코드를 짜 봤는데 뭔가 이상합니다.

0

253

1

zsh: command not found: pylint

0

269

1

텔레그램 봇 만들기 코드 실행이 안됩니다 박사님..ㅠ

0

546

1

질문드립니다.

1

374

2

list.reverse() 출력에 대해서 질문있습니다.

1

433

1

데코레이터 함수 및 동작시간 질문입니다.~

1

323

2

opencv 사용하면서 궁금한점 (해상도)

1

781

1

질문드립니다.

1

299

1

아래 오류가 뜨면서 vscode가 컴파일이 되지 않는데.. 혹시 왜이럴까요?

1

445

1

크롤링안되는 현상 문의 드립니다.

1

421

1

파이썬 크롤링 관련 문의

1

277

1