其他
【视频讲解】在scrapy框架中如何使用selenium?
如何在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)