selenium 與scrapy 聯合用法 淘寶爬蟲

 middlewares.pyhtml

# -*- coding: utf-8 -*-

# Define here the models for your spider middleware
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/spider-middleware.html

from scrapy import signals


class TaobaospiderSpiderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the spider middleware does not modify the
    # passed objects.

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_spider_input(self, response, spider):
        # Called for each response that goes through the spider
        # middleware and into the spider.

        # Should return None or raise an exception.
        return None

    def process_spider_output(self, response, result, spider):
        # Called with the results returned from the Spider, after
        # it has processed the response.

        # Must return an iterable of Request, dict or Item objects.
        for i in result:
            yield i

    def process_spider_exception(self, response, exception, spider):
        # Called when a spider or process_spider_input() method
        # (from other spider middleware) raises an exception.

        # Should return either None or an iterable of Response, dict
        # or Item objects.
        pass

    def process_start_requests(self, start_requests, spider):
        # Called with the start requests of the spider, and works
        # similarly to the process_spider_output() method, except
        # that it doesn’t have a response associated.

        # Must return only requests (not items).
        for r in start_requests:
            yield r

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

# 引入IgnoreRequest異常類
from scrapy.exceptions import  IgnoreRequest
# 引入response類
from scrapy.http import Response
from scrapy.http.response.html import HtmlResponse
from scrapy.http.response.text import TextResponse

# 引入selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import codecs
import time
# 自定義中間件
class CustomMiddleware(object):
    def process_request(self,request, spider):
        '''
        1.返回None,繼續交給其餘的中間件進行處理
        2.返回request對象,會將該請求從新調度發送,直到返回結果不是request爲止
        3.觸發異常,IgnoreRequest,默認會去執行process_exception函數
        4.返回一個response對象,以後的全部中間件中process_reqeust將不會再調用,會去執行中間的process_response函數
        '''
        url = request.url
        opt = Options()
        opt.add_argument('--headless')
        # 建立谷歌瀏覽器對象
        driver = webdriver.Chrome(options=opt)
        driver.get(url)

        # 讓瀏覽器滾動到底部
        for x in range(1,11,2):
            j = x / 10
            js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight*%f'%j
            driver.execute_script(js)
            # 每次滾動等待0.5s
            time.sleep(0.5)

        # driver.save_screenshot('123.png')
        # 獲取網頁源代碼
        page_source = driver.page_source
        # 退出

        driver.quit()

        # 根據網頁源代碼,建立htmlresponse對象
        # 由於返回的是文本內容,指定字符編碼格式
        response = HtmlResponse(url=url,body=page_source,encoding='utf-8',request=request)

        return response

    def process_response(self,request,response,spider):
        '''
        返回結果(必須返回):
        1.返回response,會將response交給下一個middleware進行處理
        2.返回request,中間件中止執行,會從新對這個請求進行調度,執行process_request處理函數
        3.觸發異常
        '''
        print('執行了process_response')
        return response

    def process_exception(self,request, exception, spider):
        # 觸發異常以後,須要對此次的請求作出相應操做
        print('執行了process_exception')

#
class NextMiddleware(object):

    def process_request(self,request,spider):

        print('////////////NextMiddleware--=---request')

    def process_response(self,request,response,spider):

        print('///////////NextMiddleware----->response')
        return response
相關文章
相關標籤/搜索