网络爬虫(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 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()方法配合使用

  • 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 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

  • 引擎负责控制数据流在系统中所有组件中流动,并在相应动作发生时触发事件。 详细内容查看下面的数据流(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的Model

pipelines     数据持久化处理

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.mfbz.cn/a/191988.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AIGC|LangChain新手入门指南,5分钟速读版!

如果你用大语言模型来构建AI应用,那你一定不可能绕过LangChain,LangChain是现在最热门的AI应用框架之一,去年年底才刚刚发布,它在github上已经有了4.6万颗星的点赞了,在github社区上,每天都有众多大佬,用它…

数据结构 | 堆排序

数据结构 | 堆排序 文章目录 数据结构 | 堆排序建立大堆排序结果以及全部代码 如果没有看过堆的实现的话可以先看前面的一章堆的实现,然后再来看这个堆排序,都是比较简单的~~ 这里堆排序首先建堆,建堆是要建小堆还是大堆呢? 在堆排…

HT97226 免输出电容立体声耳机放大器的应用与曲线

HT97226应用: ・耳机 ・多媒体音频接口 ・机顶盒 ・ 蓝光/DVD播放器 ・LCD电视 ・音频消费电子产品 HT97226应用图于曲线: HT97226是一款差分输入/单端输入、可直接输出驱动的耳机放大器。5V供…

在vue页面中添加组件到底有多方便

修改vue写的前端页面到底有多方便?如果熟练的话,出乎你想象的快。 原来的页面:/admin/stock 原来的文件地址:src\views\admin\stock\Stock.vue 另一个页面有个入库功能,需要转移到上面的页面中: 路径&…

MindStudio学习记录三:推理应用开发 acl mindx sdk

1.推理应用流程 1.1.创建工程 1.2.模型转换 1.3代码开发 1.3.1ACL代码 1.3.2MindX SDK开发 可视化模块化设计 中间的图片与处理 是基于AIPP的可视化处理 1.5.编译 交叉编译 1.6.运行与调试 1.7 调优工具 profiling性能分析 2.开发举例 resnet-50 2.1 准备工程 2.2.准备模型…

C#-基础及扩展合集(持续更新)

一、基础 Ⅰ 关键字 1、record record(记录),编译器会在后台创建一个类。支持类似于结构的值定义,但被实现为一个类,方便创建不可变类型,成员在初始化后不能再被改变 (C#9新增) …

MT6893_天玑 1200芯片规格参数介绍_datasheet规格书

天玑 1200(MT6893)是一款专为旗舰级全新5G芯片,它融合了先进的AI、相机和多媒体技术,为用户带来令人惊叹的体验。采用先进的6纳米制程设计,内置各种先进技术。该芯片采用旗舰级的八核CPU架构设计,支持16GB强大的四通道内存以及双通…

西门子PLC与组态王无线通讯中如何设置从站

本方案主要详述了在多台西门子300PLC与组态王之间Modbus无线通讯中如何设置从站。方案中所用到的无线通讯终端是DTD434MC——欧美系PLC专用无线通讯终端。 一、方案概述 无线Modbus网络组成如下: 二、测试背景 ● PC端组态软件版本:组态王6.55 ● 默…

CRM的智能招投标对企业有什么意义?

如今CRM系统的生态系统越来越壮大,这些工具的集成极大地丰富了CRM系统的应用场景,例如CRM系统集成企业微信等社交媒体为获客提供便利;再比如CRM集成ChatGPT提高邮件内容质量,对于经常接触招投标项目的业务人员来说,在C…

在NAS上部署.NET版本的WOL远程开机服务

在本文中,我们将以部署基于.NET的WOL远程开机服务为例,详细介绍如何利用Docker技术在群辉部署ASP.NET服务。同时,我们还将展示如何对原有的控制台WOL进行改造,以及如何使用SignAuthorization简易URL验签类库。文章相关的代码开源地…

在PostGIS中进行点数据的等值线提取

说明 介绍在PostGIS中从点数据提取等值线。 关键字: raster、point、PostGIS、等值线 环境准备 Postgresql版本:PostgreSQL 14.0, 64-bitPostGIS版本:POSTGIS"3.3.2"QGIS版本:3.28.3-Firenze(验证用&…

Windows系统下更新后自带的画图软件出现马赛克bug

一.bug的样子🍗 在使用橡皮后,原来写的内容会变成马赛克。而我们希望它是纯白色的。 二.解决方法🍗 第一步 第二步 第三步 三. 解决后的效果🍗 用橡皮擦随便擦都不会出现马赛克了。 更新过后,想用win自带的画图软件会出…

免杀原理(php)

免杀原理 0x01 前言 何为免杀,免杀就是一种逃脱杀毒软件查杀的方法,免杀的目的就是绕过“墙”,去执行危险的操作。那么如何绕过这堵“墙”,就是免杀的本质。有句俗话说得好“知己知彼,百战不殆”,想要用好…

VM安装Centos

文章目录 第2章 VM与Linux的安装2.1 VMWare安装2.2 CentOS安装 第3章 Linux文件与目录结构3.1 Linux文件3.2 Linux目录结构 第4章 VI/VIM编辑器4.1 是什么4.2 测试数据准备4.3 一般模式4.4 编辑模式4.5 命令模式4.6 模式间转换 第5章 网络配置和系统管理操作5.1 查看网络IP和网…

sam和mobilesam的c++ dll打包

一、前言 前面我们已经成功导出分割模型和预处理模型了: 因此接下来就是要c推理的测试了 二、c推理

OpenCV入门11——图像的分割与修复

文章目录 图像分割的基本概念实战-分水岭法(一)实战-分水岭法(二)GrabCut基本原理实战-GrabCut主体程序的实现实战-GrabCut鼠标事件的处理实战-调用GrabCut实现图像分割meanshift图像分割视频前后景分离其它对视频前后影分离的方法图像修复 图像分割是计算机视觉中的一个重要领…

基于springboot实现智慧党建系统项目【项目源码】

基于springboot实现智慧党建系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点,而且Java是开源的,拥有全世界最大的开发者专业社群,所以…

cpp中虚实继承问题

1.一个基类base,被类a虚继承,类a被其他的类继续继承,那么base中的初始化必须由派生类的最后一个完成,其中任意一个都不能代替完成基类,如果在最后一个派生类里不进行这个base的初始化,那么就会调用相应的无…

全面探讨HTTP协议从0.9到3.0版本的发展和特点

前言: 最近的几场面试都问到了http的相关知识点,博主在此结合书籍和网上资料做下总结。本篇文章讲收录到秋招专题,该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮…

NetSuite 应用性能管理器(APM)

前段时间,我们发过一个文章谈系统健康检查。 NetSuite ERP系统健康检查-CSDN博客文章浏览阅读119次。“健康检查”本质上是属于信息化持续改善的组成部分。如果说信息化是一个持续不断的过程的话,那么“健康检查”就是持续不断的PDCA中的Check那一环。h…
最新文章