--Scrapy에서 셀레늄의 파이썬 웹 크롤러 사용

도입

  • 데이터가 scrapy 프레임 워크를 통해 크롤링 특정 웹 사이트를 만들 때, 종종 자신의 요청이 직접 scrapy URL을 전송하는 경우 동적 데이터가 일어날 페이지가로드 될 때 발생 절대적으로 데이터 값의 동적 로딩에서 그 부분을 얻을 수 없습니다. 그러나, 우리가 관찰하는 결과, 그것은 브라우저 URL을 통해 수행되는 동적 로딩에 상응하는 요청 된 데이터를로드한다. 우리는 또한 동적으로 scrapy에서로드 된 데이터를 얻을하려는 경우, 당신은 동적으로로드 된 데이터 값을, 그 요청은 브라우저 객체에 의해 전송 된 브라우저 객체를 생성, 검색하는 셀레늄을 사용해야합니다.

세부 오늘

1. 사례 연구 :

    국내, 국제, 군사의 NetEase는 뉴스에서 크롤링 뉴스 데이터, 무인 항공기 분야 : 수요 -

    - 수요 분석 : 당신이 국내 국내 해당 페이지로 들어갑니다 하이퍼 링크를 클릭하면 직접 프로그램에 의해 URL에 대한 요청이 뉴스 데이터의 동적로드보다 더 적은을 얻을 경우, 뉴스 데이터를 동적으로 밖으로로드 보여 현재 페이지를 찾을 수 가. 우리는 당신이 동적으로로드 뉴스 데이터를 해당 개체에 URL을 요청, 브라우저 개체를 인스턴스화하는 데 필요한 셀레늄을 사용합니다.

분석에 사용 2.selenium scrapy 원리 :

요청에 해당하는 엔진 제출 된 URL 국내 부문은 다운로드하는 경우, 다운로드 페이지 다운로드 데이터, 다음 엔진, 하위 거미에 엔진 응답에 제출 패키지에 대한 응답으로 페이지 데이터를 다운로드했습니다. 객체 거미에 저장된 페이지 응답 데이터는 데이터를 동적으로로드되는 위치에 어떤 소식을합니다. 동적으로로드 된 데이터의 뉴스를 얻으려면, 당신은 동적 데이터를로드에서 뉴스를 수행하도록 수정 내부적으로 저장의 페이지 데이터를 잘라 템퍼링, 다운로드 미들웨어에서 다운로드 엔진의 응답에 대한 응답으로 객체를 가로 챌 제출해야 다음 오브젝트 거미 해석 조작에 최종 응답 변조되었다.

scrapy의 과정에서 3.selenium 사용 :

  • (브라우저가 한 번만 객체를 인스턴스화하기 때문에) 생성자 크롤러 재정의 파일 브라우저 객체를 사용하여 셀레늄 과정에서 인스턴스화
  • 파충류 파일 (자기 스파이더)에있어서 닫힌 재작 내부 물체의 브라우저를 닫는다. 이 방법은 파충류의 끝에서 호출
  • 미들웨어 다운로드 process_response 방법 다시 쓰기 때문에 응답 객체에있어서 가로 페이지에 저장된 응답 데이터를 조작하기
  • 구성 파일에 다운로드 한 미들웨어를 엽니 다

예 4 :

#의 1.spider이 파일을 

가져 오기 Scrapy을
 에서 wangyiPro.items 가져 오기 WangyiproItem
 에서 셀레늄 가져 오기 webdriver의 

