爬虫学习--16.反爬斗争 selenium(1)

爬虫与反爬虫的斗争

爬虫建议

  • 尽量减少请求次数

    • 保存获取到的HTML,供查错和重复使用

  • 关注网站的所有类型的页面

    • H5页面

    • APP

  • 多伪装

    • 代理IP

import requests
proxy = {
    'http': '117.114.149.66:55443'
    # mgvpn https://www.mgvpn10.com/
    # ip参考网站 https://www.kuaidaili.com/free/
}
response = requests.get("http://httpbin.org/ip",proxies=proxy)
print(response.text)
  • 随机请求头

# 导入模块
from fake_useragent import UserAgent
​
​
# 实例化UserAgent
ua = UserAgent()
​
headres = {
        "User-Agent": ua.random     # 随机取出一个UserAgent
}
​
print(headres)
  • 利用多线程分布式

    • 在不被发现的情况下我们尽可能的提高速度

Ajax基本介绍

动态了解HTML技术

  • JavaScript

    • 是网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页

  • jQuery

    • jQuery是一个快速、简介的JavaScript框架,封装了JavaScript常用的功能代码

  • Ajax 局部刷新 异步加载

    • Ajax可以使用网页实现异步更新,可以在不重新加载整个网页的情况下,对网页的某部分进行更新

获取Ajax数据的方式

1.直接分析Ajax调用的接口。然后通过代码请求这个接口。 2.使用Selenium+chromedriver模拟浏览器行为获取数据。

方式优点缺点
分析接口直接可以请求到数据。不需要做一些解析工作。代码量少,性能高分析接口比较复杂,特别是一些通过js混淆的接口,要有一定的js功底。容易被发现是爬虫。
selenium直接模拟浏览器的行为,浏览器能请求到的,使selenium也能请求到。爬虫更稳定。代码量多。性能低

Selenium+chromedriver

selenium介绍

Selenium快速入门

from selenium import webdriver
# 实例化浏览器
driver = webdriver.Chrome()
# 发送请求
driver.get('https://www.baidu.com')
# 退出浏览器
driver.quit()

driver定位元素

from selenium import webdriver
from selenium.webdriver.common.by import By
​
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 1、通过id值定位
driver.find_element(By.ID,"kw").send_keys('马化腾')
​
# 2、通过class值定位
driver.find_element(By.CLASS_NAME,"s_ipt").send_keys('马化腾')
​
# 3、通过name定位
driver.find_element(By.NAME,"wd").send_keys('马化腾')
​
# 4、通过tag_name定位
ipt_tag = driver.find_elements(By.TAG_NAME,"input")
print(ipt_tag)
# 说明:HTML本质就是由不同的tag(标签)组成,而每个tag都是指同一类,所以tag定位效率低,一般不建议使用;
​
# 5、通过XPATH语法定位
driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys('海贼王')
​
# 6、通过css语法定位
driver.find_element(By.CSS_SELECTOR,"#kw").send_keys('海贼王')
​
# # 7、通过文本定位--精确定位
driver.find_element(By.LINK_TEXT,"新闻").click()

driver操作表单元素

操作输入框:分为两步。 第一步:找到这个元素。 第二步:使用send_keys(value),将数据填充进去

  • 使用clear方法可以清除输入框中的内容

inputTag.clear()
  • 操作按钮

    • 操作按钮有很多种方式。比如单击、右击、双击等。这里讲一个最常用的。就是点击。直接调用click函数就可以了

inputTag = driver.find_element(By.ID,'su')
inputTag.click()
  • 选择select

    • select元素不能直接点击。因为点击后还需要选中元素。这时候selenium就专门为select标签提供了一个类_from _selenium.webdriver.support.ui _import _Select。将获取到的元素当成参数传到这个类中,创建这个对象。以后就可以使用这个对象进行选择了。中国铁路12306网站

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
import time
​
driver = webdriver.Chrome()
​
url = 'https://kyfw.12306.cn/otn/regist/init'
driver.get(url)
​
'''
iframe 是HTML的一个标签 作用:文档中的文档
如果你要找的标签元素被iframe标签所嵌套,那这个时候你需要切换iframe
'''
'''
总结:
    1 先找到要操作的select标签
    2 通过Select类 传递参数(你要找到下来菜单的元素)
    3 选择方式(根据值来选择 根据索引来选择)
'''
# # 定位到select标签 实例化select对象
select_tag = Select(driver.find_element(By.ID,"cardType"))  # webelement 将这个element对象传递给select对象
​
# # 暂停2秒
time.sleep(2)
# # 根据属性值定位
# select_tag.select_by_value('C')
​
# # 根据索引定位(从0开始)
select_tag.select_by_index(2)
​

selenium之模拟登录豆瓣

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
​
# 加载驱动
driver = webdriver.Chrome()
​
# 拿到目标url
driver.get("https://www.douban.com/")
'''
iframe 是HTML的一个标签 作用:文档中的文档
如果你要找的标签元素被iframe标签所嵌套,那这个时候你需要切换iframe
'''
​
# 切换iframe
login_iframe = driver.find_element(By.XPATH,'//*[@id="anony-reg-new"]/div/div[1]/iframe')
driver.switch_to.frame(login_iframe)
time.sleep(2)
# 1 切换登录方式 定位到 密码登录(但是在这一步操作之前 要确实是否要切换iframe)
driver.find_element(By.CLASS_NAME,"account-tab-account").click()
time.sleep(2)
# 2 输入账号和密码
user_input = driver.find_element(By.ID,"username").send_keys("123456789")
time.sleep(2)
pwd_input = driver.find_element(By.ID,"password").send_keys("123456789")
time.sleep(2)
# 3 点击登录豆瓣
# 定位登录按钮点击 我们在定位元素的时候 如果属性出现空格的状态 形如:btn btn-account
# 解决方式 第一种我们选择属性当中的一部分(需要测试)
driver.find_element(By.CLASS_NAME,'btn-account').click()
time.sleep(2)
​

  • 38
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F——

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值