V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  caneman  ›  全部回复第 8 页 / 共 8 页
回复总数  160
1  2  3  4  5  6  7  8  
2019-05-09 09:48:35 +08:00
回复了 caneman 创建的主题 Python 算法:圆盘盖米问题(圆的密铺?)
@fzy0728
这个可以打开吗?
http 冒号 //www 点 caneman.cn/wp-content/uploads/2019/05/dock.jpg
2019-05-09 09:47:17 +08:00
回复了 caneman 创建的主题 Python 算法:圆盘盖米问题(圆的密铺?)
@necomancer

米粒落点并不是均匀的,有的地方稀疏有的地方稠密,有的地放可能很大一块面积没有任何米粒,有的地方可能挤的满满的,甚至一个米粒上面堆叠了另一个米粒(但是单点堆积数<50 ),不知道棋盘上米粒的密度分布情况(黑盒),只有当圆盘落下才会知道圆盘盖到了多少米粒,仅有此一项数据输出。

圆盘可以任意大小,圆盘可以撤掉 /更换(撤掉不计入次数),我上面那个圆上堆小圆的思路是把大圆撤掉用小圆去覆盖原来大圆的位置。

另外,尽可能少的尝试次数(这个次数不是到最后的使用盘子数,而是整个过程中用过盘子的总次数(撤掉盘子不计入总次数),例如放了个大盘,其覆盖米粒大于 50,撤掉大盘,改成 5 个小盘,每个小盘覆盖<50,满足条件,总的尝试次数为 1+5=6 次)。

可以不覆盖全部粒子,尽可能少的圆盘总使用次数去覆盖尽可能多的米粒,寻找一个平衡吧。

这个问题应该是没有 BUG 的,有的话欢迎再一起讨论,天体物理学中粒子密度分布计算,好像有涉及到类似的问题。

PS:圆里面做堆积的资料很有用,谢谢!
2019-05-08 13:52:07 +08:00
回复了 caneman 创建的主题 Python 算法:圆盘盖米问题(圆的密铺?)
@CEBBCAT 用足够大的圆盘盖一下就知道了,所以可以理解为知道总数。
2019-05-08 13:51:06 +08:00
回复了 caneman 创建的主题 Python 算法:圆盘盖米问题(圆的密铺?)
@CEBBCAT 随机掉落,单个点重叠数量<50
2019-05-08 13:49:59 +08:00
回复了 caneman 创建的主题 Python 算法:圆盘盖米问题(圆的密铺?)
2019-05-08 13:46:33 +08:00
回复了 caneman 创建的主题 Python 算法:圆盘盖米问题(圆的密铺?)
@fzy0728

我这里看没有啊

链接: https://i.imgur.com/IKjouyS.jpg



