爬虫day4-selenium和xpath

selenium和xpath

网页前进后退和切换选择卡

from selenium.webdriver import Chrome
import time

# 页面前进后退
b = Chrome()
b.get('https://www.baidu.com')
time.sleep(1)

b.get('https://www.runoob.com')
time.sleep(1)


b.get('https://movie.douban.com/top250')
time.sleep(1)
# 后退
b.back()
time.sleep(1)
# 前进
b.forward()



b = Chrome()
b.get('https://movie.douban.com')
time.sleep(1)

misic = b.find_element_by_css_selector('.global-nav-items>ul>li:nth-child(4)>a')
misic.click()
url = misic.get_attribute('href')
time.sleep(1)
# 切换选项卡
b.switch_to.window(b.window_handles[0])

time.sleep(1)
b.switch_to.window(b.window_handles[1])

隐式等待与显示等待

1.隐式等待
如果设置了隐式等待时间,那么浏览器对象在通过find_element相关方法获取标签的时候,再找不到的时候不会马上报错,而是在指定时间内不断尝试获取该标签,如果超过了指定时间获取不到才会报错

b.implicitly_wait(2)  # 只需要设置一次隐式等待时间

2.显示等待
等待满足某个条件成立
1)创建等待对象 = WebDriverWait(浏览器时间,超时时间)
等待对象.until(条件) - 等待指定条件为True获取对应的标签
等待对象.until_not(条件) - 等待指定条件为False获取对应的标签

"""
常见条件:
EC.presence_of_elements_located((By.标签获取方式, 获取方式值))  -   判断某个元素是否被叫到dom树里(判断某个标签是否加载到网页),条件成立返回标签
EC.visibility_of_element_located   -  判断某个标签是否可见(没有隐藏,并且元素的宽度和高度不等于0),条件成立返回标签
EC.text_to_be_present_in_element   -  判断某个标签中的标签内容是否包含了预期的字符串,条件成立返回True
EC.text_to_be_present_in_element_value  -  判断某个标签中的value属性是否包含了预期的字符串,条件成立返回True
EC.element_to_be_clickable   -    判断某个标签是否可以被点击,条件成立返回True
"""

wait = WebDriverWait(b, 5)
wait.until(EC.presence_of_elements_located((By.CSS_SELECTOR, 'css选择器')))
wait.until(EC.visibility_of_element_located((By.ID, 'id属性值')))
wait.until(EC.text_to_be_present_in_element((By.ID, 'id属性值'), '请登入'))
wait.until_not(EC.text_to_be_present_in_element((By.ID, 'id属性值'), '请登入'))
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'css选择器')))

滚动页面

在爬虫时有些网页不会显示所有的网页数据,需要自己去滑动滑块,才会更新出数据,这时就需要用到滚动页面。方法不唯一仅供参考。

from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.keys import Keys
import time

# 1. 创建谷歌浏览器的配置对象
options = ChromeOptions()
# 1) 添加取消测试环境选项
options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
# 2) 取消图片加载
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})

b = Chrome(options=options)
b.get('https://www.jd.com')
# 隐式等待
b.implicitly_wait(2)

a = b.find_element_by_css_selector('#key')
a.send_keys('电脑')
a.send_keys(Keys.ENTER)

time.sleep(2)

# 自动滑动网页
max_height = 8900  # 网页最大长度
height = 500   # 每次滑动多少px
while True:
    b.execute_script(f'window.scrollTo(0,{height})')
    height += 500
    time.sleep(1)
    if height > max_height:
        break

嵌套的网页界面切换网页

from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
"""
前端在实现网页功能的时候可能出现网页中嵌套网页的现象(https://mail.163.com/),如果要在一个网页中嵌套另一个网页,
必须使用iframe标签。
selenium爬取的时候,通过浏览器对象默认获取到最外层的html对应的网页,

"""
b = Chrome()
b.get('https://mail.163.com/')

# 切换到内部嵌套的html中
frame = b.find_element_by_css_selector('#loginDiv>iframe')
print(frame)
print('-------------------------------------------')
b.switch_to.frame(frame)

print(b.page_source)

爬虫流程

1.使用requests + url

2.使用requests + url + user-agent

3.如果需要登入:用requests + url + user-agent + cookie

4.找接送接口

5.使用selenium

6.数据解析(bs4或者xpath和正则表达式)

你可能感兴趣的:(网页爬取,python,爬虫)