python 소설 파충류 실 록 만 들 기

나의 첫 번 째 파충류 프로그램 을 기념 하여 모두 세 개의 낮 을 썼 는데 그 중에서 두 개의 오전 을 보지 못 했 고 중간 에 각종 이상 한 문제 에 부 딪 혔 다.그들의 해결 과 함께 기본 적 인 조작 에 대해 서도 알 게 되 었 다.역시 이런 것들 에 대한 가장 좋 은 학습 방식 은 바로 사용 중 에 공부 하고 문 제 를 해결 하 는 방식 으로 이런 지식 을 해결 하 는 것 이다.필요 에 따라 요구 해야만 더욱 목적 성 을 가 질 수 있다.
전체 과정 을 대충 기록 하 다.
--------------------------------------------------------------------------------
구상 을 준비 하 다
python 에 대한 사랑 때문에 연습 하 는 프로젝트 를 시도 하고 싶 지만 책 을 읽 든 다른 사람의 프로젝트 를 직접 시도 하 든 결국은 끊임없이 복사 붙 여 넣 기 로 전락 합 니 다.가장 실제 적 인 것 은 자신 이 직접 코드 를 쓰 는 것 입 니 다.사고방식 은 모두 같 지만 구체 적 인 실현 은 자신 에 게 의지해 야 한다.
예전 의 복사 붙 여 넣 기 가 나 에 게 준 도움 은 바로 나 에 게 대체적인 절 차 를 알려 준 것 이다.
목표 사이트 주소 확인
목표 사이트 가 관건 이다.제 가 꿈 꾸 는 파충 류 는 더욱 스마트 한 경향 이 있 습 니 다.그 에 게 얻 고 싶 은 키 워드 를 직접 주 고 한 걸음 한 걸음 의 절 차 를 직접 완성 할 수 있 습 니 다.범 위 를 정 할 수도 있 고 인터넷 전 체 를 직접 기어 올 라 갈 수도 있 습 니 다.그러나 현재 제 가 본 파충 류 는 모두 목표 사이트 의 주 소 를 정 하 는 것 입 니 다.목표 페이지 의 내용 을 통 해 규정된 조작 을 계속 수행 하기 때문에 지금 보면 우 리 는 파충 류 를 쓰기 전에 기준 페이지 를 확인 해 야 한다.이것 은 우리 가 사전에 제정 해 야 하 는 것 이다.프로그램 이 어떤 기능 을 수행 해 야 하 는 지,페이지 텍스트 를 가 져 오 는 지,링크 내용 을 가 져 오 는 지,아니면 다른 목적 을 가 져 오 는 지 고려 합 니 다.
내 가 이 프로그램 에서 얻 고 싶 은 것 은《검 래》소설 로 각 장의 내용 을 기어 가서 다운로드 하여 파일 에 저장 하 는 것 이다.
프로 그래 밍 은 목적 을 실현 하 는 도구 일 뿐이다.
그래서 중요 한 것 은 우리 의 수 요 를 분석 하 는 것 이다.
소설 목록 페이지 를 가 져 오 는 것 은 기본 입 니 다.여기 에는 각 장의 링크,제목 등 내용 이 있다.이것 은 우리 가 필요 로 하 는 것 이다.
각 장의 링크 가 있 으 면 그 안에 들 어가 각 장의 내용 을 얻어 야 한다.
그래서 우 리 는 페이지 내용 을 얻어 야 하고 그 중에서 목표 내용 을 얻어 야 한다.
그래서 urllib.request,re 라 이브 러 리 를 사용 합 니 다.
전 자 는 웹 페이지 의 내용 을 얻 고 후 자 는 목표 정 보 를 얻는다.
headers
urllib.request 의 urlopen()을 직접 사용 하고 read()방법 은 다음 과 같은 오 류 를 보고 합 니 다.

raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden
urllib 2.HTTPError:HTTP Error 403:Forbidden 오류 가 발생 한 것 은 사이트 에서 파충류 가 금지 되 어 있 기 때문에 요청 에 머리 정 보 를 추가 하여 브 라 우 저 로 위장 할 수 있 습 니 다.

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'}
request = url_req.Request(url, headers=headers)
response = url_req.urlopen(request, data=None, timeout=3)
html = response.read().decode('GBK')
주의:여기 문제 가 생기 기 쉬 운 두 가지 가 있 습 니 다.
•인 코딩:인 코딩 문 제 는 파충류 사용 중 가끔 골 치 아 픈 문제 입 니 다.웹 소스 코드 인 코딩 형식 이 명확 하지 않 아 오랫동안 시도 해 봤 습 니 다.
chardet 라 이브 러 리 의 detect()방법 을 사용 하면 바이트 문자열 의 인 코딩 을 검사 할 수 있 습 니 다.그래서 여기 html 를 직접 검사 합 니 다.출력 은 GB 2312 이지 만 뒤쪽 페이지 에서 기어 오 르 는 중 일부 문자 의 인 코딩 이상 이 나타 나 므 로 그 범위 보다 넓 은 중국어 문자 집합 GBK 를 사용 하여 이 문 제 를 해결 하 였 습 니 다.
•시간 초과 범위 설정:웹 페이지 내용 을 자주 가 져 오기 때문에 대상 사이트 에 응답 하지 않 는 문제 가 발생 할 수 있 습 니 다.
(이 문 제 는 제 가 CSDN 에서 질문 한 것 을 볼 수 있 습 니 다.python 파충류 프로그램 이 중간 에 멈 춘 문제 에 관 한 것 입 니 다)
그래서 저 는 urlopen()의 socket.timeout 이상 을 캡 처 하고 이상 이 생 겼 을 때 대상 페이지 를 얻 을 때 까지 반복 적 으로 방문 합 니 다.
목표 내용 획득
여기 서 사용 하 는 것 은 정규 표현 식 입 니 다.re 모듈.이곳 의 사용 은 결코 복잡 하지 않다.
우선 패턴 문자열 이 필요 합 니 다.re.I 로 대소 문 자 를 무시 하고 컴 파일 된 대상 이 일치 하 는 방법 을 지정 합 니 다.여 기 는 findall()을 사용 하여 모든 결과 로 구 성 된 목록 을 되 돌려 줍 니 다.출력 내용 을 제때에 되 돌려 적당 한 부분 을 선택 하여 처리 할 수 있다.
python 정규 표현 식
관련 기 호 를 보면 서(.+?)탐욕 이 아 닌 모드(가능 한 한 적은)에서 임의의 무한 문 자 를 사용 하고 괄호 안의 모드 와 일치 합 니 다.
파일 기록
with open()as file:을 사용 하여 파일 을 처리 할 수 있 습 니 다.또한 파일 을 열 고 닫 는 것 을 자동 으로 실행 할 수 있어 더욱 편리 하고 안전 합 니 다.with open(findall_title[0] + '.txt', 'w+', encoding='utf-8') as open_file:•여기 도 인 코딩 문제 에 주의 하여 utf-8 을 지정 합 니 다.몇 가지 문 제 를 피 할 수 있 습 니 다.
•여 기 는 w+모드 를 사용 하여 파일 을 추가 로 씁 니 다.
전체 코드

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 11 16:31:42 2017
@author: lart
"""

import urllib.request as url_req
import re, socket, time


def r_o_html(url):
  print('r_o_html begin')

  headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:55.0) Gecko/20100101 Firefox/55.0'}

  request = url_req.Request(url, headers=headers)

  NET_STATUS = False
  while not NET_STATUS:
    try:
      response = url_req.urlopen(request, data=None, timeout=3)
      html = response.read().decode('GBK')
      print('NET_STATUS is good')
      print('r_o_html end')
      return html
    except socket.timeout:
      print('NET_STATUS is not good')
      NET_STATUS = False

def re_findall(re_string, operation, html):

  print('re_findall begin')
  pattern = re.compile(re_string, re.I)

  if operation == 'findall':
    result = pattern.findall(html)
  else:
    print('this operation is invalid')
    exit(-1)

  print('re_findall end')
  return result


if __name__ == '__main__':
  url_base = 'http://www.7kankan.la/book/1/'

  html = r_o_html(url_base)

  findall_title = re_findall(r'<title>(.+?)</title>', 'findall', html)

  findall_chapter = re_findall(r'<dd class="col-md-3"><a href=[\',"](.+?)[\',"] title=[\',"](.+?)[\',"]>', 'findall', html)

  with open(findall_title[0] + '.txt', 'w+', encoding='utf-8') as open_file:
    print('article    ', findall_chapter)
    for i in range(len(findall_chapter)):
      print(' ' + str(i) + ' ')

      open_file.write('

\t' + findall_chapter[i][1] + '
---------------------------------------------------------------------
') url_chapter = url_base + findall_chapter[i][0] html_chapter = r_o_html(url_chapter) findall_article = re_findall(r'&nbsp;&nbsp;&nbsp;&nbsp;(.+?)<br />', 'findall', html_chapter) findall_article_next = findall_chapter[i][0].replace('.html', '_2.html') url_nextchapter = url_base + findall_article_next html_nextchapter = r_o_html(url_nextchapter) if html_nextchapter: findall_article.extend(re_findall(r'&nbsp;&nbsp;&nbsp;&nbsp;(.+?)<br />', 'findall', html_nextchapter)) for text in findall_article: open_file.write(text + '
') time.sleep(1) print(' ')

좋은 웹페이지 즐겨찾기