python抓取动态网页(Python爬虫入门②Selenium动态网页抓取初步解析(图) )
优采云 发布时间: 2022-03-17 02:25python抓取动态网页(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('/html/body/div[2]/div/div/div[1]/a')
#通过标签包裹的文本'话题广场'获取元素列表(精确定位)
r5 = driver.find_element_by_link_text('话题广场')
#通过标签包裹文本'画出你的'获取元素的列表(模糊定位)
r6 = driver.find_element_by_partial_link_text('话题')
#通过标签名获取元素列表
r7 = driver.find_element_by_tag_name('div')
#通过标签包裹的文本内容
r8=driver.find_element_by_tag_name('h1')
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('/html/body/div[1]/div[1]/ul[1]/li[2]').click()
#账户和密码根据不同选择执行,这里是我瞎写的^_^
driver.find_element_by_xpath('//*[@id="username"]').send_keys('3385452176')
driver.find_element_by_xpath('//*[@id="password"]').send_keys('kexingbeiguxiang')
driver.find_element_by_xpath('/html/body/div[1]/div[2]/div[1]/div[5]/a').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='/home/wang/桌面/geckodriver')
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='/home/wang/桌面/geckodriver')
link1="https://www.airbnb.cn/s/%E5%8D%97%E4%BA%AC/homes?refinement_paths%5B%5D=%2Fhomes¤t_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§ion_offset=4&items_offset="
#找到页面内的所有租房
rent_list = driver.find_elements_by_css_selector('div._14csrlku')
for eachhouse in rent_list:
#爬取房屋类型
Housenm=eachhouse.find_element_by_css_selector('div._wuffzwa')
Housenm=Housenm.text
#爬取房屋价格:
Housepc=eachhouse.find_element_by_css_selector('span._j1kt73')
Housepc=Housepc.text.replace("每晚","").replace("价格","").replace("\n","")
#爬取房屋简介:
Housety=eachhouse.find_element_by_css_selector('div._dadnbjj')
Housety=Housety.text
#爬取评价人数:
try:
Mennnum=eachhouse.find_element_by_css_selector('span._69pvqtq')
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()