python抓取动态网页(Python爬虫入门②Selenium动态网页抓取初步解析(图) )

优采云 发布时间: 2022-03-17 02:25

  python抓取动态网页(Python爬虫入门②Selenium动态网页抓取初步解析(图)

)

  Python爬虫介绍② Selenium动态网页抓取初步分析

  详细介绍:

  Selenium是一个web应用的自动化框架,通过它我们可以编写一些自动化程序,可以直接在浏览器上运行,支持所有主流浏览器,包括一些非接口浏览器,可以接收指令,让浏览器自动加载页面,获取html、css、js和一些图片数据,甚至获取页面截图(类似于百度截图)。

  PhantomJS:基于 Webkit 的“无头浏览器”,将网页加载到内存中并在页面上执行 JavaScript

  Chromedriver:可以用selenium驱动的浏览器,与PhantomJS不同,因为它有接口

  Selenium 3.0 版本的自动化框架:

  ①:Selenium 客户端库

  ②:浏览器驱动:

  ③:浏览器

  演示:通过python+selenium完成自动打开百度、搜索、网页截图功能

  import selenium

from selenium import webdriver

import time

if __name__=="__main__" :

#1.创建浏览器对象

driver=webdriver.Firefox(executable_path='/home/wang/桌面/geckodriver')#添加可执行路径

#2.请求页面

driver.get('https://www.baidu.com')

#3.页面的基本操作(点击,输入)

driver.find_element_by_id('kw').send_keys('Python')

driver.find_element_by_id('su').click()

time.sleep(5)#延迟

driver.save_screenshot('baidu1.png')

#获取渲染之后的数据

print(driver.page_source)

#获取当前的cookie值

print(driver.get_cookies())

#获取当前的url路径

print(driver.current_url)

#关闭页面

driver.close()

#关闭浏览器

driver.quit()

  Selenium 如何获取元素:

  方法名角色

  find_element_by_id()

  根据 id 属性的值获取元素列表

  find_element_by_class_name

  按类名获取元素列表

  find_element_by_xpath

  通过 xpath 选择返回元素列表

  find_element_by_link_text

  根据链接地址获取元素列表,精准定位

  find_element_by_name

  按元素名称选择

  find_element_by_tag_name

  按标签名称获取元素列表

  find_element_by_css_selector

  按元素类选择

  Demo:豆瓣文章通过Selenium获取元素文章:

  from selenium import webdriver

if __name__=="__main__":

driver = webdriver.Firefox(executable_path="/home/wang/桌面/geckodriver")

driver.get('https://www.douban.com/gallery/topic/135249/?from=hot_topic_anony_sns')

#1.通过id获取属性

r1 = driver.find_element_by_id('content')

#2通过标签的id值获取多个标签----得到的是列表:

r2 = driver.find_elements_by_id('dale_explore_home_middle_right')

#3.通过标签的class属性获取标签

r3 = driver.find_element_by_class_name('topic-abstract')

#通过xpath获取左上教豆瓣图片的<a>标签

