• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 분석

  • 해결 여부

    미해결

크롤링 프로그램 오나성: 크롤링한 데이터에서 다시 크롤링하기2

22.05.08 19:05 작성 조회수 162

0

계속 오류나서 보니 작성해주신 파일 보니 아래 조건문이 추가되어있네요.

왜 추가해야되는지 이해를 못하겠어서 공지사항 보려고 하는데, 못찾겠습니다. 어디로 들어가면 될지요 ㅠ

 

link_re = re.compile('^http://')

.....

    if link_re.match(title['href']): 

답변 1

답변을 작성해보세요.

0

 

안녕하세요. 새소식에 2페이지에 있는데요. 아마 여러 새소식을 올리다보니, 2페이지라서 맨끝에서 2를 누르시면 보실 수는 있고요. 다음과 같이 작성한 부분을 복사하여 공유드립니다.

 

금일 수강생 한분께서 말씀해주셔서, 마지막에 있는 지마켓 사이트에서 일부 페이지 크롤링시 일부 상품 관련 태그가 변경되어 강의에서 설명드린 코드가 일부 수정이 필요한 부분을 확인하였습니다. 일부 코드만 발췌하면 다음 빨간색 부분이 에러가 날 수 있습니다. (상품 페이지마다 다를 수는 있습니다.) 

-----------------

import requests

from bs4 import BeautifulSoup

res = requests.get('http://corners.gmarket.co.kr/Bestsellers?viewType=G&groupCode=G07')

soup = BeautifulSoup(res.content, 'html.parser')

bestlist = soup.select('div.best-list > ul > li')

for index, product in enumerate(bestlist):

    title = product.select_one('a.itemname')

    price = product.select_one('div.o-price')

    res2.requests(title['href'] 

-------------------

우선 이렇게 에러가 나는 경우, 제가 접근해가는 방식을 설명드리면, 프로그래밍을 학습하시는데 조금더 도움이 되실 것 같아 다음과 같이 설명을 드립니다.

1) 일단은 에러를 확인합니다. 어느 코드에서 에러가 났는지는 --> res에 보시면 res2 = requests.get(title['href']) 이 부분이 에러라고 나오고, invalid URL 이라고 에러메세지가 나온 것을 확인하였습니다.

2) 그렇다면, title['href'] 가 잘못되었구나를 알 수 있고,  print(title['href']) 로 해당 값을 출력해 봤습니다. 그리고 대부분 정상적이지만, 일부 링크값이 안들어가 있는 것을 확인했습니다.

3) 이를 통해 일부 링크값이 안들어가 있는 경우, 반복문에서 에러가 난 것을 확인하였고, 어떻게 정상적으로 링크가 들어가 있는 경우만 requests.get() 함수를 호출하게끔 할까 하다가, 정규표현식을 써보기로 하였습니다. 그래서, 저희가 익힌 정규표현식을 써서, title['href'] 가 http:// 로 시작하는 경우만 찾아서, 해당 경우에서만 res2 = requests.get(title['href']) 를 해주었습니다. 

이런 순서로 에러를 찾아내고, 변수값을 확인해가시면서, 코드를 수정해보신다면, 좀더 프로그래밍에 익숙해지는데 도움이 되실 것 같습니다. 다음 코드로 파란색으로 바꾸면 각 상품페이지까지 넘어갈 수 있음을 확인하였습니다.

--------------------

import requests

import re

from bs4 import BeautifulSoup

link_re = re.compile('^http://')

 

res = requests.get('http://corners.gmarket.co.kr/Bestsellers?viewType=G&groupCode=G07')

soup = BeautifulSoup(res.content, 'html.parser')

 

bestlist = soup.select('div.best-list > ul > li')

 

for index, product in enumerate(bestlist):

    title = product.select_one('a.itemname')

    price = product.select_one('div.o-price')

    if link_re.match(title['href']):

        res2 = requests.get(title['href'])

------------

강의 자체는 그래도 유의미하고, 좋은 예라서 공지사항을 통해 이 부분만 양해해주시고, 같이 확인해주시면 좀더 좋을 것 같습니다. 추후에 이 부분도 아예 제가 사이트를 만드는 방향을 고민해보겠습니다.

감사합니다.