selenium介绍
#1 由于requests不能 执行js---》逐个分析 ajax请求--》模拟发送获取数据
-使用requests爬取的数据 很大概率跟在浏览器中看到的不一样
-requests不能执行js
#2 selenium
selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题
selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果(跟咱们在浏览器看到的完全一致--》可见即可爬),可支持多种浏览器
# 3 使用
1 确认好,我们要驱动什么浏览器(谷歌[以它为例],火狐,ie。。)
2 下载一个浏览器驱动:【驱动版本跟谷歌浏览器要对应】
122.0.6261.58 ----》https://googlechromelabs.github.io/chrome-for-testing/
win平台是:chromedriver.exe
3 把驱动放在 环境变量下--->项目根路径下
4 安装selenium 模块
pip install selenium
5 写代码
from selenium import webdriver
import time
bro = webdriver.Chrome() # 手动打开了浏览器
bro.get('https://www.baidu.com') # 在浏览器中输入要访问的网址,并访问
time.sleep(5)
bro.close() # 关闭浏览器
# 4 如果是:122.0.6261.57这个版本,下它
https://storage.googleapis.com/chrome-for-testing-public/122.0.6261.57/win64/chromedriver-win64.zip
模拟登录
import time from selenium import webdriver from selenium.webdriver.common.by import By bro = webdriver.Chrome() bro.get('https://www.baidu.com') # 设置等待 10s--->找标签,如果找不到--会最多等待10s钟 bro.implicitly_wait(10) # 屏幕最大 bro.maximize_window() # 选择器---》找标签 # submit_btn=bro.find_element(by=By.ID,value='s-top-loginbtn') # 通过id找的 submit_btn = bro.find_element(by=By.LINK_TEXT, value='登录') # 通过a标签的文字找 # 点击标签 submit_btn.click() # 点击短信登录---》睡3s钟---》点击账号登录 sms_submit = bro.find_element(By.ID, 'TANGRAM__PSP_11__changeSmsCodeItem') sms_submit.click() time.sleep(3) username_submit = bro.find_element(By.ID, 'TANGRAM__PSP_11__changePwdCodeItem') username_submit.click() time.sleep(3) # 找到账号和密码---》输入 username = bro.find_element(By.ID, 'TANGRAM__PSP_11__userName') username.send_keys('18953675221') # 向输入框中写内容 time.sleep(1) password = bro.find_element(By.ID, 'TANGRAM__PSP_11__password') password.send_keys('18953675221') # 向输入框中写内容 time.sleep(1) # 点击接受---》点击登录 accept = bro.find_element(By.ID, 'TANGRAM__PSP_11__isAgree') accept.click() time.sleep(1) submit = bro.find_element(By.ID, 'TANGRAM__PSP_11__submit') submit.click() time.sleep(5) bro.close()
无头浏览器
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument('blink-settings=imagesEnabled=false') # 不加载图片, 提升速度 options.add_argument('--headless') # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败 # 会去环境变量找驱动----》找的过程比较慢---》找到过一次,再运行就快了 # 这个是谷歌浏览器可执行文件的位置---》可以不配---》环境变量中有 # options.binary_location = r"C:\Users\oldboy\AppData\Local\Google\Chrome\Application\chrome.exe" # 指定驱动的位置,具体需要参照文档 # options.xx='D:\Python27\crawl_day03\chromedriver.exe' bro = webdriver.Chrome(options=options) bro.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html') print('破解知乎登陆' in bro.page_source) print(bro.page_source)
搜索标签
# 1 搜索标签
# By.ID # 根据id号查找标签
# By.NAME # 根据name属性查找标签
# By.TAG_NAME # # 根据标签查找标签
# By.CLASS_NAME # 按类名找
# By.LINK_TEXT # a标签文字
# By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配
#---------selenium 自己的--------
# By.CSS_SELECTOR # 按css选择器找
# By.XPATH #按xpath找
# 2 获取标签的属性,文本,大小,位置
# print(tag.get_attribute('src'))
# print(tag.id) # 这个id不是id号,不需要关注
# print(tag.location)
# print(tag.tag_name)
# print(tag.size)
'''############1 搜索标签############## # By.ID # 根据id号查找标签 # By.NAME # 根据name属性查找标签 # By.TAG_NAME # # 根据标签查找标签 # By.CLASS_NAME # 按类名找 # By.LINK_TEXT # a标签文字 # By.PARTIAL_LINK_TEXT # a标签文字,模糊匹配 ---------selenium 自己的-------- # By.CSS_SELECTOR # 按css选择器找 # By.XPATH #按xpath找 ############2 获取标签的属性,文本,id(不是id属性,没用),大小,位置############## print(tag.get_attribute('src')) print(tag.text) print(tag.id) # 这个id不是id号,不需要关注 print(tag.location) print(tag.tag_name) print(tag.size) # 使用位置和大小---》后续咱们会截图验证码-->破解验证码 ''' import time from selenium import webdriver from selenium.webdriver.common.by import By bro = webdriver.Chrome() bro.get('https://www.cnblogs.com/liuqingzheng/p/16005896.html') # bro.implicitly_wait(10) bro.maximize_window() # bro.find_element() # 找一个 # bro.find_elements() # 找所有 # 1 按id找---找到点赞---》点击它--->使用id找 # number=bro.find_element(By.ID,'digg_count') # number.click() #2 按标签名找 找出页面中所有a标签 按标签名找 # a_list=bro.find_elements(By.TAG_NAME,'a') # print(len(a_list)) # 3 按 类名找 # dig=bro.find_element(By.CLASS_NAME,'diggit') # dig.click() # 4 按 a 标签 文字找 By.LINK_TEXT # res=bro.find_element(By.LINK_TEXT,'分布式爬虫') # print(res.text) # print(res.get_attribute('href')) # res.click() # 5 a标签文字,模糊匹配 By.PARTIAL_LINK_TEXT # res=bro.find_element(By.PARTIAL_LINK_TEXT,'分布式') # print(res.text) # print(res.get_attribute('href')) # res.click() # 6 css 解析 # res=bro.find_element(By.CSS_SELECTOR,'a#cb_post_title_url>span') # res=bro.find_element(By.CSS_SELECTOR,'#cb_post_title_url > span') # print(res.get_attribute('role')) # print(res.text) # 7 xpath解析--->不会xpath语法 # res=bro.find_element(By.XPATH,'//*[@id="cb_post_title_url"]/span') # print(res.get_attribute('role')) # print(res.text) time.sleep(5) bro.close()
标签属性,位置,大小,文本
''' ############2 获取标签的属性,文本,id(不是id属性,没用),大小,位置############## print(tag.get_attribute('src')) print(tag.text) print(tag.id) # 这个id不是id号,不需要关注 print(tag.location) print(tag.tag_name) print(tag.size) # 使用位置和大小---》后续咱们会截图验证码-->破解验证码 ''' import time from selenium import webdriver from selenium.webdriver.common.by import By bro = webdriver.Chrome() bro.get('https://kyfw.12306.cn/otn/resources/login.html') bro.implicitly_wait(10) bro.maximize_window() a = bro.find_element(By.LINK_TEXT, '扫码登录') a.click() time.sleep(1) bro.save_screenshot('main.png') # 打印标签位置和坐标 img=bro.find_element(By.ID,'J-qrImg') print(img.location) print(img.size) time.sleep(5) bro.close()
等待元素-元素操作-执行js-选项卡
等待元素
# 1 隐士等待
# bro.implicitly_wait(10) 设置隐士等待---》我们在find_element 找标签时候,标签有可能还没加载出来---》而代码执行非常快---》取不到标签就会报错
#加了这一句---》当咱们取标签的时候,如果标签,没加载好---》等待最多10s---》等标签加载出来后--》找到了继续往后走
# 2 显示等待---》不好用
-每找一个标签,都要给它设置一次等待---》太麻烦了
-这种忽略,不用它即可
# 以后,都在访问到某个地址后,加入这句话即可
bro.implicitly_wait(10)
执行js
import time from selenium import webdriver from selenium.webdriver.common.by import By bro = webdriver.Chrome() bro.get('https://www.pearvideo.com/category_1') bro.implicitly_wait(10) bro.maximize_window() # 1 基本使用 # bro.execute_script('alert("美女")') # 2 打印出一些变量 # bro.execute_script('console.log(urlMap)') # bro.execute_script('alert(JSON.stringify(urlMap))') # 3 新建选项卡 # bro.execute_script('open()') # 4 滑动屏幕 # bro.execute_script('scrollTo(0,document.documentElement.scrollHeight)') # 5 获取当前访问地址 # bro.execute_script('alert(location)') # bro.execute_script('location="http://www.baidu.com"') # 6 打印cookie bro.execute_script('alert(document.cookie)') time.sleep(10) bro.close()
选项卡
from selenium import webdriver import time bro = webdriver.Chrome() bro.get('https://www.pearvideo.com/') bro.implicitly_wait(10) print(bro.window_handles) # 开启选项卡 bro.execute_script('window.open()') # 获取出所有选项卡 bro.switch_to.window(bro.window_handles[1]) # 切换到某个选项卡 bro.get('http://www.taobao.com') time.sleep(2) bro.switch_to.window(bro.window_handles[0]) # 切换到某个选项卡 bro.get('http://www.baidu.com') time.sleep(2) bro.execute_script('window.open()') bro.execute_script('window.open()') bro.close() # 关闭选项卡 time.sleep(2) bro.quit() # 关闭页面
模拟浏览器前进后退
from selenium import webdriver import time bro = webdriver.Chrome() bro.get('https://www.pearvideo.com/') bro.implicitly_wait(10) # 获取出所有选项卡 time.sleep(2) bro.get('http://www.taobao.com') time.sleep(2) bro.get('http://www.baidu.com') time.sleep(2) bro.back() time.sleep(2) bro.back() time.sleep(2) bro.forward() bro.quit() # 关闭页面
自动登录cnblogs
import time from selenium import webdriver from selenium.webdriver.chrome.options import Options import json from selenium.webdriver.common.by import By # 去掉自动化软件控制的检测 options = Options() options.add_argument("--disable-blink-features=AutomationControlled") # 去掉自动化控制 bro = webdriver.Chrome(options=options) # bro = webdriver.Chrome() ########### 纯自动登录#######得到了cookie bro.get('https://www.cnblogs.com/') bro.implicitly_wait(10) bro.maximize_window() login_btn = bro.find_element(By.LINK_TEXT, '登录') login_btn.click() time.sleep(2) # 找到用户名和密码输入框 username = bro.find_element(By.CSS_SELECTOR, '#mat-input-0') password = bro.find_element(By.ID, 'mat-input-1') submit_btn = bro.find_element(By.CSS_SELECTOR, 'body > app-root > app-sign-in-layout > div > div > app-sign-in > app-content-container > div > div > div > form > div > button') # 验证码 code=bro.find_element(By.ID,'rectMask') time.sleep(1) username.send_keys('@qq.com') time.sleep(1) password.send_keys('#') time.sleep(1) submit_btn.click() # 一种情况直接登录成功 一种情况会弹出验证码 code.click() time.sleep(10) # 让程序先停在这---》手动操作浏览器---》把验证码搞好---》程序再继续往下走 # 到现在,是登录成功的状态 # 取出cookie存起来 cookies = bro.get_cookies() with open('cnblogs.json', 'w', encoding='utf-8') as f: json.dump(cookies, f) time.sleep(2) bro.close()
import time from selenium import webdriver from selenium.webdriver.chrome.options import Options import json from selenium.webdriver.common.by import By # 去掉自动化软件控制的检测 options = Options() options.add_argument("--disable-blink-features=AutomationControlled") # 去掉自动化控制 bro = webdriver.Chrome(options=options) bro.get('https://www.cnblogs.com/') bro.implicitly_wait(10) bro.maximize_window() time.sleep(5) # 取出cookie--》写入到浏览器中---》刷新浏览器---》登录状态 with open('cnblogs.json', 'r') as f: cookies = json.load(f) # 写到浏览器中 for item in cookies: bro.add_cookie(item) # 如果是没登录的cookie,往里写会报错 # 刷新浏览器 bro.refresh() time.sleep(5) bro.close()
抽屉半自动点赞
####自动登录---使用selenium#### import json # import time # # from selenium import webdriver # from selenium.webdriver.chrome.options import Options # import json # from selenium.webdriver.common.by import By # # bro = webdriver.Chrome() # bro.get('https://dig.chouti.com/') # bro.implicitly_wait(10) # bro.maximize_window() # # btn_login = bro.find_element(By.ID, 'login_btn') # time.sleep(1) # btn_login.click() # time.sleep(1) # # phone = bro.find_element(By.NAME, 'phone') # password = bro.find_element(By.CSS_SELECTOR, # 'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div.form-item.login-item.clearfix.mt24 > div > input.input.pwd-input.pwd-input-active.pwd-password-input') # # submit_login = bro.find_element(By.CSS_SELECTOR, # 'body > div.login-dialog.dialog.animated2.scaleIn > div > div.login-footer > div:nth-child(4) > button') # # phone.send_keys('18953675221') # password.send_keys('lqz123') # time.sleep(2) # submit_login.click() # # input('等你') # # cookies = bro.get_cookies() # with open('chouti.json', 'w', encoding='utf-8') as f: # json.dump(cookies, f) # # time.sleep(2) # bro.close() #### 使用requests点赞 # 访问首页,解析出id号 import requests from bs4 import BeautifulSoup #### 携带cookie访问##### session = requests.Session() cookie = {} # 本地取出来,写入 with open('chouti.json', 'r') as f: cookie_list = json.load(f) ##### selenium的cookie和requests的cookie格式不一样,要转换 {key:value,key:value} for item in cookie_list: cookie[item['name']] = item['value'] header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36'} res = session.get('https://dig.chouti.com/', cookies=cookie,headers=header) soup = BeautifulSoup(res.text, 'html.parser') print(res.text) divs = soup.find_all(name='div', class_='link-item') for div in divs: article_id = div.attrs.get('data-id') data = { 'linkId': article_id } res1 = session.post('https://dig.chouti.com/link/vote', data=data,headers=header) print(res1.text)
标签:03,webdriver,days,爬虫,bro,sleep,time,print,import From: https://www.cnblogs.com/wzh366/p/18025453