【发布时间】:2016-04-24 04:53:57
【问题描述】:
我一直在玩多处理,我的代码在查看较小的数字时可以工作,但是当我想运行更大的样本时,会发生 2 件事:代码锁定或我收到以下错误消息:“urlopen 错误 [Errno 10054] 现有连接被远程主机强行关闭”。我不知道如何让它工作。谢谢。
from multiprocessing import cpu_count
import urllib2
from bs4 import BeautifulSoup
import json
import timeit
import socket
import errno
def parseWeb(id):
url = 'https://carhood.com.au/rent/car_detail/'+str(id)+'/'
hdr = {'Accept': 'text/html,application/xhtml+xml,*/*',"user-agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36"}
html = urllib2.urlopen(url).read()
soup=BeautifulSoup(html,"lxml")
car=soup.find("h1",{"class":"intro-title intro-title-tertiary"}).text
return car
if __name__ == '__main__':
start = timeit.default_timer()
pool = Pool(cpu_count()*100)
#This works for me when xrange(1,70)
results=pool.map(parseWeb,xrange(1,400))
print results
##I've tried this as a solution but it didn't work
## startNum=1
## endNum=470
## for x in range(startNum,endNum,70):
## print x
## results=pool.map(parseWeb,xrange(startNum,x))
## print results
## startNum=x
stop = timeit.default_timer()
print stop - start
【问题讨论】:
-
每个 CPU 核心产生 100 个进程真的合理吗?我不认为它是。这对网站所有者也很刻薄。
-
我想有两件事我应该注意:1)我只是想学习如何去做,很高兴听到更合理的进程号是什么,因此我要问和 2 ( .
-
好的,我的建议是:我认为同时向一个域发出超过 3 或 4 个请求是过多的,应该避免。如果可能,请尝试在域中查找可让您通过单个请求下载更多数据的资源。不要产生数百个进程。
-
你应该真正检查一个站点是否有一个/robots.txt 文件,并在你爬遍它之前尊重它的内容。
标签: python python-2.7 multiprocessing urllib2