动态网页抓取(2016年上海事业单位招聘考试:动态网页爬虫-乐题库)
优采云 发布时间: 2021-11-24 00:03动态网页抓取(2016年上海事业单位招聘考试:动态网页爬虫-乐题库)
动态网络爬虫 什么是动态网络爬虫和AJAX技术:动态网页是网站通过ajax技术动态更新网站中的部分数据,无需重新加载。比如拉勾网的招聘页面,在页面变化的过程中,url并没有发生变化,但是招聘信息是动态变化的。AJAX (Asynchronouse JavaScript And XML) 异步 JavaScript 和 XML。前端与服务器交换少量数据,Ajax 可以实现网页的异步更新。这意味着可以在不重新加载整个网页的情况下更新网页的某些部分。如果内容需要更新,传统网页(不使用 Ajax)必须重新加载整个网页。因为传统的数据传输格式是XML语法。所以它被称为 AJAX。实际上,数据交互现在基本使用JSON。使用AJAX加载的数据,即使使用JS将数据渲染到浏览器中,右击->查看网页源码也看不到ajax加载的数据,只能看到使用这个加载的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类实例化的一个对象。
参数是设置浏览器是否可视化以及请求headers等信息。
浏览器多窗口切换就是在同一个浏览器的不同网页窗口之间进行切换。
Selenium 提供了一些延迟功能
隐形等待就是在设定的时间内检测网页是否已经加载完毕,即浏览器标签栏的小圆圈在执行下一步之前没有转动。
显性等待可以根据判断条件灵活等待。该程序每隔一定时间检查一次。如果结果和检测条件都满足,则执行下一步。显式等待的使用涉及多个模块:
By:设置元素定位方式。它们是 ID、XPATH、LINK_TEXT、NAME 等。
expected_conditions:验证网页元素是否存在。
WebDriverWait 的参数说明如下: driver:浏览器对象驱动程序;timeout:超时时间;poll_frequency:检测时间间隔;
ignore_exceptions:忽略的异常。until:条件判断,参数必须是expected_conditions对象。
更多方法请参考:
为什么我们需要行为链?
因为有些网站可能会在浏览器上做一些验证,看行为是否与人类行为一致来做反爬虫。这时候我们就可以用行为链来模拟人的操作了。行为链有更复杂的操作,如双击、右键单击等,在自动化测试中非常有用。
操作cookie:获取所有cookie:
for cookie in driver.get_cookies():
print(cookie)
根据cookie的key获取value:
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。显式等待:指定如果在一定时间内满足某个条件,则不再等待,如果在指定时间内不满足条件,则不再等待。显式等待的方式是 from 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:获取当前页面的截图。有时请求失败,此时可以保存当前页面的截图,以备日后分析。