簡體   English   中英

python3 urllib.request將永遠在gevent中阻止

[英]python3 urllib.request will block forever in gevent

我想編寫一個蜘蛛程序來在python3中使用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阻止了,所以程序無法正常工作。 怎么解決呢?

這可能是由於代理位於公司網絡中時的設置所致。 個人建議是將Selenium與漂亮的湯結合使用,后者使用瀏覽器打開URL鏈接,您可以下載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()

Python,gevent,urllib2.urlopen.read(),下載加速器中的問題相同

從上述帖子中重申:

要讀取的參數是字節數,而不是偏移量。

也:

您正在嘗試讀取對來自不同greenlets的單個請求的響應。

如果您想使用多個並發連接下載同一文件,則可以在服務器支持的情況下使用Range http標頭(對於具有Range標頭的請求,您將獲得206狀態,而不是200狀態)。 請參閱HTTPRangeHandler。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM