使用scrapy结合selenium和PhantomJS抓取动态内容,感觉是多余的?

爬虫初学者的疑问
看了scarpy框架图,有个疑问。
如果在DownloadMiddleware中添加selenium+PhantomJS抓取动态内容的话,事实上等于发了两次请求,一次请求由Scrapy发,另一次请求由selenium发出,这样第一个是不是有点多余,而且还降低了效率,我这个说法对吗?
麻烦请各位大神解答。如果,的确冗余,除了单独用selenium和PhantomJS来抓取以外,结合scrapy有什么方法能通过代码的方式,让Scrapy不发请求?

clipboard.png

阅读 8.2k
1 个回答
新手上路,请多包涵

在settings.py加入

DOWNLOADER_MIDDLEWARES = {
'jdSpider.middlewares.middleware.JavaScriptMiddleware':543,#键为中间件类的路径,值为中间件的顺序
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware':None,#禁止内置的中间件
}

下面贴上,自定义中间件的代码:

fromseleniumimportwebdriver
fromscrapy.httpimportHtmlResponse
importtime

classJavaScriptMiddleware(object):

defprocess_request(self, request, spider):
ifspider.name =="jd":
print"PhantomJS is starting..."
driver = webdriver.PhantomJS() #指定使用的浏览器

driver = webdriver.Firefox()

driver.get(request.url)
time.sleep(1)
js = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js) #可执行js,模仿用户操作。此处为将页面拉至最底端。
time.sleep(3)
body = driver.page_source
print("访问"+request.url)
returnHtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)
else:
return

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进