![avatar]( https://i.imgur.com/IKjouyS.jpg)
2019-05-08 13:17:32 +08:00
回复了 caneman 创建的主题 Python 算法:圆盘盖米问题(圆的密铺?)
大伙给点思路啊
2019-05-06 20:41:48 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@cxh116 谢谢,代理好像不是瓶颈,不加代理提升的速率也非常有限(大概就是去除了代理延迟级别的速度提升) redis 的那种方案确实提高了速率,是我之前写法太蠢了,所有的下一个页面链接都得等我上一个页面请求完毕才能获取,生生的变成了同步。(可是书上和网上都是这样来写的啊,寻找下一页的链接然后 yield ),不知道是我的理解问题,还是这样写本身就存在这种问题,我再多尝试尝试改一改,谢谢啦🙏。
2019-05-06 18:02:54 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
2019-05-06 17:54:27 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@cxh116 是采用的异步 MySQL 存储的,很多页面是空数据的,所以瓶颈不在存储这一块,下面是主要代码。


def start_requests(self):
url = 'https://www.xxxx.com/'
longitude, latitude = get_next_coordinate( self.start_longitude, self.start_latitude)
data = get_form(longitude, latitude)
proxy = 'http://' + get_proxy()
yield FormRequest(url, method='POST', formdata=data, callback=self.parse, dont_filter=True, meta={'proxy':proxy,'download_timeout':3,'longitude':data['longitude'], 'latitude':data['latitude']})

def parse(self, response):
info_list = json.loads(response.text)
if info_list['Count']:
for item in info_list['list']:
item_loader = QiyeItemloader(item=QiyeItem())
item_loader.add_value('hash', item['Key'])
item_loader.add_value('name', item['Name'])
item_loader.add_value('longitude', response.meta['longitude'])
item_loader.add_value('latitude', response.meta['latitude'])
qiye_item= item_loader.load_item()
yield qiye_item
longitude, latitude = get_next_coordinate(response.meta['longitude'], response.meta['latitude'])
next_data = get_form(longitude, latitude)
yield FormRequest(response.url, method='POST', formdata = next_data, callback=self.parse, dont_filter=True, meta={'proxy':response.meta['proxy'],'download_timeout':3,'longitude':next_data['longitude'], 'latitude':next_data['latitude']})

我想的一种解决方案是把所有 URL 放在 redis 里面,然后在 start_requests 里面 while True:yield Request()
这样的问题我不知道我这样一直写会不会时间长了我的电脑就崩了。
我如何控制这个被 yield 的 Request 的数量?比如,在队列里面一直有 100 个 Request,每少一个就添一个,始终保持 Start_url 里面有 100 个待爬 URL,这样的情况下,我调 CONCURRENT_REQUESTS 的值,是不是就能真正的控制并发数了?
2019-05-06 10:34:07 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@renmu123 现在能得到所有的 url 了,我想着怎么能用 scrapy 高效抓取,scrapy 这么多年了 这样一个成熟的框架应该不至于解决不了这种问题。想先单机把 scrapy 性能发挥到极致,了解他的极限和瓶颈在哪里,然后再上分布式再接着进一步优化,计划的学习路线是这样的。
2019-05-06 10:30:29 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@zhijiansha 这个思路挺好的,谢谢啊
2019-05-05 17:26:03 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@AlloVince 非常感谢!您的这一番讲解能让我少走很多弯路,再次感谢!
2019-05-05 16:41:10 +08:00
回复了 zxq2233 创建的主题 程序员 这种链接需要用微信才能打开,如何用爬虫去爬?
ua 改成微信的 ua
2019-05-05 16:18:45 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@dingyaguang117 谢谢,我觉得问题在这儿,但是这个规则怎么建立没想好,4000W 级别,还要涉及到失效错误链接的处理,请问 scrapy-redis 是不是能解决我的问题?
2019-05-05 16:03:04 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@dingyaguang117 改变串行后呢,怎么提高效率,我总不能把 4000W 页面连接都写道 start_urls 里面吧?

其实我现在是有点不太明白 scrapy 是实现并发的原理,网上也没有找到很好的解释文档。按我的理解,它是通过 start_urls 来实现并发的,任何在 parse 里面写的 yield 都会存在上面的串行问题。

我能想到的是把 scrapy 和 redis 对接(单机对接),然后多个线程同时去取 url,然后同时去抓,关键是我不知道 scrapy 支不支持这种操作,也不知道能不能实现或者有没有现成的解决方案,以免重复造轮子或者根本就此路不通。。。

不过好像上面这种想法又回到了 scrapy 是如何实现并发的问题上了。。。。
2019-05-05 15:57:44 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@tozp 现在日抓 10-20W 级,有点跟不上需求,需求大概是日抓百万,但是不能分布式。。。不是不能用,是现在的问题是单机的性能远远的浪费了,无论是带宽还是性能,都远远的没有用到。
2019-05-05 15:37:55 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@locoz 总共大概有 4000W 页面,如果我找到了这 4000W 页面的列表,我要写在 start_urls 里面才能实现高并发吗?
之前没有接触过 Scrapy-redis,目前的情况是,单机,带宽还可以,IP/Cookie 等所有反爬措施均已解决,可以理解为网站无反爬站措施,这样的话,我该怎么样实现日抓百万呢?

想到的一种可行的方案是,把所有的 url 写入 redis,然后所有的请求从 redis 里面去取 url, 但是单机的情况下,如何实现并发?(就是不是一个请求结束后再去 redis 取下一个,而是多个线程(并发数)同时连接 redis 去取 url,然后这些个线程同时进行抓取)不太清楚 scrapy-redis 有没有解决这个问题。。。
2019-05-05 15:11:07 +08:00
回复了 caneman 创建的主题 Python Scrapy 效率瓶颈
@InternetExplorer 我试了调并发数并没有显著的影响到我的抓取速率,而且对方的站是绝对扛得住的(是个大站)。
这里我虽然写的很大,但是其实抓取频率并没有很高(所以才一直没改),而且抓取到的页面都是按顺序的,我觉得是不是我的抓取逻辑有问题,应该怎么样改善呢?
1  2  3  4  5  6  7  8  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5828 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 87ms · UTC 02:17 · PVG 10:17 · LAX 18:17 · JFK 21:17
Developed with CodeLauncher
♥ Do have faith in what you're doing.