서문
저자들은 배운 내용을 정리하기 위해 나중에 복습할 수 있도록 학습 노트 형식의 블로그 포스팅을 시작하려고 합니다. 물론 신진 신기술 학습에 도움이 될 수 있다면 그것 또한 훌륭한 일입니다. 필자는 식물인간이므로 글에 오류가 있다면 독자들의 비판과 수정을 환영합니다.
보물 발견하기
얼마 전 이해하기 쉽고 재미있는 거대한 인공지능 학습 웹사이트를 발견해서 여러분과 공유하지 않을 수 없었습니다. 트레저 포털입니다.
I. 우연
- 최근에 저는 댓글 섹션에서 팬들을 무작위로 선정하여 좋은 책의 실제 사본을 증정하는 팬 혜택 도서 증정 작업을 시작했습니다. 이 작업을 수행하려면 팬의 이름을 수동으로 복사하여 붙여넣고 해당 추첨 프로그램을 다운로드한 다음 팬 목록을 수동으로 입력해야 하는데, 이 일련의 지루한 작업은 매우 번거롭습니다!
- 공교롭게도 저는 최근 인턴십을 통해 Python을 접하고 배울 수 있는 기회를 가졌습니다. 저는 파이썬 크롤러 기술을 배웠고, 간단한 방법으로 웹페이지 데이터를 크롤링할 수 있게 되었습니다. 그래서 댓글 섹션에서 팬의 이름을 자동으로 가져와 무작위로 선택하는 간단한 Python 크롤러를 구현해보기로 했습니다!
- 나는 자바 플레이어이고 방금 파이썬을 시작했기 때문에 수준이 제한되어 있기 때문에 프로그래밍 과정에 필연적으로 단점이 있으므로 귀중한 조언과 비판 및 수정을 환영합니다!
디자인 아이디어
- 먼저, 댓글 섹션에서 팬의 이름을 얻기 위해 Python 크롤링 기술을 사용할 계획입니다. 댓글 섹션의 페이지 구조를 분석하여 관련 데이터를 추출하는 크롤러를 작성할 수 있습니다. 파이썬의 요청 및 구문 분석 라이브러리를 사용하여 요청을 전송하고 페이지에서 팬의 사용자 이름과 같은 필요한 정보를 추출할 수 있습니다.
- 팬 이름 목록을 얻었으면 이제 파이썬의 무작위 추출 라이브러리를 사용하여 무작위 선택을 구현할 수 있습니다. 적절한 메서드를 호출하여 팬 이름 목록에서 무작위로 여러 명의 팬을 당첨자로 선택할 수 있습니다.
- 사용자 편의성을 높이고 코드를 쉽게 실행할 수 있도록 클릭 투 실행 기능을 위해 코드를 실행 가능한 Python 프로그램으로 패키징했습니다. 이를 통해 사용자는 명령줄이나 편집기를 열 필요 없이 프로그램을 두 번 클릭하기만 하면 바로 코드를 실행할 수 있습니다.
셋째, 전면에 대한 지식
URL을 파싱하기 위해 get 요청을 보내는 방법
- 먼저 필요한 라이브러리가 설치되어 있는지 확인합니다. Beautiful Soup의 경우 pip install beautifulsoup4를 사용하여 설치할 수 있습니다.
- BeautifulSoup은 웹 크롤링 용도의 Python 라이브러리입니다. HTML과 XML 문서에서 데이터를 추출하는 편리하고 효율적인 방법을 제공합니다. BeautifulSoup을 사용하면 HTML 구조를 파싱 및 트래버스하고, 특정 요소를 검색하고, 웹 페이지에서 관련 데이터를 추출할 수 있습니다.
- 라이브러리는 내장된 파이썬 파서, lxml, html5lib 등 다양한 파서를 지원하므로 특정 요구에 가장 적합한 파서를 선택할 수 있으며, BeautifulSoup의 강점은 형식이 잘못되거나 손상된 HTML 코드를 처리할 수 있는 기능으로 웹 크롤링 작업의 복잡성을 처리하는 강력한 도구가 됩니다.
pythonimport requests from bs4 import BeautifulSoup # HTML 요청 보내기 response = requests.get(url) html = response.text # 아름다운 수프 오브제 만들기 soup = BeautifulSoup(html, 'html.parser') # 선택기를 통해 DOM 요소 선택하기 element = soup.find('div',id='my-element')
- 다음으로 find( )와 같이 Beautiful Soup에서 제공하는 메서드와 선택기를 사용하여 HTML DOM에서 특정 요소를 선택할 수 있습니다. 위 예제에서 find() 메서드는 id가 my-element인 요소를 선택합니다.
URL 해결을 위한 포스트 요청을 보내는 방법
요청을 구문 분석할 때는 다음 사항에 중점을 둡니다.
- 요청 유형
- 요청 유형
- 요청 경로
- 요청 매개변수( 포스트 요청은 암시적이며 브라우저는 get 요청을 보내므로 포스트 요청에서 전송된 인터페이스 데이터는 get 요청을 보내서 직접 가져올 수 없음 )
다음은 샘플 코드입니다.
pythonimport json import requests def main(): #도쿄 청년 신문의 반응 데이터를 얻기 위한 모의 테스트 클래스입니다. url = 'https://www.gzyouthnews.org/index/index' header = { 'X-Requested-With':'XMLHttpRequest' } data={ 'act':'list', 'date':'2023-08-10', 'paper_id':1 } res = requests.post(url=url,headers=header,data=data) list = json.loads(res.text) for i in list: print(i.get('edition')) if __name__ == '__main__': main()
공통 요청 헤더를 추가하는 방법
- 실제 코드에서 HTTP 요청 헤더를 설정하려면 적절한 프로그래밍 언어와 HTTP 라이브러리의 기능을 사용하여 설정할 수 있습니다. 다음은 Python의 요청 라이브러리를 사용하여 일반적인 요청 헤더를 추가하는 방법의 예시입니다:
pythonimport requests url = "https://example.com" headers = { "User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9", "Referer": "https://example.com", # 기타 일반적인 요청 헤더 추가... } response = requests.get(url,stream=True, headers=headers)
- 위의 예에서는 헤더 사전이 생성되고 일반적인 요청 헤더 키-값 쌍이 사전에 추가됩니다. 그런 다음 요청을 보낼 때 headers 매개 변수를 전달하여 이러한 요청 헤더를 GET 요청에 추가합니다.
실제로 요청 헤더는 필요에 따라 사용자 정의할 수 있습니다. 일반적으로 사용되는 요청 헤더에는 "User-Agent ", "Accept-Language ", "Referer " 등이 있습니다.
4. 문자열 서식
문자열 서식 지정은 변수나 데이터를 문자열에 삽입하여 특정 형식의 텍스트를 만드는 방법입니다. 파이썬에서 문자열 서식 지정은 여러 가지 방법으로 구현할 수 있습니다.
문자열 서식을 지정하는 일반적인 방법은 % 연산자를 사용하는 것입니다. 이 방법은 자리 표시자를 사용하여 삽입할 변수를 표시하고 % 연산자 뒤에 해당 값을 제공합니다. 예시:
sqlname = 'Alice'; age = 0x19; message = 'My\x20name\x20is\x20%s\x20and\x20I\x20am\x20%d\x20years\x20old.' % (name, age); print(message);
출력은 다음과 같습니다:
sqlMy name is Alice and I am 25 years old.
위의 예에서 %s는 문자열 자리 표시자이고 %d는 정수 자리 표시자입니다. 연산자 뒤의 괄호는 삽입할 변수를 해당 순서대로 제공합니다.
JSON 형식 구문 분석 방법
- JSON 데이터에서 title 속성 값을 가져오려면 Python의 json 모듈을 사용하여 JSON 데이터를 파싱하면 됩니다. 예제 데이터에서 title 속성은 데이터 사전의 pageArticleList 목록의 각 요소에 있습니다.
- 다음은 제목 속성 값을 가져오는 방법을 보여주는 샘플 코드입니다:
pythonimport json # JSON 데이터가 있다고 가정하고 json에 저장합니다._data json_data = ''' { "status": 200, "message": "success", "datatype": "json", "data": { "pageArticleList": [ { "indexnum": 0, "periodid": 20200651, "ordinate": "", "pageid": 2020035375, "pagenum": "6 뉴스", "title": "'과학 및 기술 혁신'에 집중+고급 제조” 과학 대중화 작업의 사회화된 패턴 구축" } ] } } ''' # JSON 데이터 파싱하기 data = json.loads(json_data) # 제목 속성 값 추출 title = data["data"]["pageArticleList"][0]["title"] # 제목 속성 값 출력 print(title)
- 위의 예에서 샘플 데이터는 json_data 문자열에 저장됩니다. 그런 다음 json.loads() 함수를 사용하여 문자열을 JSON 데이터로 파싱하여 데이터 변수에 저장합니다.
- 그런 다음 사전 키에 대한 계층적 액세스를 통해 title 속성의 값을 추출할 수 있습니다. 이 예제에서는 data["data"]["pageArticleList"][0]["title"] 을 사용하여 title 속성의 값을 가져옵니다.
- 마지막으로 결과를 인쇄하거나 필요에 따라 처리합니다.
- 또는 get()을 사용하여 특정 프로퍼티의 값을 가져옵니다.
pythonlist = json.loads(res.text) for i in list: print(i.get('edition'))
URL에서 매개변수를 가져오는 방법
주어진 URL에서 매개변수 page=100을 가져오려면 URL 구문 분석 라이브러리를 사용하여 URL을 구문 분석하고 필요한 매개변수를 추출하면 됩니다.
다음은 Python의 urllib.parse 모듈을 사용하여 URL 매개변수를 구문 분석하는 샘플 코드입니다:
pythonfrom urllib.parse import urlparse, parse_qs url = "https://blog..net/phoenix/web/v1/comment/list/131760093"?page=100&size=10&fold=unfold&commentId=" parsed_url = urlparse(url) query_params = parse_qs(parsed_url.query) page_value = query_params.get("page", [None])[0] print(page_value)
위 예제에서는 urlparse 함수를 사용하여 URL을 먼저 파싱한 다음, parse_qs 함수를 사용하여 쿼리 매개변수 부분을 파싱합니다. parse_qs는 키는 매개변수 이름이고 값은 매개변수 값의 목록인 쿼리 매개변수를 사전으로 파싱합니다.
그런 다음 query_params.get("page", [None])[0] 을 사용하여 사전에서 페이지라는 이름의 매개변수 값을 가져옵니다. 그러면 매개변수의 값이 반환되며, 매개변수가 존재하지 않으면 None이 반환됩니다.
출력은 URL에서 추출한 페이지 매개변수의 값인 001이 됩니다.
URL 매개변수 값이 문자열 형식인 경우 필요에 따라 추가 형식 변환을 수행해야 할 수 있습니다.
IV. 프로그래밍 탐색 시작
- 우선, 코드를 작성하기 위해 위에 제공된 템플릿에 따라 샘플 프로그램을 보내는 get 요청을 작성하여 여기 내 개인 블로그 "4 차원으로 말하는 ChatGPT 기술 원리, 책 끝에있는 ChatGPT 신비한 기술 블랙 박스 열기" 에 해당 돔 노드를 가장 먼저 찾습니다.
- 코드를 디버그하여 원하는 노드를 제대로 얻었는지 확인합니다.
- 댓글 섹션에 있는 모든 팬의 이름이 포함된 id가 pcCommentSideBox인 돔 노드의 콘텐츠가 비어 있는 것으로 확인되었으며 페이지에 표시된 다른 돔 노드는 발견되지 않았습니다.
- 실제로 댓글 섹션의 데이터는 페이지의 돔 구조가 아닌 인터페이스를 통해 렌더링된다는 것을 경험으로 알 수 있으므로 웹 페이지의 콘솔로 이동하여 해당 데이터 렌더링 인터페이스를 찾습니다.
- 요청을 하나씩 살펴보다가 마침내 댓글 섹션 데이터를 json 데이터 형식으로 렌더링하는 해당 요청을 찾았습니다.
- 그리고 요청의 헤더를 보면 요청의 요청 유형이 POST이고 API 인터페이스의 요청 경로가 다음과 같다는 것을 어렵지 않게 알 수 있습니다.
- 그리고 접힌 댓글 경로 매개 변수의 접기 속성 값은 접기이고 펼쳐진 경로의 접기 매개 변수 값은 펼치기인 것을 발견했으며 접힌 댓글은 유효하지 않으며 추첨에 참여하지 않으므로 처리되지 않습니다.
- 인터페이스로 바로 이동하면 전체 댓글 섹션이 아닌 10개 항목만 표시됩니다.
- 댓글 섹션에 몇 개의 댓글이 있나요? 어떻게 계산되나요? 아래 차트를 통해 확인할 수 있는 총 댓글 수는 접힌 댓글과 접힌 댓글을 모두 포함합니다.
- 돌아가서 페이지를 자세히 살펴보면 더 많은 댓글을 보기 위해 클릭할수록 다음과 같은 요청이 점점 더 많아지는 것을 볼 수 있습니다.
- 요청 경로를 비교하러 가면 페이지 매개 변수의 경로가 다르다는 것을 알 수 있으며 페이지가 페이지임을 추론하는 것은 어렵지 않으며 모든 페이지가 설정되면 댓글 섹션에서 모든 댓글을 얻을 수 있으며 댓글 섹션에서 모든 팬의 이름을 얻을 수 있습니다.
- 따라서 원래 GET 요청을 POST 요청으로 변경하고 동적 접합 + for 루프에 의해 경로에 페이지 매개 변수를 할당하여 모든 페이지를 트래버스하는 예제는 다음과 같습니다.
python#19페이지의 댓글이 있다고 가정합니다. for index in range(0,20): # 블로그 주소 샘플 url = "https://blog..net/phoenix/web/v1/comment/list/132666427"?page=%s&size=10&fold=unfold" % (index)
- 여기에 요청 헤더를 추가하지 않으면 JSON 데이터로 인터페이스에 액세스 할 수 없으므로 여기에 공통 요청 헤더를 추가하려면 작동하지 않는 경우 몇 가지 공통 요청 헤더를 추가하고 매개 변수를 추가하는 것을 고려하십시오.
pythonheaders = { 'c': 'Mozilla/5.0\x20(Macintosh;\x20Intel\x20Mac\x20OS\x20X\x2010_12_6)\x20AppleWebKit/537.36\x20(KHTML,\x20like\x20Gecko)\x20Chrome/79.0.3945.130\x20Safari/537.36' }; response = requests.a(url, headers = headers);
- 인터페이스에 액세스하여 for 루프를 통해 JSON 데이터의 각 페이지를 처리할 수 있습니다.
pythonhtml = response.text json_data = json.loads(html) list = json_data["data"]["list"] for item in list: # 각 댓글에서 팬의 사용자 닉네임을 가져옵니다. user_name = item["info"]["nickName"]
- 또한 블로거 본인이 직접 추첨에 참여하지 않기 때문에 블로거의 댓글은 최종 경품 풀에 포함되지 않으며, 블로거가 직접 댓글을 다는 방식은 다음과 같이 두 가지입니다:
- 댓글 섹션의 각 댓글에서 팬의 사용자 닉네임을 가져오려면 하위 필드가 아닌 정보 필드를 가져와야 하기 때문입니다.
pythonfor item in list: # 각 댓글에서 팬의 사용자 닉네임을 가져옵니다. user_name = item["info"]["nickName"] # 블로거 자신의 댓글은 추첨에 참여하지 않습니다. if user_name == editior_name: continue else: nums.append(user_name)
- 액세스 인터페이스에서 얻은 사용자 닉네임을 저장할 배열 nums를 정의합니다.
pythonnums = [] ... nums.append(user_name)
- 파이썬의 랜덤 함수를 사용하여 댓글 섹션에 있는 모든 팬의 닉네임이 저장된 배열 숫자에서 5명의 행운의 팬을 무작위로 선택합니다.
python#5 명의 행운의 팬을 추첨한다고 가정합니다. for index in range(0,5): luck_fan = random.choice(nums) print(" + str(index + 1) + "행운의 팬은 "+ luck_fan)
- 사용자 경험을 최적화하기 위해 추출된 팬 수와 JSON 데이터 인터페이스를 통한 액세스 횟수를 사용자 정의 매개변수와 함께 키보드를 통해 입력하여 코드의 결합을 줄이고 프로그램과 사용자 간의 상호 작용을 개선합니다.
python#총 댓글 수, 10개의 댓글로 구성된 페이지 comment_num = input("블로그에 댓글 수를 입력하세요.: ") comment_num = int(comment_num) luck_fans_num = input("키보드에 당첨된 팬의 수를 입력하세요.: ") luck_fans_num = int(luck_fans_num) #몇 페이지의 댓글이 몇 번 순환하는지 for index in range(0, int(comment/10)): ... #5 명의 행운의 팬을 추첨한다고 가정합니다. for index in range(0,luck_fans_num): ...
- 사용자 환경을 개선하기 위해 애플리케이션에 고정되어 있던 json 데이터 링크를 사용자가 입력하도록 변경하고 동적 접합을 위해 페이지 매개변수 값을 %s로 변경했습니다.
pythonfrom urllib.parse import urlparse, parse_qs ... JSON_path = input("블로그에 댓글의 JSON 데이터 렌더링 경로를 키보드(페이지)에 입력하세요.=%s): ") # URL 파싱 parsed_url = urlparse(JSON_path) # 쿼리 매개변수 추출 query_params = parse_qs(parsed_url.query) # 페이지 필드의 값을 가져옵니다. 다음으로 바꾸세요.%s동적 접합 page_value = query_params.get('page', [''])[0] JSON_path = JSON_path.replace("page=" + str(page_value),"page=%s")
- 페이지를 디버깅하는 과정에서 유효한 댓글이 10개가 넘으면 JSON 데이터 인터페이스가 댓글 페이지 끝에 첫 페이지와 똑같은 더티 데이터를 10개 더 렌더링하므로 첫 페이지를 가져올 때 건너뛰어야 한다는 것을 알 수 있습니다.
python#10보다 큰 댓글은 더러운 데이터를 렌더링하고 데이터의 첫 페이지를 가져올 수 없습니다. if int(comment_num) >= 10: dirty_data_index = 1 else: dirty_data_index = 0 for index in tqdm(range(dirty_data_index, page_num),desc='럭키 드로우',ncols=80): ...
- 또한 최종 결과에서 동일한 이름이 두 개가 나오지 않도록 추첨에서 약간의 가중치 제거를 수행합니다.
pythonfinal_nums = [] #5 명의 행운의 팬을 추첨한다고 가정합니다. for index in range(0,luck_fans_num): luck_fan = random.choice(nums) if luck_fan not in final_nums: final_nums.append(luck_fan) else: index = index - 1 continue
- 파이인스톨러를 사용하여 프로그램을 .exe 파일로 패키징하고, 소프트웨어나 환경을 다운로드하여 설치할 필요 없이 클릭하여 실행하면 플래시백 효과와 유사하게 프로그램이 실행 직후 종료되므로 메인 함수 뒤에 time.sleep()을 추가하여 프로그램 종료 시간을 지연시킬 수 있습니다.
포장 튜토리얼은 아래에 있습니다:
python#패키지 프로그램은 5분 동안 계속 표시된 후 자동으로 닫힙니다. time.sleep(300)
- 이 시점에서 해당 JSON 데이터 링크를 찾아서 페이지 매개변수 값을 %s로 수동으로 변경해야 하며, 여기서는 프로그램에서 페이지 매개변수 값이 %s로 자동 변경되는 것을 자동으로 처리하여 사용자 경험을 개선해야 합니다.
pythonJSON_path = input("블로그 댓글에 JSON 데이터 렌더링 경로를 입력하세요.: ") # URL 파싱 parsed_url = urlparse(JSON_path) # 쿼리 매개변수 추출 query_params = parse_qs(parsed_url.query) # 페이지 필드의 값을 가져옵니다. 다음으로 바꾸세요.%s동적 접합 page_value = query_params.get('page', [''])[0] JSON_path = JSON_path.replace("page=" + str(page_value),"page=%s")
- 그러나 일부 사용자는 기초가 약하여 json 링크를 찾는 것이 번거롭다는 점을 고려할 때 블로그 링크를 직접 입력하여 프로그램을 실행할 수 있다면 좋으며이를 정리해야합니다. 실제로 각 글의 json 링크가 실제로 한 곳에서 다른 것을 찾을 수 있습니다.
- 단락 앞의 URL이 고정되어 있고 다른 패스 매개 변수의 수로 인해 다른 API 인터페이스가 발생하여 다른 페이지에 액세스하고 블로그 링크를 통해 프로그램을 직접 실행하고 싶으므로 블로그 링크를 관찰하면 기사 ID와 JSON 링크 수가 동일하다는 것을 알 수 있습니다!
- 따라서 게시물 ID를 입력하고 다음에 연결하여 JSON 경로를 검색하는 지루한 작업을 피할 수 있습니다.
pythonblog_id = input("블로그 아이디를 입력하세요.: ") blog_url = "https://blog..net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold" ... url = blog_url % (index)
- 일부 사용자는 아이디를 찾기위한 경로의 요구 사항이나 너무 많은 문제가 있다고 생각하며, 기사의 전체 경로를 직접 입력 할 수 있다면 더 편리하고 더 편리하므로 프로그램이 자동으로 기사 아이디에서 경로를 추출하도록 준비해야합니다.
pythonblog_id = input("블로그 주소 또는 블로그 아이디를 입력하세요.: ") #입력 블로그 주소 구문 분석, 고급 문서 ID parsed_url = urlparse(blog_id) path = parsed_url.path # 대상 문자열 추출 blog_id = path.split('/')[-1] blog_url = "https://blog..net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold"
- 일부 사용자는 콘솔 로딩 출력이 밋밋하다고 느낄 수 있으므로 다음과 같이 동적 로딩 막대를 추가하세요:
pythonfrom tqdm import * ... for index in tqdm(range(dirty_data_index, page_num),desc='럭키 드로우',ncols=80): ...
- 일부 사용자는 다시 말하지만 접힌 댓글도 댓글이며 사람들이 헛된 댓글을 달 수 없으며 더 많은 팬에게 최고의 혜택을 전달하기 위해 접힌 댓글도 상금 풀에 추가되기를 원하며이를 달성 할 수 있습니다.
- 물론 실제로 접힌 주석이 될 수 있고 접히지 않는 json 데이터 연결은 접기 매개 변수 값의 경로의 차이 일 뿐이며 이미 메서드를 처리하는 동일한 방법을 얻을 수 있으며, 전체 본문을 볼 수있는 특정 코드를 얻을 수 있습니다.
V. 마지막으로, 온전해지기 위해
pythonimport json import math import random import time import requests from urllib.parse import urlparse, parse_qs from tqdm import * def main(): nums = [] nums_fold = [] content_fold = [] blog_id = input("블로그 주소 또는 블로그 아이디를 입력하세요.: ") # 입력 블로그 주소 구문 분석, 고급 문서 ID parsed_url = urlparse(blog_id) path = parsed_url.path # 대상 문자열 추출 blog_id = path.split('/')[-1] blog_url = "https://blog..net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=unfold" # fold 접기를 대신하여 의견 blog_url_fold = "https://blog..net/phoenix/web/v1/comment/list/" + str(blog_id) + "?page=%s&size=10&fold=fold" # 총 댓글 수, 10개의 댓글로 구성된 페이지 comment_num = input("블로그에 총 댓글 수를 입력하세요.: ") page_num = math.ceil(int(comment_num) / 10) luck_fans_num = input("상품을 받을 팬 수를 입력하세요.: ") luck_fans_num = int(luck_fans_num) editior_name = input("추첨에 참여하지 않을 사용자의 닉네임을 입력하세요.: ") fold_into_unfold = input("접힌 댓글을 상금 풀에 추가할지 여부는 어떻게 되나요?: ") print() #10보다 큰 댓글은 더러운 데이터를 렌더링하고 데이터의 첫 페이지를 가져올 수 없습니다. if int(comment_num) >= 10: dirty_data_index = 1 else: dirty_data_index = 0 for index in tqdm(range(dirty_data_index, page_num),desc='럭키 드로우',ncols=80): # 예시 URL: "https://blog..net/phoenix/web/v1/comment/list/132666427"?page=3&size=10&fold=unfold url = blog_url % (index) url_fold = blog_url_fold % (index) # HTML 요청 보내기 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0", } #해당 데이터 응답을 가져 와서 수요에 따라 해당 json 데이터를 추출합니다. response = requests.post(url, headers=headers) response_fold = requests.post(url_fold, headers=headers) html = response.text html_fold = response_fold.text json_data = json.loads(html) json_data_fold = json.loads(html_fold) list = json_data["data"]["list"] list_fold = json_data_fold["data"]["list"] for item in list: # 댓글 영역에서 각 팬의 사용자 닉네임을 가져오고 하위 필드가 아닌 정보 필드를 가져옵니다. user_name = item["info"]["nickName"] # 블로거 자신의 댓글은 추첨에 참여하지 않습니다. if user_name == editior_name: continue else: nums.append(user_name) for item in list_fold: # 댓글 영역에서 각 팬의 사용자 닉네임을 가져오고 하위 필드가 아닌 정보 필드를 가져옵니다. user_name = item["info"]["nickName"] content = item["info"]["content"] # 블로거 자신의 댓글은 추첨에 참여하지 않습니다. if user_name == editior_name: continue else: nums_fold.append(user_name) content_fold.append(content) print() if fold_into_unfold == 'y' or fold_into_unfold == 'Y': result = "추첨 참가자 목록은 다음과 같습니다.:" + ', '.join(nums + nums_fold) print(str(int(comment_num) - len(nums) - len(nums_fold)) + " 댓글은 같은 건물에 표시되며 총 접힌 수 "+ str(len(nums + nums_fold))+ " 경품 추첨에 대한 의견 "+ ' ') else: result = "추첨 참가자 목록은 다음과 같습니다.:" + ', '.join(nums) print("전체 "+ comment_num + " 댓글, 어느 "+ str(len(nums_fold)) + " 댓글이 접혀 있습니다., " + str( int(comment_num) - len(nums) - len(nums_fold)) + " 댓글은 같은 건물에 표시되며 총 "+ str(len(nums)) + " 댓글은 행운권 추첨에 참여할 수 있습니다 "+ ' ') result_content_fold = "재방문을 포함하여 댓글이 너무 짧기 때문에 댓글 내용이 무의미하고 다른 경우에는 다음과 같이 댓글이 접혔습니다.:" + ' | '.join(content_fold) print(result_content_fold + ' ') print(result + ' ') final_nums = [] if fold_into_unfold == 'y' or fold_into_unfold == 'Y': nums_jiangchi = nums + nums_fold else: nums_jiangchi = nums # 5 명의 행운의 팬을 추첨한다고 가정합니다. for index in range(luck_fans_num): luck_fan = random.choice(nums_jiangchi) if luck_fan not in final_nums: final_nums.append(luck_fan) else: index = index - 1 continue print(" + str(index + 1) + "행운의 팬은 다음과 같습니다.>>>>>> " + luck_fan) if __name__ == '__main__': main() # 패키지 프로그램은 5분 동안 계속 표시된 후 자동으로 닫힙니다. time.sleep(300)
업데이트 로그
- 2023-09-08 23:46 블로그 버전 1.0이 출시되었습니다!
1. 기본 복권 기능 완료.
- 2023-09-10 0:26 버전 1.1 코드 로직 최적화
1. 작성자가 추첨에 참여하지 않는 기능 추가
2. 더티 데이터 렌더링 문제 수정
3. 사용자 경험을 개선하기 위해 출력 문을 최적화했습니다.
- 2023-09-10 15:36 버전 1.2 코드 로직 최적화
1. 획득한 JSON 데이터 링크를 키보드를 통해 입력합니다.
2. 프로그램을 .exe 파일로 패키징하고 소프트웨어나 환경을 다운로드하여 설치할 필요 없이 클릭하여 실행합니다.
- 2023-09-10 18:15 버전 1.3 코드 로직 최적화
1. 문서 ID를 입력하여 실행의 전체 로직을 완성하여 구현합니다.
2. 출력 문 최적화
- 2023-09-11 14:28 버전 1.4 코드 로직 최적화
1. 지원팀에서 문서의 전체 경로를 직접 입력하면 프로그램에서 자동으로 문서 ID를 추출합니다.
2. 새로운 동적 로딩 바 효과
3. 접힌 댓글을 추가하는 기능을 추가하고 더 자세한 데이터 표시를 추가합니다.
요약
기사가 도움이 되었거나 기사의 작성자가 나쁘지 않다고 생각되면 관심, 칭찬, 수집 지원을 클릭하여 교환 및 비판의 메시지를 남길 수 있습니다.





