我正试图从航班搜索页面抓取一些数据.

此页面以这种方式工作:

你填写一个表格,然后你点击按钮搜索 – 这没关系.当您单击该按钮时,您将被重定向到包含结果的页面,这就是问题所在.这个页面连续添加结果,例如一分钟,这不是什么大问题 – 问题是得到所有这些结果.当您使用真正的浏览器时,您必须向下滚动页面并显示这些结果.所以我试图使用Selenium向下滚动.它可能在页面底部向下滚动可能非常快,或者是跳转而不是滚动页面不会加载任何新结果.

当你慢慢向下滚动时,它会重新加载结果,但是如果你这么做就会停止加载.

我不确定我的代码是否有助于理解,所以我附上它.

  1. SEARCH_STRING = """URL"""
  2. class spider():
  3. def __init__(self):
  4. self.driver = webdriver.Firefox()
  5. @staticmethod
  6. def prepare_get(dep_airport,arr_airport,dep_date,arr_date):
  7. string = SEARCH_STRING%(dep_airport,arr_airport,arr_airport,dep_airport,dep_date,arr_date)
  8. return string
  9. def find_flights_html(self,dep_airport, arr_airport, dep_date, arr_date):
  10. if isinstance(dep_airport, list):
  11. airports_string = str(r'%20').join(dep_airport)
  12. dep_airport = airports_string
  13. wait = WebDriverWait(self.driver, 60) # wait for results
  14. self.driver.get(spider.prepare_get(dep_airport, arr_airport, dep_date, arr_date))
  15. wait.until(EC.invisibility_of_element_located((By.XPATH, '//img[contains(@src, "loading")]')))
  16. wait.until(EC.invisibility_of_element_located((By.XPATH, u'//div[. = "Poprosíme o trpezlivosť, hľadáme pre Vás ešte viac letov"]/preceding-sibling::img')))
  17. self.driver.execute_script("window.scrollTo(0,document.body.scrollHeight);")
  18. self.driver.find_element_by_xpath('//body').send_keys(Keys.CONTROL+Keys.END)
  19. return self.driver.page_source
  20. @staticmethod
  21. def get_info_from_borderbox(div):
  22. arrival = div.find('div',class_='departure').text
  23. price = div.find('div',class_='pricebox').find('div',class_=re.compile('price'))
  24. departure = div.find_all('div',class_='departure')[1].contents
  25. date_departure = departure[1].text
  26. airport_departure = departure[5].text
  27. arrival = div.find_all('div', class_= 'arrival')[0].contents
  28. date_arrival = arrival[1].text
  29. airport_arrival = arrival[3].text[1:]
  30. print 'DEPARTURE: '
  31. print date_departure,airport_departure
  32. print 'ARRIVAL: '
  33. print date_arrival,airport_arrival
  34. @staticmethod
  35. def get_flights_from_result_page(html):
  36. def match_tag(tag, classes):
  37. return (tag.name == 'div'
  38. and 'class' in tag.attrs
  39. and all([c in tag['class'] for c in classes]))
  40. soup = mLib.getSoup_html(html)
  41. divs = soup.find_all(lambda t: match_tag(t, ['borderbox', 'flightbox', 'p2']))
  42. for div in divs:
  43. spider.get_info_from_borderbox(div)
  44. print len(divs)
  45. spider_inst = spider()
  46. print spider.get_flights_from_result_page(spider_inst.find_flights_html(['BTS','BRU','PAR'], 'MAD', '2015-07-15', '2015-08-15'))

因此,我认为主要问题是滚动太快而无法触发新的结果加载.

你知道如何使它工作吗?

最佳答案
这是一个不同的方法,对我有用,包括滚动到最后一个搜索结果的视图,并等待再次滚动之前加载其他元素:

  1. # -*- coding: utf-8 -*-
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support.ui import WebDriverWait
  5. from selenium.common.exceptions import StaleElementReferenceException
  6. from selenium.webdriver.support import expected_conditions as EC
  7. class wait_for_more_than_n_elements(object):
  8. def __init__(self, locator, count):
  9. self.locator = locator
  10. self.count = count
  11. def __call__(self, driver):
  12. try:
  13. count = len(EC._find_elements(driver, self.locator))
  14. return count >= self.count
  15. except StaleElementReferenceException:
  16. return False
  17. driver = webdriver.Firefox()
  18. dep_airport = ['BTS', 'BRU', 'PAR']
  19. arr_airport = 'MAD'
  20. dep_date = '2015-07-15'
  21. arr_date = '2015-08-15'
  22. airports_string = str(r'%20').join(dep_airport)
  23. dep_airport = airports_string
  24. url = "https://www.pelikan.sk/sk/flights/list?dfc=C%s&dtc=C%s&rfc=C%s&rtc=C%s&dd=%s&rd=%s&px=1000&ns=0&prc=&rng=1&rbd=0&ct=0" % (dep_airport, arr_airport, arr_airport, dep_airport, dep_date, arr_date)
  25. driver.maximize_window()
  26. driver.get(url)
  27. wait = WebDriverWait(driver, 60)
  28. wait.until(EC.invisibility_of_element_located((By.XPATH, '//img[contains(@src, "loading")]')))
  29. wait.until(EC.invisibility_of_element_located((By.XPATH,
  30. u'//div[. = "Poprosíme o trpezlivosť, hľadáme pre Vás ešte viac letov"]/preceding-sibling::img')))
  31. while True: # TODO: make the endless loop end
  32. results = driver.find_elements_by_css_selector("div.flightbox")
  33. print "Results count: %d" % len(results)
  34. # scroll to the last element
  35. driver.execute_script("arguments[0].scrollIntoView();", results[-1])
  36. # wait for more results to load
  37. wait.until(wait_for_more_than_n_elements((By.CSS_SELECTOR, 'div.flightbox'), len(results)))

