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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值