HTML 페이지 및 대량 데이터 수집을 구문 분석 LXML 사용

우리가 웹에서 일부 데이터 요구를받을 필요가 때, 우리는 신속하게 데이터를 얻기 위해 일부 라이브러리를 HTML 웹 분석을 사용할 수 있습니다. 그래서 예를 들어 LXML, 아름다운 수프를 위해 사용할 HTML 페이지를 구문 분석하는 서드 파티 라이브러리의 다양한있다. 통계 데이터를 크롤링 LXML 예를 들어 아래 우리는 웹에서 필요한

나는 이후의 처리를위한 준비, 베이징 대중 교통 사이트에 베이징에서 모든 정보 라인을 얻으려면

웹 페이지에 액세스 요청에 대한 첫 번째 참조 요청, HTML 페이지는 원래 데이터를 얻기 위해

수입 요청

긴 LXML의 etree 클래스를 참조

수입 lxml.etree

먼저 우리가 출발점으로 입력 주소 버스 라인 웹 인덱스 페이지를 크롤링 시작 URL에 대응하는 모든 라인의 가치를

, 태그에 따라 나누어 HTML 페이지의 레이어를 lxml.etree 점차 트리 구조는, 우리는 태그가 해당 탭 XPath를 추출하는 기능을 사용하는 페이지의 소스 코드를 보면 우리의 데이터를 찾으려면 형성되고, 아래로 성장 데이터

