上一个文章已经分享了scrapy的settings.py、spider爬虫(spider文件夹中的爬虫)、items.py、pipelines.py,但没有讲解middleware.py。
middleware,翻译过来叫做中间件,有中间这个词语,可以认为是在两个功能之间的的意思。我对中间件的理解也不是特别深,就拿研究了两天的成果,作为本期的内容。
我想使用selenium的phantomjs来爬目标网站的数据,那么scrapy如何与phantomjs来结合起来使用呢?
这里就用到了中间件。其中spider部分基本不怎么改动,只有很小的改动。只有middleware.py和settings.py有改动。
我觉得scrapy这种框架性的东西,想用文字加图片很难生动的将功能展示出来,今天还是录制一个视频,简单的将使用方法和代码功效展示出来。
取消DOWNLOADER_MIDDLEWARES的注释,让自定义的下载中间件正常使用。
DOWNLOADER_MIDDLEWARES = { 'baidu.middlewares.MyCustomDownloaderMiddleware': 543,}
主要是在请求时,在请求中加入暗号,中间件那里接到指定的暗号就执行。比如我在请求中加入参数是“TellMeWhoYouAre”,参数值为"DaDeng",如果中间件收到的这个暗号值是“DaDeng”,那么执行中间件。
本文是讲的scrapy中如何使用selenium,那么中间件部分就是selenium的执行。
from scrapy import Spider,Request
class BdSpider(Spider): name = 'bd' allowed_domains = ['baidu.com'] start_urls = ['http://baidu.com/'] def start_requests(self): url = 'https://www.baidu.com/s?ie=UTF-8&wd=%E8%B1%86%E7%93%A3fm' #Request中可以用meta传递参数。 meta = {'TellMeWhoYouAre':'DaDeng'} yield Request(url=url,callback=self.parse,meta=meta)
def parse(self, response): print(response.text)
在middleware代码如下。我是网上找到的,运行正常。
from scrapy import signals
from scrapy.http import HtmlResponse
from selenium import webdriver
class MyCustomDownloaderMiddleware(object):
def process_request(self, request, spider): #如果请求中参数值为DaDeng,执行下面的语句 if request.meta['TellMeWhoYouAre']=='DaDeng': #我不会将Phantomjs加到环境中,所以要在这里executable_path中写上路径 driver = webdriver.PhantomJS(executable_path='/Users/suosuo/Desktop/scrapy+selenium/phantomjs') driver.get(request.url) #对网页数据编码为utf-8 content = driver.page_source.encode('utf-8') driver.quit() print('大邓'*10000) print('===='*10000) #这里就这么写就行 return HtmlResponse(request.url, encoding='utf-8', body=content, request=request)
联系客服