바이두 백과 사전 항목 페이지를 크롤링 간단한 파이썬 파이썬 파충류

객관적인 분석 :
목표 : 바이두 백과 사전 항목 관련 용어 파이썬 웹 - 제목 및 소개

항목 페이지 : 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 재현

추천

출처blog.csdn.net/weixin_34008805/article/details/94197020