scrapyとseleniumの遅延ロード処理


ネット上の爬虫類の需要になって、よく動的なページの処理に出会って、這い降りたページで、まだ一部の内容がロードされていないか、あるいはまだ処理が終わっていないので、ページの内容が不完全になって、例えば、画像の動的なロード、iframe、ajaxなどです.
対応するピクチャのダイナミックロード:次のようにします.
#         
class page_loaded:

    def __init__(self, request, spider):
        self.request = request
        self.spider = spider

    def __call__(self, driver):
        img_src = driver.find_element_by_css_selector("img.lazyload").get_attribute("src")
        if re.search("gif$", img_src):
            return False

        return True


#      
class DetailSeleniumDownloaderMiddleware(object):


    def process_request(self, request, spider):
        sobj = re.search("movie", request.url, re.I)
        if sobj:
            try:
                # browser webdriver  
                spider.browser.get(request.url)
                WebDriverWait(spider.browser, timeout=30, poll_frequency=3).until(page_loaded(request, spider))
                #time.sleep(5)
                return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source,
                                encoding='utf-8', request=request)
            except TimeoutException:
                spider.logger.error("url %s download failed", request.url)
                

ダウンロードミドルウェアでは、ページの注目要素がすでに必要かどうかを判断します.そうしないと、ずっと待っています.タイムアウトまで.
 
iframeの判断については、方法があまり悪くありません.
#         
class testSeleniumDownloaderMiddleware(object):

    def process_request(self, request, spider):

        sobj = re.search("ckplayer",request.url, re.I)
        if sobj:

            try:
                spider.browser.get(request.url)
                #         0.5s, poll_frequency=0.5
                WebDriverWait(spider.browser, timeout=10).until(
                            EC.presence_of_element_located((By.CSS_SELECTOR, "iframe")))
                return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source,
                            encoding="utf-8", request = request)
            except TimeoutException:
                spider.logger.error("url %s download failed", request.url)

これはseleniumが持参した方法で、ある要素がページに表示されているかどうかを判断します.表示されない場合は、タイムアウトまで待機します.
 
参考資料
——————————————————————————
https://www.cnblogs.com/cnkai/p/7538262.html
https://www.cnblogs.com/cnkai/p/7538260.html
https://www.cnblogs.com/mengyu/p/6972968.html
https://www.cnblogs.com/yoyoketang/p/6128580.html
https://blog.csdn.net/zhusongziye/article/details/80342781
https://www.cnblogs.com/VseYoung/p/selenium_wait_3_python.html