首页 > 其他分享 >爬虫03_days

爬虫03_days

时间:2024-02-21 16:15:40浏览次数:38  
标签:03 webdriver days 爬虫 bro sleep time print import

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

相关文章

  • Rust 编译报 spurious network error (1 tries remaining): [7] Couldn't connect to
    现象:当执行 cargobuild时报类似错误:warning:spuriousnetworkerror(3triesremaining):[7]Couldn'tconnecttoserver(Failedtoconnectto127.0.0.1port8899after2040ms:Couldn'tconnecttoserver);class=Net(12)warning:spuriousnetworkerror......
  • Scrapy爬虫框架
    一、安装Scrapypipinstallscrapy二、创建scrapy项目scrapystartprojectmy_spider三,创建爬虫文件scrapygenspiderexampleexample.com#example文件名称#example.com爬取网站地址#如:scrapygenspiderbaidubaidu.com出现下图就创建成功 四、运行刚才......
  • python 爬虫模板
    前言在我们写爬虫的时候,一般想要的数据都在详情页里面,一般代码进入详情页参数,需要首页里面寻找,所以爬这样的网站,需要定义一个模板我的模板如下: importrandomimporttimeimportrequestsfromauctionimportlogtoolfromauction.BaseCrawlerimportBaseCrawlercla......
  • python实战:用requests+做爬虫
    一,安装requests1,用pip安装(venv)liuhongdi@192news%pip3installrequests2,查看所安装库的版本:(venv)liuhongdi@192news%pip3showrequestsName:requestsVersion:2.31.0Summary:PythonHTTPforHumans.Home-page:https://requests.readthedocs.ioAu......
  • err code 90030,err msg webhook over limit
    钉钉群机器人发文本消息提示"webhookoverlimit"从2024.02.01钉钉修改了自定义机器人推送政策,免费额度,由之前的不限制,改为:目前钉钉已经限制了免费版的发送次数每个企业每月5000条(之前创建的外部群不限制,但是已经不能新增机器人了。)。钉钉收费版是9800元每年,然后每月5w条(如果......
  • 爬虫_02days
    免费代理池搭建#代理有免费和收费代理#代理有http代理和https代理#匿名度 -高匿:隐藏访问者ip-透明:服务端能拿到访问者ip-作为后端,如何拿到使用代理人的ip -请求头中:x-forword-for-如果一个HTTP请求到达服务器之前,经过了三个代理Proxy1、Proxy2、Proxy3......
  • 【linux新手起步03】linux下载中文输入法。
    linux下载中文输入法一、(全英文环境下载报错)E:Unabletolocatepackagefcitx二、apt更新三、安装中文环境包四、配置中文输入法一.(全英文环境下载报错)E:Unabletolocatepackagefcitxsudoaptinstallfcitx5fcitx5-pinyinroot权限下apt下载出现以下问题:E:......
  • 03 事务隔离
    03事务隔离事务:保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持是在引擎层实现的。事务ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)。建议你尽量不要使用长事务。****读未提交(readuncommitted)、读提交(readco......
  • Godot学习中的问题及思考、学习笔记 03
    GameManager类在Godot项目中通常扮演着游戏管理器的角色,负责协调游戏内不同系统、状态和数据的管理。它是一种设计模式,用于集中管理游戏逻辑和状态,使得游戏的结构更加清晰,也便于维护和扩展。GameManager可以处理多种任务,包括但不限于:游戏状态管理:控制游戏的当前状态,比如开始......
  • because it set 'X-Frame-Options' to 'sameorigin'
    报错becauseitset'X-Frame-Options'to'sameorigin'.Refusedtodisplay'https://xxx.xxx.cn/'inaframebecauseitset'X-Frame-Options'to'sameorigin'.解决方法:修改页面,增加meta配置<head><!--CSP......