Selenium

Selenium是一个模拟浏览器浏览网页工具,主要用于测试网站自动化测试工具

Selenium需要安装浏览器驱动,才能调用浏览器进行自动爬取自动化测试,常见的包括Chrome、Firefox、IE、PhantomJS等浏览器

注意:驱动下载解压后,置于Python的安装目录下;然后将Python的安装目录添加系统环境变量路径(Path)中。

WebDriver 对象提供的相关方法

定位元素

在这里插入图片描述

find_elements_by_css_selector("#kw") # 根据选择器进行定位查找,其中#kw表示的是id选择器名称是kw的

可以通过 WebElement 对象的相text 属性用于获取元素文本内容
import time

from selenium import webdriver


#启动浏览器,启动的是chrome浏览器,注意C是大写
# test_webdriver = webdriver.Chrome()
#调用phantomjs浏览器
# test_webdriver = webdriver.PhantomJS()
#使用火狐浏览器
test_webdriver = webdriver.Firefox()
#通过get请求方式请求https://www.echartsjs.com/examples/
test_webdriver.get("https://www.echartsjs.com/examples/")
#浏览器最大窗口
test_webdriver.maximize_window()
#通过一个for循环遍历这些数据
#find_elements_by_xpath,注意,双数,方法里面传递的是xpath语句
for item in test_webdriver.find_elements_by_xpath("//h4[@class='chart-title']"):
    #获取当前节点text
    print(item.text)
#获取当前浏览器的标题
print(test_webdriver.title)
time.sleep(5)
#浏览器退出
test_webdriver.quit()

ActionChains基本使用

selenium.webdriver.common.action_chains.ActionChains(driver)
click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素
from selenium import webdriver
import time

test_webdriver = webdriver.Chrome()
test_webdriver.maximize_window()
test_webdriver.get("https://www.baidu.com")
#找到百度首页上的搜索框,发送python
test_webdriver.find_element_by_xpath("//input[@id='kw']").send_keys("python")
#找到百度一下这个按钮点击一下
test_webdriver.find_element_by_xpath("//input[@id='su']").click()
time.sleep(5)
print(test_webdriver.title)
#获取当前页面源代码
print(test_webdriver.page_source)
#获取当前的cookie
print(test_webdriver.get_cookies())
test_webdriver.quit()

selenium显示等待和隐式等待

显示等待

明确要等到某个元素的出现或者是某个元素的可点击条件,等不到,就一直等,除非在规定的时间之内都没找到,就会跳出异常Exception。

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

WebDriverWait()一般由until()或 until_not()方法配合使用

隐式等待

创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置

注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内部断的刷新页面去寻找我们需要的元素

driver.implicitly_wait() 默认设置为0

#显示等待
# from selenium import webdriver
# #简写用包
# from selenium.webdriver.common.by import By
# #等待用包
# from selenium.webdriver.support.ui import WebDriverWait
# #场景判断用来判断某个元素是否出现
# from selenium.webdriver.support import expected_conditions as EC
# import time
#
#
# test_driver = webdriver.Chrome()
# test_driver.maximize_window()
# test_driver.get("https://www.baidu.com")
# #WebDriverWait设置显示等待
# #1、test_driver,2、timeout,3、轮训参数
# #until,EC场景判断,通过id来找相关元素kw
# element = WebDriverWait(test_driver,5,0.5).until(EC.presence_of_element_located((By.ID,'dazhuang')))
# element.send_keys('python')
# time.sleep(2)
# test_driver.quit()


#隐式等待
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
import time


test_driver = webdriver.Chrome()
test_driver.implicitly_wait(5)
test_driver.get("https://www.baidu.com")
try:
    test_driver.find_element_by_id('dazhuang').send_keys('python')
    time.sleep(2)
except NoSuchElementException as e:
    print('这里报错了')
    print(e)

test_driver.quit()

