网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

  • Selenium
    • WebDriver 对象提供的相关方法
    • 定位元素
    • ActionChains的基本使用
    • selenium显示等待和隐式等待
      • 显示等待
      • 隐式等待
  • Scrapy(异步网络爬虫框架)
    • Scrapy框架
  • 反爬虫
    • 限制手段
    • 反爬虫的分类
    • 爬虫与反爬虫-功与防
    • 基于身份识别反爬和结局思路
      • Headers反爬-通过User-agent字段
      • Headers反爬-通过cookie字段
      • Headers反爬-通过Referer字段
      • 基于请求参数反爬
      • 验证码反爬
    • 基于爬虫行为反爬和解决思路
      • 通过请求ip/账号单位时间内请求频率、次数反爬
      • 通过同一ip/账号请求间隔进行反爬
      • 通过js实现跳转反爬
      • 通过蜜罐(陷阱)捕获ip
      • 通过假数据进行反爬
      • 阻塞任务队列
      • 阻塞网络IO
    • 基于数据加密反爬和解决思路
      • 通过自定义字体反爬
      • 通过js动态生成数据进行反爬
      • 通过数据图片化进行反爬
      • 通过编码格式进行反爬

Selenium

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

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

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

WebDriver 对象提供的相关方法

  • close() 方法用于关闭单个窗口
  • quit() 方法用于关闭所有窗口
  • page_source 属性用于获取网页的源代码
  • get(url) 方法用于访问指定的 URL
  • title 属性用于获取当前页面的标题
  • current_url 用于获取当前页面的 URL
  • set_window_size(idth,height) 方法用于设置浏览器的尺寸
  • back() 方法用于控制浏览器后退
  • forward() 方法用于控制浏览器前进
  • refresh() 方法用于刷新当前页面

定位元素

在这里插入图片描述

