我需要在Python中编写类似程序的代理,工作流程与Web代理非常相似.程序位于客户端和服务器之间,由客户端发送到服务器的请求,处理请求,然后将其发送到原始服务器.当然使用的协议是私有协议使用TCP.
为了最大限度地减少工作量,我想使用Python Twisted来处理请求接收(该部分充当服务器)并重新发送(该部分充当客户端).
为了最大限度地提高性能,我想使用python多处理(线程具有GIL限制)将程序分成三个部分(进程).第一个进程运行Twisted以接收请求,将请求放入队列,并立即将成功返回给原始客户端.第二个进程从队列中获取请求,进一步处理请求并将其放入另一个队列.第3个进程从第2个队列接收请求并将其发送到原始服务器.
我是Python Twisted的新手,我知道它是事件驱动的,我也听说最好不要将Twisted与线程或多处理混合使用.所以我不知道这种方式是否合适,或者只是使用Twisted有更优雅的方式?
所以我一直在使用硒来进行刮擦。但我想将所有代码更改为 Scrapy。我唯一不确定的是我正在使用多处理(python 库)来加速我的进程。我研究了很多,但我完全不明白。我发现:Multiprocessing of Scrapy Spiders in Parallel Processes但它对我没有帮助,因为它说它可以用 Twisted 完成,但我还没有找到一个例子。
在其他论坛上,它说 Scrapy 可以与多处理一起工作。
最后一件事,在scrapy中,选项CONCURRENT_REQUESTS(设置)与多处理有一些联系吗?
我只提到我在发布这个问题之前提到的一些问题(在发布这个问题之前,我目前没有链接到我提到过的所有问题) - :
我可以完全运行此代码,如果我没有传递参数并要求用户从BBSpider类输入(没有主函数 - 在name ="dmoz"行下方),或者将它们作为预定义(即静态)参数.
我的代码在这里.
我基本上试图从Python脚本执行Scrapy蜘蛛而不需要任何其他文件(甚至是设置文件).这就是为什么我在代码本身内部也指定了设置.
这是我执行此脚本时的输出 - :
http://bigbasket.com/ps/?q=apple
2015-06-26 12:12:34 [scrapy] INFO: Scrapy 1.0.0 started (bot: scrapybot)
2015-06-26 12:12:34 [scrapy] INFO: Optional features available: ssl, http11
2015-06-26 12:12:34 [scrapy] INFO: Overridden settings: {}
2015-06-26 12:12:35 [scrapy] INFO: Enabled extensions: CloseSpider, TelnetConsole, LogStats, CoreStats, SpiderState
None
2015-06-26 12:12:35 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats
2015-06-26 12:12:35 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, …Run Code Online (Sandbox Code Playgroud) 我的问题是:我想从某个域中提取所有有价值的文本,例如www.example.com。因此,我转到该网站并访问深度最大为2的所有链接,并将其写入csv文件。
我用scrapy编写了模块,使用1个进程解决了这个问题,并产生了多个爬虫,但是效率很低-我能够抓取〜1k域/〜5k网站/ h,据我所知,瓶颈是CPU(因为GIL?)。离开PC一段时间后,我发现网络连接断开。
当我想使用多个进程时,我只是从扭曲中得到了错误:并行进程中Scrapy Spiders的多处理因此,这意味着我必须学习扭曲,与asyncio相比,我会说我已弃用,但这只是我的见解。
所以我有几个想法怎么办
您推荐什么解决方案?
Edit1:共享代码
class ESIndexingPipeline(object):
def __init__(self):
# self.text = set()
self.extracted_type = []
self.text = OrderedSet()
import html2text
self.h = html2text.HTML2Text()
self.h.ignore_links = True
self.h.images_to_alt = True
def process_item(self, item, spider):
body = item['body']
body = self.h.handle(str(body, 'utf8')).split('\n')
first_line = True
for piece in body:
piece = piece.strip(' \n\t\r')
if len(piece) == 0:
first_line = True
else:
e = ''
if not self.text.empty() and not first_line and not …Run Code Online (Sandbox Code Playgroud) python ×4
scrapy ×3
arguments ×1
nutch ×1
pyspider ×1
selenium ×1
twisted ×1
web-crawler ×1
web-scraping ×1