r4 = driver.find_element_by_xpath(&#39;/html/body/div[2]/div/div/div[1]/a&#39;)

#通过标签包裹的文本&#39;话题广场&#39;获取元素列表(精确定位)

r5 = driver.find_element_by_link_text(&#39;话题广场&#39;)

#通过标签包裹文本&#39;画出你的&#39;获取元素的列表(模糊定位)

r6 = driver.find_element_by_partial_link_text(&#39;话题&#39;)

#通过标签名获取元素列表

r7 = driver.find_element_by_tag_name(&#39;div&#39;)

#通过标签包裹的文本内容

r8=driver.find_element_by_tag_name(&#39;h1&#39;)

driver.quit()

  其他硒方法:

  名称角色

  清除

  清除元素的内容

  发送键

  模拟按键输入

  点击

  点击元素

  提交

  提交表格

  向前

  向前翻页

  背部

  返回页面

  switch_to.window

  页面转换

  案例:实现豆瓣自动登录

  通过selenium,我们分析了一系列通往豆瓣的xss路径。根据这些路径和selenium方法,我们可以使用如下代码自动登录:

  from selenium import webdriver

if __name__ =="__main__":

driver =webdriver.Firefox(executable_path="/home/wang/桌面/geckodriver")

driver.get("https://www.douban.com/")

#进入嵌套页面

driver.switch_to_frame(0)

driver.find_element_by_xpath(&#39;/html/body/div[1]/div[1]/ul[1]/li[2]&#39;).click()

#账户和密码根据不同选择执行,这里是我瞎写的^_^

driver.find_element_by_xpath(&#39;//*[@id="username"]&#39;).send_keys(&#39;3385452176&#39;)

driver.find_element_by_xpath(&#39;//*[@id="password"]&#39;).send_keys(&#39;kexingbeiguxiang&#39;)

driver.find_element_by_xpath(&#39;/html/body/div[1]/div[2]/div[1]/div[5]/a&#39;).click()

  Selenium 高级操作

  由于 Selenium 直到整个页面加载完毕后才开始爬取内容,因此往往会很慢,因此我们使用一些控件来加快爬取内容的速度。

  ①:限制CSS的加载:

  在爬取的过程中,我们只爬取页面的内容,所以css样式文件对内容没有影响。通过限制 Css,我们可以减少加载时间。代码内容如下:

  ②:限制图片加载:

  如果我们不需要从网络上抓取图片,那么我们最好禁用图片的加载

  from selenium import webdriver

fp=webdriver.FirfoxProfile()

fp.set_preference("permissions.default.stylesheet",2)#控制css加载

fp.set_preference("permissions.deault.image",2)#控制图片加载

fp.set_preference("javascript.enabled",False)#控制Javascript加载

driver=webdriver.Firfox(firefox_profile=fp,executable_path=&#39;/home/wang/桌面/geckodriver&#39;)

driver.get("https:"//www.bilibli.com)

  项目实战:爬取Airbnb南京房源

  项目分析:

  如果要爬取南京的房源,需要找到出租房屋、房型、价格、简介对应的标签。通过检查,我们可以得到响应的元素关系如下

  数据元素类

  房子的所有数据

  div

  _14csrlku

  房屋类型数据

  div

  呜呜呜

  房价数据

  跨度

  _j1kt73

  房屋评估数据

  跨度

  _69pvqtq

  房屋档案资料

  div

  _dadnbjj

  所以写

  from selenium import webdriver

import time

fp=webdriver.FirefoxProfile()

fp.set_preference("permissions.default.image",2)#限制图片的加载,提高爬取速度

fp.set_preference("permissions.dafault.stylesheet",2)#限制Css加载,提高爬取速度

driver =webdriver.Firefox(firefox_profile=fp,executable_path=&#39;/home/wang/桌面/geckodriver&#39;)

link1="https://www.airbnb.cn/s/%E5%8D%97%E4%BA%AC/homes?refinement_paths%5B%5D=%2Fhomes&current_tab_id=home_tab&selected_tab_id=home_tab&screen_size=small&hide_dates_and_guests_filters=false&map_toggle=false&s_tag=qexb3_m2&section_offset=4&items_offset="

#找到页面内的所有租房

rent_list = driver.find_elements_by_css_selector(&#39;div._14csrlku&#39;)

for eachhouse in rent_list:

#爬取房屋类型

Housenm=eachhouse.find_element_by_css_selector(&#39;div._wuffzwa&#39;)

Housenm=Housenm.text

#爬取房屋价格:

Housepc=eachhouse.find_element_by_css_selector(&#39;span._j1kt73&#39;)

Housepc=Housepc.text.replace("每晚","").replace("价格","").replace("\n","")

#爬取房屋简介:

Housety=eachhouse.find_element_by_css_selector(&#39;div._dadnbjj&#39;)

Housety=Housety.text

#爬取评价人数:

try:

Mennnum=eachhouse.find_element_by_css_selector(&#39;span._69pvqtq&#39;)

Mennnum=Mennnum.text

Mennnum=str(Mennnum)

except:

Mennnum=str(0)

with open ("南京短租房","a+")as fl:

fl.write("户型:"+Housenm+" ")

fl.write("价格:"+Housepc+" ")

fl.write("评价人数:"+Mennnum+" ")

fl.write("简介:"+Housety+" ")

fl.write("\n")

driver.quit()

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线