2014-11-09 2 views
1

python3에서 gevent를 사용하여 웹 페이지를 다운로드하는 스파이더 프로그램을 작성하고 싶습니다. 여기 내 코드입니다 :python3 urllib.request는 gevent에서 영원히 차단 될 것입니다

import gevent 
import gevent.pool 
import gevent.monkey 
import urllib.request 

gevent.monkey.patch_all() 

def download(url): 
    return urllib.request.urlopen(url).read(10) 

urls = ['http://www.google.com'] * 100 
jobs = [gevent.spawn(download, url) for url in urls] 
gevent.joinall(jobs) 

하지만 그것을 실행할 때 오류가 :

Traceback (most recent call last): 
File "/usr/local/lib/python3.4/dist-packages/gevent/greenlet.py", line 340, in run 
result = self._run(*self.args, **self.kwargs) 
File "e.py", line 8, in download 
return urllib.request.urlopen(url).read(10) 
File "/usr/lib/python3.4/urllib/request.py", line 153, in urlopen 
return opener.open(url, data, timeout) 

...... 
return greenlet.switch(self) 
gevent.hub.LoopExit: This operation would block forever 
<Greenlet at 0x7f4b33d2fdf0: download('http://www.google.com')> failed with LoopExit 
...... 

urllib.request 블록, 프로그램이 작동하지 않을 수 있습니다 것으로 보인다. 그것을 해결하는 방법?

+1

(http://docs.python-requests.org/en/latest/)에 대한 'requests' 사용을 고려해야한다. 직선적 인 urllib보다 고통스럽지 않고 Python 3을 지원하며 monkeypatching이 충분하지 않은 경우 grequests (https://github.com/kennethreitz/grequests)를 통해 "기본"gevent 지원을 제공합니다. –

답변

0

회사 네트워크 내에있을 때 프록시 설정이 원인 일 수 있습니다. 개인 권장 사항은 브라우저를 사용하여 URL 링크를 여는 아름다운 수프와 함께 Selenium을 사용하는 것이며 HTML 컨텐트를 다운로드하거나 브라우저를 직접 제어 할 수 있습니다. 도움이 되었으면 좋겠다.

from selenium import webdriver 
from bs4 import BeautifulSoup 
browser = webdriver.Ie() 
url = "http://www.google.com" 
browser.get(url) 
html_source = browser.page_source 
soup = BeautifulSoup(html_source, "lxml") 
print(soup) 
browser.close()