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' (.+?)<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' (.+?)<br />', 'findall', html_nextchapter))
for text in findall_article:
open_file.write(text + '
')
time.sleep(1)
print(' ')
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.