在网络爬虫需求了,经常会遇到动态页面的处理,就是爬下来的页面,还有部分内容没有加载的,或者还没有处理完毕,导致页面内容不完整,譬如,图片的动态加载,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