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

최성환님의 프로필 이미지
최성환

작성한 질문수

[2024 개정판] 이것이 진짜 크롤링이다 - 기본편

웹 스크래핑 코드에 대한 질문입니다.

작성

·

194

0

# 2. main function def crawler(maxpage, query, s_date, e_date, press): press = int(press_name) s_from = s_date.replace(".", "") e_to = e_date.replace(".", "") page =1 maxpage_t = (int(maxpage)-1)*10+1 f = open("D:/10.MyPython_work/nlp/web_crawl/contents_text.csv", 'w', encoding = 'utf-8') wr = csv.writer(f) wr.writerow(['years', 'company', 'title', 'contents', 'link']) while page < maxpage_t: url = 'https://search.naver.com/search.naver?where=news&query=' + query + '&sort=0&ds=' + s_date + '&de=' + e_date + '&news_office_checked='+ press + '&nso=so%3Ar%2Cp%3Afrom' + s_from + 'to' + e_to + '%2Ca%3A&start=' + str(page) # ua = UserAgent() # headers = {'User-Agent' : ua.random} req = requests.get(url) cont = req.content soup = BeautifulSoup(cont, 'html.parser') for urls in soup.select("a.info"): try: if urls["href"].startswith("https://news.naver.com"): news_detail = [] ua = UserAgent() headers = {"User-Agent" : ua.random} breq = requests.get(urls["href"], headers = headers) bsoup = BeautifulSoup(breq.content, 'html.parser') title = bsoup.select('h3#articleTitle')[0].text news_detail.append(title) pdate = bsoup.select('.t11')[0].get_text()[:11] news_detail.append(pdate) _text = bsoup.select('#articleBodyContents')[0].get_text().replace('\n', " ") btext = _text.replace("// flash 오류를 우회하기 위한 함수 추가 function _flash_removeCallback() {}", "") news_detail.append(btext.strip()) news_detail.append(urls["href"]) pcompany = bsoup.select('#footer address')[0].a.get_text() news_detail.append(pcompany) wr.writerow([news_detail[1].replace(',',''), news_detail[4].replace(',',''), news_detail[0].replace(',',''), news_detail[2].replace(',',''), news_detail[3].replace(',','')]) except Exception as e: continue page += 10 print('Completed!') f.close() def main(): maxpage = input("검색 할 페이지수: ") query = input("검색어: ") s_date = input("시작 날짜(YYYY.MM.DD): ") e_date = input("종료 날짜(YYYY.MM.DD): ") medium = {'경향신문': '1032', '국민일보': '1005', '동아일보': '1020', '문화일보': '1021', '중앙일보': '1025', '한겨레': '1028', '한국경제': '1015', 'KBS': '1056', 'MBC': '1214'} press_name = medium.get(input("언론사 :")) crawler(maxpage, query, s_date, e_date, press) main()
 
강의와 구글 검색으로 네이버 뉴스를 신문사 선택하여 스크레핑할 수 있게 만들려고 작성한것입니다. 그런데
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_14200/631169102.py in <module>
     70     crawler(maxpage, query, s_date, e_date, press)
     71 
---> 72 main()

~\AppData\Local\Temp/ipykernel_14200/631169102.py in main()
     68     press_name = medium.get(input("언론사 :"))
     69 
---> 70     crawler(maxpage, query, s_date, e_date, press)
     71 
     72 main()

NameError: name 'press' is not defined

이런 에러메세지가 나오는데요.. 이건 어떻게 해결할 수 있을가요?

답변 1

0

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

안녕하세요.

코딩을 가장 쉽게 알려주는 크리에이터, 스타트코딩입니다.

 

자, 에러 메시지를 잘 한번 해석해 볼까요?

NameError: name 'press' is not defined
-> press 라는 이름이 정의되지 않았다

 

변수를 아직 만들지 않았는데 사용했기 때문에 나는 오류 입니다.

press 변수가 있는지 확인해 보세요 ^^

 

최성환님의 프로필 이미지
최성환
질문자

네. 답변 감사합니다.

추가적으로 main function def  crawler 함수에 press 변수를 넣었는데. def main()에서 press 변수가 정의되지 않아서 일까요? 정의되지 않았다는 것이 어디에서 정의되지 않았다는 것일까요?

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

70번재 줄 press가 정의 되지 않았습니다 ^^

최성환님의 프로필 이미지
최성환
질문자

와우. 감사합니다.

더 고민하고, 수정을 해보겠습니다.

혹시 코드 수정을 하다가 막히거나 질문이 생기면 더 질문해도 될까요?

급한 마음에 너무 많은 코드 줄을 붙여 넣고 질문을 하고나서 너무 죄송한 감이 밀려와서 늦게나마 여쭤봅니다.

 

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

네 ^^ 

대신 오류가 생기면 적어도 1~2시간은 충분히 고민해 보고 질문 주세요ㅎㅎ

구글 검색으로 오류를 스스로 해결하는 과정이 진짜 실력이 됩니다.

 

그리고, 소스코드를 보기 좋게 올려 주시면 감사하겠습니다 ^^ 

최성환님의 프로필 이미지
최성환
질문자

네. 감사합니다.

 

소스코드 올리는건 처음이라

저번에 올려진거 보고 지저분해서 깜짝 놀랐습니다. 

혹시 어떻거 올리면 되나요?

텍스트 파일로 올릴까요? 아님 쥬피터 파일로 올릴까요?

스타트코딩님의 프로필 이미지
스타트코딩
지식공유자

복사해서 붙여넣으면 보통 정상적으로 출력되는데

잘 안된다 싶으면, 텍스트 파일로 한번 옮겼다가 복사 하던지

아니면 스크린샷으로라도 찍어서 올려 주세요 ㅎㅎ

최성환님의 프로필 이미지
최성환

작성한 질문수

질문하기