- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我听到有关线程和 urllib3 的一些好消息时,我正在寻找一种方法来优化我的代码。显然,人们不同意哪种解决方案是最好的。
下面我的脚本的问题是执行时间:太慢了!
第 1 步:我获取此页面 http://www.cambridgeesol.org/institutions/results.php?region=Afghanistan&type=&BULATS=on
第 2 步:我用 BeautifulSoup 解析页面
第 3 步:我将数据放入 excel 文档中
第 4 步:我对我列表(大列表)中的所有国家/地区一次又一次地执行此操作(我只是将 url 中的“阿富汗”更改为另一个国家)
这是我的代码:
ws = wb.add_sheet("BULATS_IA") #We add a new tab in the excel doc
x = 0 # We need x and y for pulling the data into the excel doc
y = 0
Countries_List = ['Afghanistan','Albania','Andorra','Argentina','Armenia','Australia','Austria','Azerbaijan','Bahrain','Bangladesh','Belgium','Belize','Bolivia','Bosnia and Herzegovina','Brazil','Brunei Darussalam','Bulgaria','Cameroon','Canada','Central African Republic','Chile','China','Colombia','Costa Rica','Croatia','Cuba','Cyprus','Czech Republic','Denmark','Dominican Republic','Ecuador','Egypt','Eritrea','Estonia','Ethiopia','Faroe Islands','Fiji','Finland','France','French Polynesia','Georgia','Germany','Gibraltar','Greece','Grenada','Hong Kong','Hungary','Iceland','India','Indonesia','Iran','Iraq','Ireland','Israel','Italy','Jamaica','Japan','Jordan','Kazakhstan','Kenya','Kuwait','Latvia','Lebanon','Libya','Liechtenstein','Lithuania','Luxembourg','Macau','Macedonia','Malaysia','Maldives','Malta','Mexico','Monaco','Montenegro','Morocco','Mozambique','Myanmar (Burma)','Nepal','Netherlands','New Caledonia','New Zealand','Nigeria','Norway','Oman','Pakistan','Palestine','Papua New Guinea','Paraguay','Peru','Philippines','Poland','Portugal','Qatar','Romania','Russia','Saudi Arabia','Serbia','Singapore','Slovakia','Slovenia','South Africa','South Korea','Spain','Sri Lanka','Sweden','Switzerland','Syria','Taiwan','Thailand','Trinadad and Tobago','Tunisia','Turkey','Ukraine','United Arab Emirates','United Kingdom','United States','Uruguay','Uzbekistan','Venezuela','Vietnam']
Longueur = len(Countries_List)
for Countries in Countries_List:
y = 0
htmlSource = urllib.urlopen("http://www.cambridgeesol.org/institutions/results.php?region=%s&type=&BULATS=on" % (Countries)).read() # I am opening the page with the name of the correspondant country in the url
s = soup(htmlSource)
tableGood = s.findAll('table')
try:
rows = tableGood[3].findAll('tr')
for tr in rows:
cols = tr.findAll('td')
y = 0
x = x + 1
for td in cols:
hum = td.text
ws.write(x,y,hum)
y = y + 1
wb.save("%s.xls" % name_excel)
except (IndexError):
pass
所以我知道一切并不完美,但我期待在 Python 中学习新事物!该脚本非常慢,因为 urllib2 和 BeautifulSoup 没有那么快。对于汤的事情,我想我真的不能让它变得更好,但对于 urllib2,我没有。
编辑 1: Multiprocessing useless with urllib2?对我来说似乎很有趣。你们如何看待这个潜在的解决方案?!
# Make sure that the queue is thread-safe!!
def producer(self):
# Only need one producer, although you could have multiple
with fh = open('urllist.txt', 'r'):
for line in fh:
self.queue.enqueue(line.strip())
def consumer(self):
# Fire up N of these babies for some speed
while True:
url = self.queue.dequeue()
dh = urllib2.urlopen(url)
with fh = open('/dev/null', 'w'): # gotta put it somewhere
fh.write(dh.read())
编辑 2:URLLIB3任何人都可以告诉我更多关于那个的事情吗?
Re-use the same socket connection for multiple requests (HTTPConnectionPool and HTTPSConnectionPool) (with optional client-side certificate verification). https://github.com/shazow/urllib3
就我为不同页面请求同一个网站 122 次而言,我想重用同一个套接字连接会很有趣,我错了吗?不能快点吗? ...
http = urllib3.PoolManager()
r = http.request('GET', 'http://www.bulats.org')
for Pages in Pages_List:
r = http.request('GET', 'http://www.bulats.org/agents/find-an-agent?field_continent_tid=All&field_country_tid=All&page=%s' % (Pages))
s = soup(r.data)
最佳答案
考虑使用类似 workerpool 的东西.引用Mass Downloader例如,结合 urllib3看起来像:
import workerpool
import urllib3
URL_LIST = [] # Fill this from somewhere
NUM_SOCKETS = 3
NUM_WORKERS = 5
# We want a few more workers than sockets so that they have extra
# time to parse things and such.
http = urllib3.PoolManager(maxsize=NUM_SOCKETS)
workers = workerpool.WorkerPool(size=NUM_WORKERS)
class MyJob(workerpool.Job):
def __init__(self, url):
self.url = url
def run(self):
r = http.request('GET', self.url)
# ... do parsing stuff here
for url in URL_LIST:
workers.put(MyJob(url))
# Send shutdown jobs to all threads, and wait until all the jobs have been completed
# (If you don't do this, the script might hang due to a rogue undead thread.)
workers.shutdown()
workers.wait()
您可能会从 Mass Downloader 示例中注意到有多种方法可以做到这一点。我选择这个特定示例只是因为它不那么神奇,但任何其他策略也都有效。
免责声明:我是 urllib3 和 workerpool 的作者。
关于python - Urllib2 & BeautifulSoup : Nice couple but too slow - urllib3 & threads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10265115/
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 3年前关闭。 Improve this
介绍代码: public interface Course { /** * returns the number of units (hours) a specific course
我正在尝试“耦合”NSWindows。 我的意思是 2 个大小相同、并排放置的 NSWindows。如果我移动其中一个,另一个也必须移动以保持两者并排。 我尝试对子窗口执行此操作,但是当移动子窗口时,
它们矛盾吗? 解耦是一件伟大但很难实现的事情。然而,在大多数应用程序中,我们并不真正需要它,所以我可以设计高度耦合的应用程序,它几乎不会改变任何明显的副作用,例如“你不能分离组件”,“单元测试是痛苦的
#include #include #include #include struct s_A { bool bin; s_A(): bin(0) {} }; class c_A
我正在制作一个简单的 3D CAD 软件。在类图中,许多对象需要通过(x,y,z)来与其他对象区分。我创建了一个所谓的“Position”类,但问题是它看起来高度耦合,因为许多类都与位置一起工作。有什
我喜欢以函数式风格进行编程。但我突然想到,将函数作为参数传递有时可能会在组件之间产生比使用非函数参数传递更强的耦合。 例如,在下面的(人为的)示例中:A、B 和 C 通过 C 的函数参数的输出类型、C
我似乎无法理解“松散耦合”的概念。我认为“松散”这个词通常具有负面含义,这没什么帮助,所以我总是忘记松散耦合是一件好事。 有人可以展示一些“之前”和“之后”代码(或伪代码)来说明这个概念吗? 最佳答案
我在理解低耦合和高内聚这句话时遇到问题。我用谷歌搜索并阅读了很多相关内容,但仍然发现很难理解。 据我了解,高内聚意味着我们应该拥有专门执行特定功能的类。希望这是正确的吗?就像信用卡验证类一样,专门用于
所以我的前端页面需要来自促销、产品、制造商和零售商服务的数据——当然每个数据都包含一个后端 API 我应该... A) 在前端(对每个服务)进行 4 个单独的调用以从 4 个位置获取数据? 或者 B)
好的,我不确定耦合是否真正描述了我的问题。问题是,我正在创建自己的基于食人魔的 3d 游戏引擎。我也在使用物理库 PhysX,但由于我需要在我的主引擎代码和 PhysX 之间创建一个抽象层——以防万一
我有一个 GUI,它根据 slider 值向 Web 服务器发出命令。其中一些 slider 在 Web 服务器上“耦合”,因此更改其中一个可能也会更改另一个。耦合是通过网络服务器返回一个值列表来完成
我在我的项目中实现了一个工厂,最近有人建议我在我的类上使用属性,这样工厂就可以确定要实例化和传回哪个类。我是开发领域的新手,并试图严格遵循松耦合规则,我想知道依赖“钩子(Hook)”(作为属性)是否违
情侣数据库配置文件录入,这将是保存数据的最佳方式。此外,数据将通过 php 编码检索,如果可以使用一个理想的查询代码将其关闭。 在 site_member 表中为每个字段创建多个字段...例如:m_f
我在我的应用程序中遇到用户唯一性对的问题... 我有用户女巫可以链接到一些联系人。我使用关系表来做我的链接(女巫也有一个级别属性 - 用于不同级别的关系) 所以我有用户、联系人和关系。我的问题是这对
在使用元类崩溃后,我深入研究了 Python 中的元编程主题,我有几个问题,恕我直言,可用文档中没有明确回答。 在元类中同时使用 __new__ 和 __init__ 时,它们的参数必须定义相同吗?
dismissViewControllerAnimated:completion: 在我的应用程序中工作正常,除了解雇之间的延迟。 [api loginWithUsername:[dict objec
你能给我解释一下下面的短语(摘自 an answer to Stack Overflow question What are the differences between Deferred, Pro
我正在开发一个 WordPress 插件,并努力确保最佳实践。我有两个类,我的插件类“Jargonaut”是必需的,然后是另一个名为“Dictionary”的类,它随 require_once() 包
早在 12 月,就有 this post答案是“可以使用具体类型 [用于简单对象]”。 但是我不断在示例项目中看到越来越多的带有接口(interface)的简单实体,甚至是我刚刚控制的非常大的企业应用
我是一名优秀的程序员,十分优秀!