클래스 WangyiSpider (scrapy.Spider) : 
    이름 = ' wangyi ' 
    # allowed_domains = [ 'www.xxx.con'] 
    start_urls = [ ' HTTP : // www.xxx.con / ' ]
     #는 브라우저를 동작시키는 실행 인스턴스화 번만 
    브로 = webdriver.Chrome (executable_path = ' chromedriver.exe ' ) 

    의 URL = [] # 최종 판 (5)가 해당 URL에 저장된 

    DEF파스 (자동 응답) 
        li_list = response.xpath ( ' [. 1] // * @ ID = "index2016_wrap"] / 된 div / 된 DIV [2] / DIV [2] / DIV [2] / DIV [2] / DIV / UL / 리 ' )
         에 대한 색인 에서 [3,4,6,7,8 :] 
            리튬 = li_list [인덱스] 
            NEW_URL = li.xpath ( ' ./a/@herf ' ) .extract_first () 
            자체. urls.append (NEW_URL) 

            # 송신 요구에 대응하는 URL을 다섯 개 부분의 
            수율 scrapy.Request (URL = NEW_URL 콜백 = self.parse_news) 

    # 뉴스 정보에 대응하는 각 데이터 부분을 파싱 만 [파싱 TITLE] 
    DEF = response.xpath ( parse_news (자동 응답) :
        div_list ' // 된 div [@의 클래스 = "ndi_main"] / DIV ' )
         에 대한 DIV div_list : 
            타이틀 (= div.xpath ' [. 1]에 ./div/div / H3 / A / 텍스트 () ' ) .extract_first ( ) 
            news_detail_url = div.xpath ( ' ./div/div[1]/h3/a/@href ' ) .extract_first ()
             # 인스턴스화 항목 객체, 객체에 저장된 제목과 내용 항목으로 해결할 
            항목 = WangyiproItem () 
            항목 [ ' 제목 ' ] = 제목
             # 의에게 정보 페이지의 URL을 수동으로 뉴스 콘텐츠에 대한 액세스 요청 
            수율scrapy.Request (URL = news_detail_url 콜백 = self.parse_detail 메타 = { ' 항목 ' : 품목}) 

    DEF parse_detail (자동 응답) 
        항목 = response.meta [ ' 항목 ' ]
         #에 通过응답解析出新闻内容 
        콘텐츠 response.xpath = ( ' // // DIV 텍스트 () [ID = "endText"@] ' ) .extract () 
        내용 = ' .join (콘텐츠) 

        항목 [ ' 콘텐츠 ' = 콘텐츠
         수율 항목 

    DEF 확대 ( 자기, 거미) :
         #파충류의 종료 후, 브라우저가 메서드 호출을 닫습니다 
        인쇄 ( ' 파충류 전반 종료 ~~~~~~~~~~~~~~~~~~~ ' ) 
        self.bro.quit을 ()
 ------ -------------------------------------------------- --------------------------------
 # 2.items 파일 

가져 오기 scrapy의 

클래스 WangyiproItem (scrapy.Item) :
     # (가) 상기 DEFINE 여기에 배경 화면 당신 같은 필드에 대한 항목 : 
    #의 이름 = scrapy.Field () 
    제목 = scrapy.Field () 
    내용 = scrapy.Field ()
 --------------------- -------------------------------------------------- -----------------
 # 3.middlewares 파일 

에서 scrapy가져 오기 신호
 에서 scrapy.http 가져 오기 HtmlResponse
 에서 시간 가져 오기 절전 

클래스 WangyiproDownloaderMiddleware (객체) : 

    DEF process_request (자체, 요청, 스파이더) :
         반환 없음 

    DEF의 process_response (자체, 요청, 응답, 거미) :
         #이 대응되는 개체를 결정 (5) 판, 만약 치료 객체에 대한 응답 
        IF response.url spider.urls :
             #의 가져 오기 파충류에 정의 된 브라우저 
            브로 = spider.bro 
            bro.get (response.url) 

            bro.execute_script ( 'window.scrollTo (0, document.body.scrollHeight) ' ) 
            SLEEP ( . 1 ) 
            bro.execute_script ( ' window.scrollTo (0, document.body.scrollHeight) ' ) 
            SLEEP ( . 1 ) 
            bro.execute_script ( ' window.scrollTo ( 0, document.body.scrollHeight) ' ) 
            SLEEP ( 1 ) 
            bro.execute_script ( ' window.scrollTo (0, document.body.scrollHeight) ' ) 
            SLEEP ( 1 ) 

            #이 페이지는 데이터의 뉴스 소스 데이터를 전달받을 
            page_text =bro.page_source
             # 实例化新的响应对象一个 
            new_response = HtmlResponse (URL = response.url 바디 = page_text 인코딩 = " UTF-8 " , 요청 = 요청)
             리턴 new_response
         다른 :
             반환 응답 

    데프 process_exception을 (자기, 요청 예외 거미)
         패스 
-------------------------------------------- -------------------------------------------- # 4.pipelines文件클래스 WangyiproPipeline (객체) :
     데프 process_item (자기, 항목, 거미) :
         인쇄 (항목)
        


반환 항목을
 ------------------------------------------------ ----------------------------------------
 # 5.setting文件 
BOT_NAME = ' wangyiPro ' 

SPIDER_MODULES = [ ' wangyiPro.spiders ' ] 
NEWSPIDER_MODULE = ' wangyiPro.spiders ' 

USER_AGENT = ' 모질라 / 5.0 (윈도우 NT 10.0; Win64를; 64) AppleWebKit / 537.36 (게코 같은 KHTML) 크롬 / 76.0.3809.132 사파리 / 537.36 ' 

ROBOTSTXT_OBEY = 거짓 

DOWNLOADER_MIDDLEWARES의 = {
    'wangyiPro.middlewares.WangyiproDownloaderMiddleware ' : 543 , 
} 

ITEM_PIPELINES = {
    ' wangyiPro.pipelines.WangyiproPipeline ' 300 , 
} 

, LOG_LEVEL, = " ERROR "

 

추천

출처www.cnblogs.com/bilx/p/11588038.html