查看原文
其他

【视频讲解】在scrapy框架中如何使用selenium?

2017-09-20 大邓 大邓带你玩python

如何在scrapy中使用selenium

上一个文章已经分享了scrapy的settings.py、spider爬虫(spider文件夹中的爬虫)、items.py、pipelines.py,但没有讲解middleware.py。

middleware,翻译过来叫做中间件,有中间这个词语,可以认为是在两个功能之间的的意思。我对中间件的理解也不是特别深,就拿研究了两天的成果,作为本期的内容。

我想使用selenium的phantomjs来爬目标网站的数据,那么scrapy如何与phantomjs来结合起来使用呢?

这里就用到了中间件。其中spider部分基本不怎么改动,只有很小的改动。只有middleware.py和settings.py有改动。

我觉得scrapy这种框架性的东西,想用文字加图片很难生动的将功能展示出来,今天还是录制一个视频,简单的将使用方法和代码功效展示出来。

https://v.qq.com/txp/iframe/player.html?vid=z0552kweji8&width=500&height=375&auto=0

settings

取消DOWNLOADER_MIDDLEWARES的注释,让自定义的下载中间件正常使用。

DOWNLOADER_MIDDLEWARES = {    'baidu.middlewares.MyCustomDownloaderMiddleware': 543, }

spider部分(本例中是bd.py)

主要是在请求时,在请求中加入暗号,中间件那里接到指定的暗号就执行。比如我在请求中加入参数是“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.py

在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)



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存