객관적인 분석 :
목표 : 바이두 백과 사전 항목 관련 용어 파이썬 웹 - 제목 및 소개
항목 페이지 : HTTPS : //baike.baidu.com/item/Python/407313
URL 형식 :
- 엔트리 페이지 URL : / 아이템 / XXXX
데이터 형식 :
- 제목 :
*** <의 / H1> <DD 클래스 = "타이틀 lemmaWgt-lemmaTitle"> <의 H1> </ DD>
-简介:
<DIV 클래스 = "보조 정리 - 요약"> *** </ DIV>
페이지 코딩 : UTF-8
파충류 정문 파일
spider_main.py
#의 코딩 :. UTF 8 가져 오기 url_manager의 가져 오기 html_downloader의 가져 오기 html_parser의 가져 오기 html_outputer의 클래스 SpiderMain (객체) : DEF __init__ (자동) : #의 URL 관리자 self.urls = url_manager.UrlManager () #의 다운 self.downloader = html_downloader.HtmlDownloader ( ) #의 파서 self.parser = html_parser.HtmlParser () #의 출력 제어기 self.outputer = html_outputer.HtmlOutputer () DEF밥통 (자기, root_url) : #의 기록이 현재 번호 제 크롤링의 URL이다 . = 1 COUNT self.urls.add_new_url (root_url) # URL이 될 경우 크롤 동안 계속 루프 '' 동안 self.urls.has_new_url ( ) 은 try : NEW_URL = self.urls.get_new_url () 인쇄 '밥통의 %의 D : S %'% (COUNT, NEW_URL) # 다운로드 페이지 URL html_cont = self.downloader.download (NEW_URL) # URL이 수행 구문 분석 및 URL을 얻을 데이터 new_urls, new_data = self.parser.parse (NEW_URL, html_cont) # URL을 분석하고 데이터를 수집 self.urls.add_new_urls (new_urls) self.outputer.collect_data (new_data) IF COUNT> = 1000 : 브레이크 COUNT = + 1의 COUNT. 전자 AS 예외를 제외 : 인쇄 '밥통 실패' 인쇄 E '' ' while 회 self.urls.has_new_url을 () NEW_URL = self.urls.get_new_url () 인쇄 " 밥통 D % : % S ' % (COUNT, NEW_URL) #의 다운로드 페이지 URL html_cont = self.downloader.download (NEW_URL) #의 인쇄 html_cont의 # 데이터 URL의 구문 분석 및 취득 URL에 대한 new_urls을 new_data =self.parser.parse (NEW_URL, html_cont) #의 URL 분석하고 데이터를 수집 self.urls.add_new_urls (new_urls) self.outputer.collect_data (new_data) IF COUNT> = 10 : BREAK COUNT . COUNT = + 1 #의 특정 페이지에 출력 self.outputer.output_html () IF __name__ == " __main__ " : root_url = " https://baike.baidu.com/item/Python/407313 " obj_spider = SpiderMain () obj_spider.craw (root_url)
페이지 관리자
url_manager.py
#의 코딩 :. UTF 8 클래스 urlManager (객체) : DEF __init__ (자동) : #의 URL 크롤링 할 self.new_urls = SET () # 는 URL을 통해 크롤 링 self.old_urls = SET () DEF의 add_new_url (자체, URL ) : 경우 URL이 됩니다 : 없음 반환 #이 촬영 URL URL이 내부의 상승이나 내부를 크롤링 URL에 추가하지 않을 경우 IF URL을 하지 에서 self.new_urls 및 URL을 하지 에서 self.old_urls : self.new_urls.add를 ( URL) DEFadd_new_urls (자기, URL을) 하면 URL이 있습니다 없음 또는 LEN (URL을) == 0 반환 에 대한 URL 의 URL을 : self.add_new_url (URL) 데프 has_new_url (자동) : 반환 ! LEN (self.new_urls) = 0 데프 get_new_url (자동) : NEW_URL = self.new_urls.pop () self.old_urls.add (NEW_URL) 반환 NEW_URL
웹 다운
html_downloader.py
#의 코딩 : UTF-8 가져 urllib2가의 클래스 HtmlDownloader (객체) : 데프 다운로드 (자기, URL) : 경우 URL이 있습니다 없음 : 반환 없음 응답 = urllib2.urlopen (URL)의 경우 response.getcode () = 200! : 반환 없음 반환 response.read ()
웹 사이트 분석
html_parser.py
#의 코딩 : UTF-8 에서 BS4의 수입 BeautifulSoup로의 수입 을 다시 가져 오기 urlparse의 클래스 HtmlParser (객체) : 데프 _get_new_urls (자기, PAGE_URL, 스프) : # 得到所有的词条의 URL 링크 = soup.find_all ( ' ' , HREF = 재 .compile (R " /item/.* " )) #의 인쇄 링크 new_urls = () 설정 에 대한 링크 에서 : 링크 NEW_URL = 링크 [ ' HREF ' ] new_full_url = urlparse.urljoin (PAGE_URL, NEW_URL) new_urls.add (new_full_url) 반환 new_urls 데프 _get_new_data (자기, PAGE_URL, 스프) : res_data = {} #의 URL을 res_data [ ' URL ' ] = PAGE_URL # <DD 클래스 = "lemmaWgt-을 lemmaTitle 제목 "> # <H1> 파이썬 </ H1> title_node soup.find = ( ' DD ' , class_ = ' lemmaWgt-lemmaTitle 타이틀 ' ) .find ( " H1 " ) res_data [ ' 제목 ' = title_node.get_text () # <div 클래스 = "표제어-요약"라벨 모듈 = "lemmaSummary"> summary_node soup.find = ( ' DIV ' , class_ = " 표제어-요약 " ) res_data의 [ ' 요약 ' ] = summary_node.get_text () 반환 res_data는 데프 (자동, PAGE_URL, html_cont를) 구문 분석 : 경우 PAGE_URL가 없습니다 없음 또는 html_cont가 없습니다 없음 : 반환 수프= BeautifulSoup로 (html_cont, 'html.parser ' , from_encoding = " UTF-8 " ) new_urls = self._get_new_urls (PAGE_URL 수프) new_data = self._get_new_data (PAGE_URL 수프) 복귀 new_urls을 new_data
페이지 출력 장치
html_outputer.py
#의 코딩 : UTF-8 클래스 HtmlOutputer (객체) DEF __init__ (자기) self.datas = [] DEF collect_data (자기 데이터) 만약 데이터가 있다 : 없음 리턴 self.datas.append (데이터) #의 아스키 데프 output_html (자기) FOUT = 개방 ( ' output.html ' , ' w ' ) fout.write ( " <HTML> " ) fout.write를 ( " <body> ") fout.write ( " <표> " ) 에 대한 데이터 의 self.datas : fout.write ( " <TR> " ) fout.write ( " <TD> S % </ TD> " % 데이터 [ ' URL ' ] ) fout.write ( " <TD> S % </ TD> " % 데이터 [ ' 제목 ' ] 함수 .encode ( " UTF-8 " )) fout.write ( " <TD> S % </ TD> "데이터 % [ ' 요약 '] 함수 .encode ( " UTF-8 " )) fout.write ( " </ TR> " ) fout.write ( " / 표 " ) fout.write ( " / 바디 " ) fout.write ( " / HTML " )
코드를 실행합니다 :
결과 페이지
HTTPS : //www.cnblogs.com/reblue520/p/11083814.html 재현