我已经在网上刮了一段时间,但对于python来说相对较新,最近我将所有我的抓取活动从ruby切换到python主要是因为scrapy和scrapinghub似乎为大规模生产的擦伤提供了更好的支持。 / p>
我在搜索电子商务网站时遇到的一个问题是许多人似乎使用“有状态”会话,即除非您发送从先前响应中返回的相同cookie,否则下一个请求可能是被封锁特别是,许多使用IBM Websphere的网站都会出现此行为。
由于使用并发异步请求,这成为scrapy的一个问题。
这些网站中的大多数都需要加载JS才能设置初始cookie,因此我的方法是使用Selenium(无头chromedriver)加载初始页面,然后将cookie传递给普通的vanilla scrapy请求
def __initialise_cookies(self):
# Where self is the spider and driver is the Selenium driver instance
self.session_cookies = self.driver.get_cookies()
当scrapy配置文件中的CONCURRENT_REQUESTS设置为1时,此方法完全正常。然而,这会消除所有并发性,显然会大大减慢刮擦速度。
我知道scrapy已经发布了downloader middleware功能,允许在请求中命名cookiejar,然后传递给后续请求。我也读过this post。然而,这似乎并没有解决我的问题 - 我只能假设因为并发导致cookiejar同时重复使用多次,即使你创建了几个不同的cookiejars作为起点。
有没有人有关于如何解决这个问题的想法?
理想情况下,我想创建与CONCURRENT_REQUESTS设置相同数量N的会话cookiejars(例如16),但我如何处理确保每个cookiejar一次最多只使用一次,然后将响应cookie传递给下一次请求。
我知道Twisted不使用线程,但为N个cookiejars中的每一个创建一个信号量是否有意义,并且在发送下一个请求之前让请求等到它未被使用?