目前phantomJS已经停止更新了,最新的selenium包在调用phantomJS时也发出了警告,说不再支持phantomJS了,可以用headless参数调用其他浏览器替代phantomJS。但是这个隐藏浏览器确实好用,况且也支持Windows,Linux,macOS。
下面给出一个通用的middleware,使得scrapy能够调用phantomJS实现动态网页爬虫。
middlewares.py
其中js是浏览器中要进行的操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
from scrapy import signals from selenium import webdriver from scrapy.http import HtmlResponse import time class JSMiddleware(object): def process_request(self, request, spider): driver = webdriver.PhantomJS("/Users/reacubeth/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs") # 指定使用的浏览器 driver.get(request.url) time.sleep(1) js = "var q=document.documentElement.scrollTop=10000" driver.execute_script(js) # 可执行js,模仿用户操作。此处为将页面拉至最底端。 body = driver.page_source print("访问" + request.url) return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request) |
js = "var q=document.documentElement.scrollTop=10000" 这个目的是将页面滑到浏览器最底端
如果页面是动态加载,即页面持续变长,没有底部的(如知乎),可以使用如下代码(250是预设的一个值):
1 2 3 4 |
js = "window.scrollTo(0,document.body.scrollHeight)" for i in range(250): driver.execute_script(js) time.sleep(random.randint(1, 3)) |
settings.py
在DOWNLOADER_MIDDLEWARES中添加:
1 |
'route_track.middlewares.JSMiddleware': 100, |
最前面的项目名称需要改动