笔记:

>你需要弄清楚何时停止循环 – 例如,在特定的len(结果)值
> wait_for_more_than_n_elements是一个custom Expected Condition,它有助于确定何时加载下一部分,我们可以再次滚动

转自: https://www.cnblogs.com/yipianshuying/p/10040461.html

使用Selenium慢慢向下滚动页面的更多相关文章

  1. 向下滚动页面加载图片的js

    js代码 scroll.photo.js : window.imgscroll = { options: { target: null, //插入图片的目标位置 img_list: null, //图 ...

  2. 利用python+selenium在pycharm下进行页面登陆的半自动测试

    很久没有写了,现在正式入职,准备好好干,加油! 我的第一个较正式的测试代码: from selenium import webdriverimport unittestimport sysimport ...

  3. selenium从入门到应用 - 5,页面对象设计模式下的页面模块

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  4. hexo next 主题 : 实现点击跳转到文章的时候文章的页面自动实现滚轮效果,向下滚动到阅读的位置。

    个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 背景: 博主的博客希望实现能够在点击到某个文章 ...

  5. js-scroll判断页面是向上滚动还是向下滚动

    原理:那当前的scrollTop和之前的scrollTop对比 如果变大了,表示向下滚动(scrollTop值变大): 如果变小了,表示向上滚动(scrollTop值变小). 方法一:js代码: $( ...

  6. js 页面向下滚动

    向下滚动一段距离 距离顶部距离 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; <scrip ...

  7. 抓取Js动态生成数据且以滚动页面方式分页的网页

    代码也可以从我的开源项目HtmlExtractor中获取. 当我们在进行数据抓取的时候,如果目标网站是以Js的方式动态生成数据且以滚动页面的方式进行分页,那么我们该如何抓取呢? 如类似今日头条这样的网 ...

  8. 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  9. jQuery带控制按钮向上和向下滚动文本列表

    效果:http://hovertree.com/texiao/jquery/64/ 效果图如下: 代码如下: <!DOCTYPE html> <html> <head&g ...

随机推荐

  1. 【Oracle】DBMS_STATS.GATHER_TABLE_STATS详解

    由于Oracle的优化器是CBO,所以对象的统计数据对执行计划的生成至关重要!    作用:DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息(默认参数下是对表进行直 ...

  2. 我的JS历史知识

    话说在那long long ago的1995以前,绝大多数因特网用户都使用速度仅28.8kbit/s的猫(调制调解器)上网,人们注册成为某个网站的用户时,填写好资料,发送给服务器去验证,如果某一资料填 ...

  3. Java代码实现对Azkaban的Flow进行设置定时

    代码如下: public class CurlToAzkaban{ public static void scheduleExecute(String flow, String cronExpress ...

  4. Windows系统通用安全配置基线

    一:共享账号检查 配置名称:账号分配检查,避免共享账号存在 配置要求: 1.系统需按照实际用户分配账号: 2.根据系统的使用需求,设定不同的账户和账户组,包括管理员用户,数据库用户,审计用户,来宾用户 ...

  5. php读取大文件如日志文件

    需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容. 1. 直接采用file函数来操作 or file_get_content() 肯定报内存溢出注: 由于 fi ...

  6. Linux提权后获取敏感信息的方法与途径

    在本文开始之前,我想指出我不是专家.据我所知,在这个庞大的区域,没有一个“神奇”的答案.分享,共享(我的出发点).下面是一个混合的命令做同样的事情,在不同的地方,或只是一个不同的眼光来看待事物.我知道 ...

  7. JavaScript --- Map集合结构详解

    Map 对象保存键值对.任何值(对象或者原始值) 都可以作为一个键或一个值. 语法 new Map([iterable]) 参数 iterable Iterable 可以是一个数组或者其他 itera ...

  8. LVS.md

    LVS 概述 简介 LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,官方站点.现在LVS已经是 Linux标准内核的一部分, ...

  9. F、CSL 的神奇序列 【规律】 (“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551/F 题目描述 CSL 有一个神奇的无穷实数序列,他的每一项满足如下关系: 对于任意的正整数 n ,有 n∑k ...

  10. ethereumjs/ethereumjs-vm-1-简介

    https://github.com/ethereumjs/ethereumjs-vm 其实这就是怎么自己使用该模块来生成一个类似geth客户端的以太坊虚拟机,然后进行各类区块链操作 SYNOPSIS ...