我正在使用 Python 从网站提取信息并将其存储到数据库 MySQLdb和 BeautifulSoup .
该网站由大约 15 个不同的城市组成,每个城市都有 10 到 150 个页面。总共约500页。
对于每个城市的每个页面,我使用 BeautifulSoup 打开网站,提取所有必要的信息,然后执行 insert into
或 update
SQL 查询。
目前我没有使用线程,浏览完所有 500 个页面需要几分钟,因为 Python 程序...
- 打开一个页面。
- 提取信息。
- 执行 SQL 查询。
- 打开下一页...
理想情况下,我希望通过 10 个并发线程(每个线程打开大约 50 个页面)来负载平衡线程。但我认为这可能太复杂而无法编码。
所以我正在考虑每个城市有一个线程。我该如何实现这个目标?
目前我的代码看起来像这样:
//import threading
import BeautifulSoup
import urllib2
import MySQLdb
con = MySQLdb.connect( ... )
def open_page( url ):
cur = con.cursor()
// do SQL query
//Get a dictionary of city URL
cities = [
'http://example.com/atlanta/',
'http://example.com/los-angeles/',
...
'http://example.com/new-york/'
]
for city_url in cities:
soup = BeautifulSoup( urllib2.urlopen( city_url ) )
// find every page per city
pages = soup.findAll( 'div', { 'class' : 'page' } )
for page in pages:
page_url = page.find( 'a' )[ 'href' ]
open_page( page_url )
最佳答案
你最初的想法是绝对可行的。只需启动 10 个工作线程,等待同一个队列上的输入。然后您的邮件进程将 URL 放入此队列中。负载平衡将自动发生。
如果您的 SQL 绑定(bind)是线程安全的,您可以在工作线程中执行 INSERT 或 UPDATE 操作。否则,我会为 SQL 内容添加一个线程,等待不同队列上的输入。然后,您的工作线程会将查询放入此队列中,然后 SQL 线程将执行它。
如果您在 google 上搜索“python 工作线程队列”,您会找到一些示例。
关于python - 在 Python 中线程多个 SQL 查询的良好实践/设计是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217367/