2021-05-21

selenium快速入门(二)

鼠标行为链(重要)

  • 有时候在页面中的操作可能要有很多步,那么这时候可以使用鼠标行为链类ActionChains来完成。比如现在要将鼠标移动到某个元素上并执行点击事件。
actions = ActionChains(driver)
actions.move_to_element(inputTag)
actions.send_keys_to_element(inputTag,'python')
actions.move_to_element(submitTag)
actions.context_click()
actions.click(submitTag)
actions.perform()
  • 鼠标有什么行为和动作? 如双击、右键、单击 ...
    click_and_hold(element):点击但不松开鼠标。
    context_click(element):右键点击。
    double_click(element):双击。

  • 还有更多的鼠标相关的操作,更多方法请参考:http://selenium-python.readthedocs.io/api.html

  • 小结: 证据链 客观的事实和证物形成的链条

  • 小粟子

from selenium import webdriver
import time
from selenium.webdriver import ActionChains  # 在光标定在ActionChains后面,Alt+回车,自动出来

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

# 定位输入框
inputTag = driver.find_element_by_id('kw')

# 定位百度一下的按钮 注意find_elements和find_element的区别
buttonTag = driver.find_element_by_id('su')

# 实例化对象
actions = ActionChains(driver)

# 往输入框里面输入内容
actions.send_keys_to_element(inputTag, '瑶琪')
time.sleep(1)

# 把鼠标移动到按钮上
actions.move_to_element(buttonTag)

# 点击行为不要在鼠标行为链里面出现
actions.click()
# 提交行为链
actions.perform()
print("程序运行结束!")

'''
1 千万不要忘记提交鼠标行为链   actions.perform()
2 需要注意鼠标行为链里面的点击操作
'''

selenium爬取数据

  • drvier.page_source 获取html结构的源码
    selenium提取数据的方式,是以页面最终渲染以后,以前端页面为基准的,和响应内容没有什么关系
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
time.sleep(1)
# drvier.page_source 获取html结构的源码
html = driver.page_source
print(html)
  • find() 在html结构中查找某个字符串是否存在
    数字就证明存在,没有什么规律
    如果不存在会返回 -1
# find()  在html结构中查找某个字符串是否存在
# 数字就证明存在,没有什么规律
# 如果不存在会返回 -1
print(driver.page_source.find('kw1212313213123132'))#-1
print(html.find('kw'))#5682
  • noed(元素对象) node.get_attribute('src') 获取节点的属性值 src
from selenium import webdriver
import time
driver = webdriver.Chrome()
# noed(元素对象) node.get_attribute('src') 获取节点的属性值 src
driver.get('https://maoyan.com/board/4')
time.sleep(1)
img_tag = driver.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/dl/dd[1]/a/img[2]')
print(img_tag.get_attribute('src'))
  • node.text 获取节点的文本内容 (包括子节点和后代节点)

使用selenium获取猫眼电影top100电影信息

  • 需求: 使用selenium获取猫眼电影top100电影信息:电影排名,电影名称,主演,上映时间,评分
  • 第一步 分析页面结构 选择合适的技术点
    通过分析,数据都是在dl标签里面,dl标签里面每一个dd标签它就是一部电影
    我们先搞定一页的电影数据,再去搞定其它页的
    明确目标的url https://maoyan.com/board/4
    翻页的处理:当我们点击到最后一页的时候,发现下一页的按钮没有了,就可以判断是最后一页了
while True:
    try:
        driver.find_element_by_link_text('下一页').click()
    except Exception as e:
        driver.quit()
        break
  • 第二步 实现步骤
    初步分析代码
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://maoyan.com/board/4')
# 找到这一页的dd标签
dd_list = driver.find_elements_by_xpath('//*[@id="app"]/div/div/div[1]/dl')
print(dd_list)
for dd in dd_list:
    print(dd.text)
    print("*"*90)
image.png

整理后的完整代码

from selenium import webdriver
import time
import csv

driver = webdriver.Chrome()
driver.get('https://maoyan.com/board/4')


def get_one_page():
    # 找到这一页的dd标签
    # dd_list = driver.find_elements_by_xpath('//*[@id="app"]/div/div/div[1]/dl')
    dd_list = driver.find_elements_by_xpath('//*[@id="app"]/div/div/div[1]/dl/dd')
    list_1 = []
    for dd in dd_list:
        # # text属性 获取当前dd节点的子节点以及后代节点的文本内容
        # # 视情况而分析 验证我们打印的内容有什么规律吗?如果有,就进一步操作
        # print(dd.text)
        # print("*"*90)
        one_film_info_lst = dd.text.split('\n')
        item = {}
        try:
            item['rank'] = one_film_info_lst[0]
            item['name'] = one_film_info_lst[1]
            item['actor'] = one_film_info_lst[2]
            item['time'] = one_film_info_lst[3]
            item['score'] = one_film_info_lst[4]
        except:
            pass
        list_1.append(item)
        # print(list_1)
        # print('*'*80)
    return list_1
    # print(item)
    # print("*" * 90)


def saveData(list_top):
    headers = ('rank', 'name', 'actor', 'time', 'score')  # 标题
    with open('top100.csv', 'w', encoding='utf-8', newline='') as file_obj:
        writer = csv.DictWriter(file_obj, headers)  # 两个参数,一个是文件对象,一个是行标题
        writer.writeheader()  # 写入标题, 需要注意 字典里面的key值要和表头里面的保持一致
        writer.writerows(list_top)  # 多行写入
    print("数据写入完毕,请到文件所在位置打开查看!")


if __name__ == '__main__':
    list_top = []
    while True:
        list_top.extend(get_one_page())
        time.sleep(2)
        try:  # 找不到下一页则弹出异常,#try这个关键字来捕获异常
            driver.find_element_by_link_text('下一页').click()
        except Exception as e:  # except:出现错误的处理
            driver.quit()
            break
    saveData(list_top)

爬取京东数据

第一步 页面分析

我们发现 所有的数据都是在一个ul标签 ul标签下面每一个li标签对应的就是一本书。

我们拖动 拖动条(滚轮)的时候 页面又加载了数据

当我们进入这个页面的时候,把这个拖动条拖动一下,拖到最下面,然后等它加载一会儿,等页面元素加载完了之后,我们再去抓取

每页 上来先加载30个 当我们进行拖动的时候 它又会加载30个 也就是每页其实是60个数据

如何拖动 拖动条?

我们会用到一个 加载js的方法

翻页处理

找规律 我们先看最后一页 发现这个 下一页的按钮还在

[图片上传失败...(image-c11091-1621588496637)]

我们随便点击了一页(不是最后一页)

[图片上传失败...(image-4f2a38-1621588496637)]

第二步 实现步骤

看笔记

xxxxxxxxxx

设置无界面模式

xxxxxxxxxx

你可能感兴趣的:(2021-05-21)