find_elements_by_css_selector("#kw") # 根据选择器进行定位查找,其中#kw表示的是id选择器名称是kw的可以通过 WebElement 对象的相text 属性用于获取元素的文本内容
import timefrom 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']"):#获取当前节点的textprint(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 timetest_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()方法配合使用

  • until(method, message=’ '):调用该方法提供的驱动程序作为一个参数,直到返回值为True

  • until_not(method, message=’ '):调用该方法提供的驱动程序作为一个参数,直到返回值为False

隐式等待

在创建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 timetest_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

  • 引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(Data Flow)部分。
  • 此组件相当于爬虫的“大脑”,是整个爬虫的调度中心。

调度器(Scheduler)

  • 调度器从引擎接受request并将他们入队,以便之后引擎请求他们时提供给引擎。
  • 初始的爬取URL和后续在页面中获取的待爬取的URL将放入调度器中,等待爬取。同时调度器会自动去除重复的URL(如果特定的URL不需要去重也可以通过设置实现,如post请求的URL)

下载器(Downloader)

  • 下载器负责获取页面数据并提供给引擎,而后提供给spider。

Spiders

  • Spider是Scrapy用户编写用于分析response并提取item(即获取到的item)或额外跟进的URL的类。
    每个spider负责处理一个特定(或一些)网站。

Item Pipeline

  • Item Pipeline负责处理被spider提取出来的item。典型的处理有清理、 验证及持久化(例如存取到数据库中)。

  • 当页面被爬虫解析所需的数据存入Item后,将被发送到项目管道(Pipeline),并经过几个特定的次序处理数据,最后存入本地文件或存入数据库。

下载器中间件(Downloader middlewares)

  • 下载器中间件是在引擎及下载器之间的特定钩子(specific hook),处理Downloader传递给引擎的response。

  • 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

  • 通过设置下载器中间件可以实现爬虫自动更换user-agent、IP等功能。

Spider中间件(Spider middlewares)

  • Spider中间件是在引擎及Spider之间的特定钩子(specific
    hook),处理spider的输入(response)和输出(items及requests)。

  • 其提供了一个简便的机制,通过插入自定义代码来扩展Scrapy功能。

常见的创建scrapy语句:

scrapy startproject 项目名scrapy genspider 爬虫名 域名scrapy crawl 爬虫名
scrapy.cfg    项目的主配置信息。(真正爬虫相关的配置信息在settings.py文件中)items.py      设置数据存储模板,用于结构化数据,如:Django的Modelpipelines     数据持久化处理settings.py   配置文件spiders       爬虫目录

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

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

反爬虫

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

限制手段

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

反爬虫的分类

身份识别反爬虫

  • 验证请求头信息、验证请求参数、使用验证码等

爬虫行为反爬虫

  • 对ip进行限制、使用蜜罐获取ip、假数据等

数据加密反爬虫

  • 自定义字体、数据图片、编码格式等

爬虫与反爬虫-功与防

在这里插入图片描述

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

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生成数据的流程,模拟生成数据

通过数据图片化进行反爬

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

通过编码格式进行反爬

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/172633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【docker系列】docker高阶篇

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

C语言:写一个函数,求字符串的长度,在main函数中输入字符串并输出其长度(指针)

分析: 在程序中,定义一个函数 fix,该函数使用指针变量来访问字符串中的每个字符,并计算出字符串的长度。fix 函数的参数为指向 char 类型的指针变量 p,表示需要计算长度的字符串。 在主函数 main 中,定义一…

【Dockerfile】将自己的项目构建成镜像部署运行

目录 1.Dockerfile 2.镜像结构 3.Dockerfile语法 4.构建Java项目 5.基于Java8构建项目 1.Dockerfile 常见的镜像在DockerHub就能找到,但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像,就必须先了解镜像的结构才行。 2.镜像结构 镜…

5G NSA注册解析及图标显示方案

5G NSA注册解析及图标显示方案 1. NSA注册流程解析1.1 NSA注册流程1.2 NAS消息信元变化1.3 UE能力信元变化1.3.1 第一次UE能力查询1.3.2 后续UE能力查询1.3.3 UE能力过滤器解析 1.4 UE测量配置1.5 SCG添加消息解析1.6 SCG添加成功1.7 Split Bearer承载的建立1.8 NR协议查询索引…

华为OD机试 - 围棋的气(Java JS Python C)

题目描述 围棋棋盘由纵横各19条线垂直相交组成,棋盘上一共19 x 19 = 361 个交点,对弈双方一方执白棋,一方执黑棋,落子时只能将棋子置于交点上。 “气”是围棋中很重要的一个概念,某个棋子有几口气,是指其上下左右方向四个相邻的交叉点中,有几个交叉点没有棋子,由此可…

解决OSError: [Errno 28] No space left on device报错和搭建AIrtest无线配置手机集群

OSError: [Errno 28] No space left on device和搭建AIrtest无线配置手机集群 做手机无限集群控制时,常常遇到这种错误问题。表示您的设备上没有足够的可用磁盘空间来完成某个操作。我们遇到了还得重新开端口和输入ip,如果有几百台手机是不是中午就不吃…

【古诗生成AI实战】之五——加载模型进行古诗生成

回顾上一篇博客,我们已经成功地训练了我们的模型,并将其保存下来。这是一个重要的里程碑,因为训练好的模型是我们进行文本生成的基础。 现在,接下来的步骤是加载这个训练好的模型,然后使用它来生成古诗。 本章的内容属…

2023年网络安全比赛--综合渗透测试②(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将扫描开放的所有端口当作flag提交(例:21,22,23); 2.通过 PC 中的渗透测试平台 Kali 对服务器场景进行渗透测试,将初…

人工智能-优化算法和深度学习

优化和深度学习 对于深度学习问题,我们通常会先定义损失函数。一旦我们有了损失函数,我们就可以使用优化算法来尝试最小化损失。在优化中,损失函数通常被称为优化问题的目标函数。按照传统惯例,大多数优化算法都关注的是最小化。…

计算机图形学-变换基础

坐标系转换历程模型坐标系 -> 世界坐标系 -> 摄像机坐标系 -> 视口(屏幕)坐标系 变换 仿射变换和线性变换线性:旋转 缩放 镜像 切变放射: 平移 平移 2D变换矩阵 3D变换矩阵 旋转 2D旋转矩阵 //2D 旋转private (float,…

【docker系列】docker命令篇

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中科亿海微除法器(DIVIDE)

技术背景 技术概述 FPGA实现除法运算是一个比较复杂的过程,因为硬件逻辑与软件程序的区别。如果其中一个操作数为常数,可以通过简单的移位与求和操作代替,但用硬件逻辑完成两变量间除法运算会占用较多的资源,电路结构复杂&#xf…

【虚拟机Ubuntu 18.04配置网络】

虚拟机Ubuntu 18.04配置网络 1.配置网络连接方式,查看自己网关 2.修改主机名 3.修改系统配置1.配置网络连接方式,查看自己网关 选择虚拟机镜像设置网络连接模式,可以选择桥接或者NAT连接(我这里选择是NAT连接) 确定自己网关,可以在虚拟机 -》 编辑 -》虚拟网络编…

Android 10.0 mtp模式下连接pc后显示的文件夹禁止删除copy重命名功能实现

1.前言 在10.0的系统开发中,usb连接pc端的时候有好几种模式,在做otg连接pc端的时候,改成mtp模式的时候,在pc端可以看到产品设备 的显示的文件夹的内容,对于产品设备里面的文件在pc端禁止做删除重命名拷贝等操作功能的实现 2.mtp模式下连接pc后显示的文件夹禁止删除copy重命…

【计算机视觉】【图像处理综合应用】路沿检测

实验内容:针对给定的视频,利用图像处理基本方法实现道路路沿的检测; 提示:可利用Hough变换进行线检测,融合路沿的结构信息实现路沿边界定位(图中红色的点位置)。 处理视频文件 处理视频文件的主…

springboot函数式web

1.通常是路由(请求路径)业务 2.函数式web:路由和业务分离 一个configure类 配置bean 路由等 实现业务逻辑 这样实现了业务和路由的分离

Spring MVC程序开发

所谓的Spring MVC程序开发,其实也是一个Spring Boot项目。 MVC是Model View Controller的缩写,它是软件工程中的一种软件架构模式,它把软件系统分为模型,视图,控制器三个部分。 项目使用什么技术实现的?&a…

【nowcoder】BM3 链表中的节点每k个一组翻转

题目: 题目分析: 题目解析转载: 代码实现: package BMP3;import java.util.List;class ListNode {int val;ListNode next null;public ListNode(int val) {this.val val;} } public class BM3 {/*** 代码中的类名、方法名、参…

一般将来时

一般将来时 概念 表示将要发生的动作或打算、计划准备做某事 时间 tomorrow 明天 the day after tomorrow 后天 next week 下周 next weekend 下周末 next month 下个月 next year 明年 ...句子结构 主语 be(am/is/are)going to do … 计划,…

B树你需要了解一下

介绍B树的度数主要特点应用场景时间复杂度代码示例拓展 介绍 B树(B-tree)是一种自平衡的树,能够保持数据有序,常被用于数据库和文件系统的实现。 B树可以看作是一般化的二叉查找树,它允许拥有多于2个子节点。与自平衡…