使用scrapy结合selenium和PhantomJS抓取动态内容,感觉是多余的?
爬虫初学者的疑问
看了scarpy框架图,有个疑问。
如果在DownloadMiddleware中添加selenium+PhantomJS抓取动态内容的话,事实上等于发了两次请求,一次请求由Scrapy发,另一次请求由selenium发出,这样第一个是不是有点多余,而且还降低了效率,我这个说法对吗?
麻烦请各位大神解答。如果,的确冗余,除了单独用selenium和PhantomJS来抓取以外,结合scrapy有什么方法能通过代码的方式,让Scrapy不发请求?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(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