scrapy的架构图如下:
在下载组件和scrapy引擎中间有一个DownloaderMiddleware(下载中间件)中间件,通过修改这个中间件,使得scrapy通过无头浏览器来下载网页内容!
如左图所示,在这个文件里面修改scrapy中间件。
以下定义一个最简单的chrome浏览器来爬取网页!
class SeleniumMiddleware(object): def __init__(self): self.logger = getLogger(__name__) self.browser = webdriver.Chrome() self.browser.set_window_size(1400, 700) def __del__(self): """ 用于关闭浏览器 :return: """ self.browser.close() def process_request(self, request, spider): """ 用chrome抓取页面 :param request: Request对象 :param spider: Spider对象 :return: HtmlResponse """ self.logger.debug('Chrome is Starting') self.browser.get(request.url) content = self.browser.page_source.encode('utf-8') if content.strip() != '': return HtmlResponse(request.url, encoding='utf-8', body=content, request=request) return None @classmethod def from_crawler(cls, crawler): # This method is used by Scrapy to create your spiders. # Scrapy使用此方法创建您的蜘蛛。 return cls()
接下来就需要setting.py文件中开启这一个中间件:
DOWNLOADER_MIDDLEWARES = { 'taobao.middlewares.SeleniumMiddleware': 543, }
这里因为已经把下载的中间件设置为了自己自定义的,所以scrapy原本自带的下载中间件就不会再生效了。