python抓取动态网页(动态网页爬虫什么是动态(爬虫)(AJAX技术))

优采云 发布时间: 2022-01-13 11:07

  python抓取动态网页(动态网页爬虫什么是动态(爬虫)(AJAX技术))

  动态网页爬虫 什么是动态网页爬虫和AJAX技术:动态网页是网站通过ajax技术动态更新网站中的本地数据,无需重新加载。例如,在拉狗网的招聘页面,在页面变化的过程中,url没有变化,但是招聘数据是动态变化的。AJAX(异步 JavaScript 和 XML)异步 JavaScript 和 XML。前端与服务器交换少量数据,Ajax 可以使网页异步更新。这意味着可以在不重新加载整个页面的情况下更新页面的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为以传统的数据格式进行传输,使用 XML 语法。所谓的AJAX,其实,数据交互基本上是使用JSON。AJAX加载的数据,即使是用JS渲染数据到浏览器,右键->查看网页源代码,还是看不到ajax加载的数据,只能看到使用此 url 加载的 html 代码。动态网络爬虫的解决方案:直接分析ajax调用的接口。然后通过代码请求这个接口。使用 Selenium+chromedriver 模拟浏览器行为获取数据。selenium 和 chromedriver:使用 selenium 关闭浏览器: driver.close():关闭当前页面。driver.quit():关闭整个浏览器。Selenium 定位元素: find_element_by_id:通过 id 查找元素。find_element_by_class_name:按类名查找元素。find_element_by_name:根据name属性的值查找元素。find_element_by_tag_name:按标签名称查找元素。find_element_by_xpath:根据 xpath 语法获取元素。find_element_by_css_selector:根据 css 选择器选择元素。

  需要注意的是find_element是获取第一个满足条件的元素。find_elements 是获取所有满足条件的元素。

  

  

  Selenium 表单操作:webelement.send_keys:将输入框填入内容。webelement.click:点击。操作select标签:需要先用from selenium.webdriver.support.ui import Select包裹选中的对象,然后才能进行选择:selenium行为链:

  有时候页面上的操作可能会有很多步骤,这时可以使用鼠标行为链类mon.action_chains.ActionChains来完成。例如,现在您想将鼠标移到一个元素上并执行一个单击事件。那么示例代码如下:

  inputTag = driver.find_element_by_id('kw')

submitTag = driver.find_element_by_id('su')

actions = ActionChains(driver)

actions.move_to_element(inputTag)

actions.send_keys_to_element(inputTag,'python')

actions.move_to_element(submitTag)

actions.click(submitTag)

actions.perform()

  还有更多与鼠标相关的操作。

  click_and_hold(element):在不释放鼠标的情况下单击。

  context_click(element):右键单击。

  double_click(element):双击。

  下面是B站的登录和拖动验证滑块。

  

  以下是键盘操作

  

  设置浏览器的参数就是在定义驱动时设置chrome_options参数,是Options类实例化的对象。

  参数是设置浏览器是否可视化以及请求头等信息。

  

  浏览器多窗口切换就是在同一个浏览器的不同网页窗口之间进行切换。

  

  Selenium 提供了一些延迟功能

  无形等待是在设定的时间段内检测网页是否加载完毕,即浏览器标签栏的小圆圈不再旋转,才执行下一步。

  显式等待可以根据判断条件灵活等待。程序每隔一定时间检测一次,如果结果和检测条件成立,则执行下一步。显式等待的使用涉及几个模块:

  By:设置元素定位方式。它们是 ID、XPATH、LINK_TEXT、NAME 等。

  expected_conditions:验证网页元素是否存在。

  WebDriverWait的参数说明如下: driver:浏览器对象驱动;timeout:超时时间;poll_frequency:检测时间间隔;

  忽略的异常:忽略的异常。until:条件判断,参数必须是expected_conditions对象。

  

  更多方法请参考:

  为什么需要行为链?

  因为有些网站可能会在浏览器端做一些验证,看行为是否符合人类行为做反爬虫。这时候我们就可以用行为链来模拟人的操作了。行为链有更复杂的操作,比如双击、右键等,在自动化测试中非常有用。

  操作 cookie:获取所有 cookie:

  for cookie in driver.get_cookies():

print(cookie)

  根据cookie的key获取值:

  value = driver.get_cookie(key)

  删除所有 cookie:

  driver.delete_all_cookies()

  要删除 cookie:

  driver.delete_cookie(key)

  添加饼干:

  driver.add_cookie({“name”:”username”,”value”:”abc”})

  

  隐式等待和显式等待: 隐式等待:指定将保持等待状态的时间。隐式等待需要使用 driver.implicitly_wait。显式等待:指定在一定时间内,如果满足某个条件,则不再等待,如果在指定时间内不满足条件,则不再等待。显式等待的方式是从 selenium.webdriver.support.ui import WebDriverWait。示例代码如下:

  driver.get("https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc")

WebDriverWait(driver,100).until(

EC.text_to_be_present_in_element_value((By.ID,"fromStationText"),"长沙")

)

WebDriverWait(driver,100).until(

EC.text_to_be_present_in_element_value((By.ID,"toStationText"),"北京")

)

btn = driver.find_element_by_id("query_ticket")

btn.click()

  打开新窗口和切换页面:在selenium中打开新窗口没有特殊的方法,通过window.execute_script()以执行js脚本的形式打开新窗口。

  window.execute_script("window.open('https://www.douban.com/')")

  打开一个新窗口后,驱动的当前页面还是和以前一样。如果要获取新窗口的源代码,必须先切换到它。示例代码如下:

  window.switch_to.window(driver.window_handlers[1])

  设置代理:

  通过ChromeOptions设置代理,示例代码如下:

  options = webdriver.ChromeOptions()

options.add_argument("--proxy-server=http://110.52.235.176:9999")

driver = webdriver.Chrome(executable_path="D:\ProgramApp\chromedriver\chromedriver73.exe",chrome_options=options)

driver.get("http://httpbin.org/ip")

  补充:get_property:获取html标签中官方写的属性。get_attribute:获取 html 标签中的官方和非官方属性。driver.save_screenshoot:获取当前页面的截图。有时请求会失败,所以你可以保存当前页面的截图以供以后分析。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线