最近在學(xué)爬蟲芥炭,在配置環(huán)境中遇到幾個麻煩晴股,有個困擾不短時間的就是pyspider 的安裝调榄。
這里把安裝完成的步驟捋一捋踊赠。我是在anaconda下的虛擬環(huán)境中安裝的,所以每庆,別的情況我不是很清楚筐带。
安裝
pycurl
$ pip install curl
安裝
pyspider
$ pip install pyspider
嘗試運行
$ pyspider
這里我就出問題了,顯示importError
缤灵,源碼里面使用了async
作為變量名伦籍,但是python3.7
以后async
已經(jīng)是關(guān)鍵字了蓝晒,所以會報錯。(因為我的虛擬環(huán)境是3.7帖鸦,懶得退了)
下面改動一下源碼修改
$ cd ~/anaconda3/envs/webspider/lib/python3.7/site-packages/pyspider
$ ack async
(ack是一個命令行的grep增強(qiáng)工具)
顯示如下:
run.py
231: async=True, get_object=False, no_input=False):
245: poolsize=poolsize, proxy=proxy, async=async)
365: webui_fetcher = ctx.invoke(fetcher, async=False, get_object=True, no_input=True, **fetcher_config)
fetcher/tornado_fetcher.py
81: def __init__(self, inqueue, outqueue, poolsize=100, proxy=None, async=True):
89: self.async = async
95: if self.async:
117: if self.async:
118: return self.async_fetch(task, callback)
120: return self.async_fetch(task, callback).result()
123: def async_fetch(self, task, callback=None):
155: return self.ioloop.run_sync(functools.partial(self.async_fetch, task, lambda t, _, r: True))
webui/app.py
95: 'fetch': lambda x: tornado_fetcher.Fetcher(None, None, async=False).fetch(x),
可以看到芝薇,源碼中有很多使用了很多處async
,我們進(jìn)行修改作儿。
使用vim修改是很快的洛二,但是這里要注意,位于fetcher/tornado_fetcher.py
中有幾個是導(dǎo)入tornado
包中的類名中也包含了async
攻锰,所以要注意晾嘶,在修改這個文件時不要全局修改。(async
都可以改娶吞,Async
不能改垒迂,都是在類名中)
- 再次嘗試運行
$ pyspider
又報錯了
ValueError: Invalid configuration:
- Deprecated option 'domaincontroller': use 'http_authenticator.domain_controller' instead.
這是WsgiDAV發(fā)布了版本 pre-release 3.x導(dǎo)致的。
修改 pyspider/webui/webdav.py 第203行:
config = DEFAULT_CONFIG.copy()
config.update({
'mount_path': '/dav',
'provider_mapping': {
'/': ScriptProvider(app)
},
#'domaincontroller': NeedAuthController(app),
'http_authenticator': {
'HTTPAuthenticator':NeedAuthController(app),
},
'verbose': 1 if app.debug else 0,
'dir_browser': {'davmount': False,
#'enable': True,
'msmount': False,
'response_trailer': ''},
})
dav_app = WsgiDAVApp(config)
再次運行pyspider妒蛇,成功机断!
? ~ pyspider all
phantomjs fetcher running on port 25555
[I 190509 15:43:32 result_worker:49] result_worker starting...
[I 190509 15:43:33 processor:211] processor starting...
[I 190509 15:43:33 tornado_fetcher:638] fetcher starting...
[I 190509 15:43:33 scheduler:647] scheduler starting...
[I 190509 15:43:33 scheduler:782] scheduler.xmlrpc listening on 127.0.0.1:23333
[I 190509 15:43:33 scheduler:586] in 5m: new:0,success:0,retry:0,failed:0
[I 190509 15:43:33 app:76] webui running on 0.0.0.0:5000
如果你出現(xiàn)特殊情況:
Error: Could not create web server listening on port 25555
Error: Could not create web server listening on port 25555
Error: Could not create web server listening on port 25555
...
是因為你后臺運行了phantomjs
,
$ ps
PID TTY TIME CMD
371 ttys000 0:00.05 /Applications/iTerm.app/Contents/MacOS/iTerm2 --server /usr/bin/login -fqpl zhangyin /Applications/iTerm.app/Contents/MacOS/iTerm2
375 ttys000 0:01.19 -zsh
1351 ttys000 2:13.00 phantomjs --ssl-protocol=any --disk-cache=true /Users/zhangyin/anaconda3/envs/six/lib/python3.6/site-packages/pyspider/fetcher/pha
2289 ttys000 0:00.03 tmux new -s webspider
3708 ttys001 0:00.90 -zsh
2476 ttys002 0:00.85 -zsh
5958 ttys003 0:00.49 -zsh
殺掉進(jìn)程就可以了
$ kill -9 1351