Chrome无界面浏览器
之前所应用的 Selenium,都是直接操作界面的浏览器,这就势必会影响取数据的速度,而为了尽可能地提高取数据的速度,则可以使用 Chrome 无界面浏览器进行数据的爬取,其步骤如下

  1. 首先,通过 selenium.webdriver.chrome.options 中的 Options 类创建 Options
    对象,用于操作 Chrome 无界面浏览器。
  2. 其次,使用 Options 对象add_argument() 方法启动参数配置,并将该方法中的参数 argument 的值设置为“—headless”,表示使用界面浏览器。
  3. 最后,在使用 Chrome 类创建 WebDriver 对象设置参数 options,并且该参数对应的值需为之前所创建
    Options 对象。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time



# 实例化参数的方法
chrome_options = Options()
# 设置浏览器的无头浏览器,无界面,浏览器将不提供界面linux操作系统界面情况下就可以运行
chrome_options.add_argument("--headless")
# 结果devtoolsactiveport文件存在报错
chrome_options.add_argument("--no-sandbox")
# 官方推荐关闭选项,规避一些BUG
chrome_options.add_argument("--disable-gpu")
# 实例化了一个chrome,导入设置
test_webdriver = webdriver.Chrome(options=chrome_options)
# 最大
test_webdriver.maximize_window()
# 打开百度
test_webdriver.get("https://www.baidu.com")
# 再输入框里面输入python
test_webdriver.find_element_by_xpath("//input[@id='kw']").send_keys("python")
# 执行了点击操作
test_webdriver.find_element_by_xpath("//input[@id='su']").click()
time.sleep(2)
# 打印web界面的title
print(test_webdriver.title)
# 浏览器退出
test_webdriver.quit()

Scrapy异步网络爬虫框架)

Scrapy框架

在这里插入图片描述
组件的作用
Scrapy Engine

调度器(Scheduler)

下载器(Downloader)

Spiders

Item Pipeline

下载器中间件(Downloader middlewares)

Spider中间件(Spider middlewares)

常见创建scrapy语句:

scrapy startproject 项目scrapy genspider 爬虫名 域名
 
scrapy crawl 爬虫名
scrapy.cfg    项目的主配置信息。(真正爬虫相关的配置信息settings.py文件中)

items.py      设置数据存储模板,用于结构化数据,如:Django的Model

pipelines     数据持久化处理

settings.py   配置文件

spiders       爬虫目录

参考https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html

参考https://www.osgeo.cn/scrapy/topics/architecture.html

反爬

限制爬虫程序访问服务器资源获取数据行为

限制手段

请求限制拒绝响应客户端身份验证文本混淆和使用动态渲染技术

反爬虫的分类

身份识别反爬

爬虫行为反爬

数据加密反爬

爬虫与反爬虫-功与防

在这里插入图片描述

基于身份识别反爬和结局思路

Headers反爬-通过User-agent字段

携带正确的User-agent和使用随机User-agent

Headers反爬-通过cookie字段

注册多个账号请求登录后数据或破解JS生成cookie逻辑

Headers反爬-通过Referer字段

伪造Referer字段

基于请求参数反爬

仔细分析抓到的包,搞清楚请求之间的联系

验证码反爬

Pytesseract/商业打码平台

验证码(CAPTCHA)是“Completely Automated Public Turing testto tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序

基于爬虫行为反爬和解决思路

通过请求ip/账号单位时间内请求频率次数反爬

使用ip代理多个账号反反爬

通过同一ip/账号请求间隔进行反爬

使用ip代理,设置随机休眠进行反反爬

通过js实现跳转反爬

多次抓包分析规律

通过蜜罐(陷阱)捕获ip

完成爬虫之后,测试爬取/仔细分析相应内容,找出陷阱

通过假数据进行反爬

长期运行,对比数据库中数据同实际页面数据

阻塞任务队列

分析获取垃圾url的规律,对URL进行过滤

阻塞网络IO

审查抓取连接,对请求时间计时

基于数据加密反爬和解决思路

通过自定义字体反爬

切换手机版/解析定义字体

通过js动态生成数据进行反爬

分析js生成数据的流程模拟生成数据

通过数据图片化进行反爬

通过使用图片引擎,解析图片数据

通过编码格式进行反爬

测试不同格式解码,获取正确解码格式

原文地址:https://blog.csdn.net/qq_45832050/article/details/134620957

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_24724.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注