selenium scrapy 에서 의 사용 코드

4664 단어 scrapyselenium
scrapy 프레임 워 크 를 통 해 일부 사이트 데 이 터 를 추출 할 때 페이지 동적 데이터 로 딩 하 는 상황 이 발생 합 니 다.scrapy 를 직접 사용 하여 url 에 요청 하면 그 부분 동적 으로 불 러 온 데이터 값 을 절대 얻 을 수 없습니다.그러나 관찰 을 통 해 브 라 우 저 를 통 해 url 요청 을 하면 해당 하 는 동적 으로 불 러 온 데 이 터 를 불 러 옵 니 다.그러면 scrapy 에서 도 동적 으로 불 러 온 데 이 터 를 가 져 오 려 면 selenium 을 사용 하여 브 라 우 저 대상 을 만 든 다음 이 브 라 우 저 대상 을 통 해 전송 을 요청 하고 동적 으로 불 러 온 데이터 값 을 가 져 와 야 합 니 다.본 고 는 selenium 이 scrapy 에서 의 사용 에 중심 을 두 고 구체 적 인 내용 은 다음 과 같다.
사용 목적
왕 이 뉴스의 국내,국제,군사,항공 4 면 을 탈취 한 뉴스.테스트 에서 각 판 의 뉴스 가 동적 으로 불 러 온 것 을 발 견 했 습 니 다.직접 기어 가서 가 져 올 수 없 으 면 selenium 을 사용 하여 이 부분의 데 이 터 를 가 져 오 는 데 도움 을 줍 니 다.
코드
spider

import scrapy
from selenium import webdriver
from wangyiPro.items import WangyiproItem

class WangyiSpider(scrapy.Spider):
    name = 'wangyi'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['https://news.163.com/']
    model_url = []

   
    hro = webdriver.Chrome()

    def parse(self, response):
    #                4   
        li_list = response.xpath('/html/body/div[1]/div[1]/div[2]/div[2]/div[2]/div[2]/div/ul/li')
        indexs = [3,4,6,7]
        for index in indexs:
            model_li = li_list[index]
            model_list = model_li.xpath('./a/@href').extract_first()
            self.model_url.append(model_list)
        for url in self.model_url:
            yield scrapy.Request(url=url,callback=self.parse_model)

    #     :    +      url(      )
    def parse_model(self,response):
        #    response         (      )
        #                     
        #                        ,                 
        div_list = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div')
        for div in div_list:
            title = div.xpath('./div/div[1]/h3/a/text()').extract_first()
            new_url_detail = div.xpath('./div/div[1]/h3/a/@href').extract_first()

            if new_url_detail:
                item = WangyiproItem()
                item['title'] = title


                yield scrapy.Request(url=new_url_detail,callback=self.parse_detail,meta={'item':item})


    def parse_detail(self,response):
        #      ,          
        content = response.xpath('/html/body/div[3]/div[1]/div[3]/div[2]/p/text()').extract()
        content = ''.join(content)
        item = response.meta['item']
        item['content'] = content

        yield item

    #          ,                 
    def closed(self,spider):
        #   selenium    
        self.hro.quit()
middlewares

from time import sleep
from scrapy.http import HtmlResponse#scrapy       

class WangyiproDownloaderMiddleware:


    def process_request(self, request, spider):

        return None

    #          
    #          :1+4+n        
    def process_response(self, request, response, spider):
        #           4         
        if request.url in spider.model_url:
            hro = spider.hro
            hro.get(request.url)
            sleep(2)
            #       ,          
            hro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
            sleep(1)
            page_text = hro.page_source
            # response.text = page_text
            #           
            return HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)

        #              ,    
        else:
            return response

    def process_exception(self, request, exception, spider):

        pass
효과.
在这里插入图片描述
총결산
  •   hro = webdriver.Chrome()저 는 Chromedriver 를 설정 파일 에 직접 기록 하기 때문에 대상 을 직접 예화 하면 됩 니 다.설정 파일 을 쓰 지 않 으 면hro = webdriver.Chrome(executable_path=' ')로 쓰 십시오.Chromedriver 를 pycharm 파일 에 상대 경 로 를 기록 하려 고 시 도 했 지만 성공 하지 못 했 습 니 다.
  • selenium 을 사용 하여 종료 후 닫 아야 합 니 다.파충류 의 부 류 를 바 꾸 는 방법 closed()
  • settings 에서 세 세트 를 수정 하고 다운로드 미들웨어 와 items
  • 를 엽 니 다.
    이상 은 selenium 이 scrapy 에서 어떻게 사용 하 는 지 에 대한 상세 한 내용 입 니 다.scrapy 에서 selenium 을 사용 하 는 지 에 관 한 자 료 는 다른 관련 글 에 주목 하 세 요!

    좋은 웹페이지 즐겨찾기