데프 () get_all_line : 
    URL을 = ' http://beijing.gongjiao.com/lines_all.html ' 
    텍스트 = requests.get (URL)는 .text 
    문서 = lxml.etree.HTML (텍스트) 
    all_lines = doc.xpath ( " / / DIV / UL / 리 [클래스 = '에서'@] " ) 
    F = 개방 ( " ./data/ ' + ' allline.txt ' , ' ' )
     인쇄 (LEN (all_lines))
     에 대한 광고 all_lines : 
        LINE_NAME = line.xpath (" ./a/text () " ) [0] .strip () 
        line_url = line.xpath ( " ./a/@href " ) [0] 
        f.write (LINE_NAME + ' $$ ' + line_url + ' \ n ' ) 
    f.close ()

그래서 우리는 모든 라인이 기초 URL을 해당 얻을, 다음 페이지의 각 라인에 대한 관련 데이터를 크롤링하여 다음

라인 데이터를 크롤링하기 전에, 우리는 다른 분야, 관리가 용이를 저장하는 데이터 사전을 만들어야합니다. 필요한 경우, 나는 13 개 필드의 사전을 만들어

df_dict는 = {
 ' LINE_NAME ' [] ' line_url ' [] ' LINE_START ' [] ' line_stop ' []
 ' line_op_time ' [] ' line_interval ' [] ' line_price ' : , ' line_company ' []
 ' line_up_times은 ' [] ' line_station_up ' [] ' line_station_up_len ' [],
'line_station_down ' [] ' line_station_down_len ' [] 
}

 

우리가 생성 된 URL 데이터 파일의 모든 URL을 읽고, 다음과 같은 기능의 실현을위한 라인 데이터를 읽고

DEF : (라인) getbuslin 
    LINE_NAME = 라인 [: line.find ( ' $$ ' )] 
    line_url = 라인 [line.find ( ' $$ ' ) 2 :]
     #의 인쇄 (line_url) 
    URL = line_url의 
    텍스트 = 요청합니다. 는 .text (URL)를 얻을
     #의 인쇄 (LEN (텍스트)) 
    문서 = lxml.etree.HTML (텍스트) 
    정보를 정기적 = doc.xpath ( " // DIV [클래스 @ = 'gj01_line_header의 clearfix'] " )
     에 대한 정보 정보를 정기적으로 :
         #의 개방 F = ( "./ 데이터 /"+ LINE_NAME + '. TXT''에이')
        start_stop = info.xpath ( " ./dl/dt/a/text () " )
         #에 f.write ( '시작 스톱'+ start_stop + '\ n') 
        op_times = info.xpath ( " [./dl/dd 1] / B / 텍스트 () " )
         #에 f.write ("개방 시간 '+ op_times +'\ n ') 
        간격 = info.xpath ( " ./dl/dd [2] / 텍스트 () " )
         #의 F 에 .write ( '간격'N '\'+ 간격 +) 
        가격 = info.xpath는 ( " [3] / 텍스트 () ./dl/dd " )
         #에 f.write ( '가격'+ 가격 + '\ n' ) 
        기업 = 정보.XPath는 ( " ) ([4] / 텍스트 ./dl/dd ")
         #의 f.write ( '기업'+ 기업 + '\ n') 
        up_times = info.xpath ( " [5] / 텍스트 (./dl/dd) " ) 

        all_stations_up = doc.xpath ( ' // [UL @ 클래스 = "gj01_line_img의 JS해서 clearfix"] " )
         에 대한에서 all_stations_up : 
            station_up_name = station.xpath ( ' ./li/a/text () ' ) 
            df_dict [ ' line_station_up ' ]으로 .Append (station_up_name) 
            df_dict는 [ ' line_station_up_len ']으로 .Append (LEN (station_up_name))
             #에 f.write (STATION_NAME + '\ n') 
        
        all_stations_down = doc.xpath ( ' // UL [@ 클래스 = "gj01_line_img JS 다운 clearfix"] " )
         경우 LEN (all_stations_down) = = 0 :
             #의 인쇄 (LINE_NAME) 
            df_dict [ ' line_station_down ' ]으로 .Append ( '' ) 
            df_dict [ ' line_station_down_len ' ]으로 .Append (0) 

        를위한 기지국 all_stations_down : 
            station_down_name = station.xpath ( './li/a/text () ' ) 
            df_dict [ ' line_station_down ' ]으로 .Append (station_down_name) 
            df_dict [ ' line_station_down_len ' ]으로 .Append (LEN (station_down_name))
             #에 f.write (STATION_NAME + N'\ ') 
        #의 F. ) (근접 
        df_dict [ ' LINE_NAME ' ]으로 .Append (LINE_NAME) 
        df_dict [ ' line_url ' ]으로 .Append (line_url) 
        df_dict [ ' LINE_START ' ]으로 .Append (start_stop [0]) 
        df_dict [ ' line_stop를 ']으로 .Append (start_stop [1 ])
         의 경우 LEN (op_times) == 0 
            op_times.append (defaultoptime) 
        df_dict [ ' line_op_time ' ]으로 .Append (op_times [0]) 
        df_dict [ ' line_interval ' ]으로 .Append (간격 [0 [5 :]) 
        df_dict [ ' line_company ' [0] [5]으로 .Append (회사 ]) 
        df_dict [ ' line_price ' ]으로 .Append (가격 [0] [5 :]) 
        df_dict [ ' line_up_times ' ]으로 .Append (up_times [0] [5])

사전의 본질은 여전히 ​​목록이기 때문에, 운영 방법은 사전의 목록을 참조 할 수 있습니다

위아래로 모든 사이트, 터미널을 시작, 역, 터미널, 영업 시간, 격자 간격, 운임을 시작하기 전 웹에서 버스 라인의 라인의 이름을 추출

모든 데이터가 생성 사전에 저장 한 후, 팬더 라이브러리를 사용할 필요가 CSV 파일로 저장

수입 PD 등의 팬더 

DF = pd.DataFrame (df_dict) 
df.to_csv (이름 + ' .CSV ' 인코딩 = " UTF-8 " , 인덱스 = 없음)

이 때, 우리는 데이터 페이지 후속 처리를 위해 로컬에 저장됩니다 분석했습니다

데이터 버스 라인 때문에 때문에 전체 프로그램은 아직 몇 분을 필요로하는 데이터의 양이 상대적으로 적은 있지만 실시간 업데이트는 아래로, 상대적으로 정적 인 실행되지 것입니다

자, 내가하지 멀티 프로세스 치료를, 후속 멀티 프로세스를 최적화하는 데 필요한 시간을 단축하여 컴퓨터의 성능을 최대한 활용할 수 있습니다

 

추천

출처www.cnblogs.com/btc1996/p/11460235.html