课程笔记 | 逆向工程师 -> 爬虫 -> 02.自动化爬虫

admin 2025年6月13日17:01:42课程笔记 | 逆向工程师 -> 爬虫 -> 02.自动化爬虫已关闭评论23 views字数 20116阅读67分3秒阅读模式
自动化爬虫介绍
  • 什么是自动化爬虫  1. 爬虫主要可以分为协议爬虫和自动化爬虫  2. 协议爬虫:模拟发送数据包,可脱离原先客户端操作,速度快,消耗资源少,但是难度高  3. 自动化爬虫:模拟人工输入点击等操作,需要在原先客户端上操作,速度慢,消耗资源大,但是难度低
  • 常见的自动化框架  影刀  DrissionPage  playwright  selenuim  ...  
影刀
  • 影刀RPA的安装下载地址:https://www.yingdao.com/
  • 影刀常用指令
  打开网页、关闭网页、     填写输入框、点击元素、批量数据抓取、循环、     写入文件、插入Python代码段、调用模块、    获取元素属性、Http下载、打印日志、等待
  • 案例影刀爬取某度  影刀爬取图片  影刀爬取图片(翻页)  

HTML1. HTML标签是一系列由尖括号包围的关键字,最终由浏览器来渲染,浏览器不同显示的效果可能会不同2. HTML标签通常是成对出现的(双标签),也有少数单独存在的(单标签)  

<head>...</head><br />

3. 标签之间的关系包含关系、并列关系4. HTML页面的基本结构

<!DOCTYPE html><htmllang="en"><head>      <!-- meta指定网页编码,告诉浏览器该用何种编码解析网页 -->    <!-- 真正决定网页编码是在保存文件时,一般用UTF-8编码 -->    <metacharset="UTF-8">        <title>Title</title></head><body></body></html>

5. HTML标签不区分大小写6. 常用HTML标签

注释      <!-- ...... -->换行      <br />  超链接    <a> ... </a>图片      <img />......布局      <div><span>JS脚本    <script>

7. 不同的标签具有不同的属性    img: srcheightwidth      a: hreftarget(_self_blank)  

8. HTML实体    HTML中会把多余的空格和换行,识别成一个空格。因此HTML中有些东西需要用别的方式去表示。

&nbsp; 空格&ensp; 半角的空格&emsp; 全角的空格

9.文档    w3c: https://www.w3school.com.cn/      mdn

ai编程

  • TraeMarsCode)的配置下载安装vscode  插件市场安装Trae,登录使用即可  参考:https://www.trae.com.cn/plugin

  • 案例演示deepseek自动写爬虫(某小说网站)  处理字体反爬  deepseek爬取某瓣  实现书名等内容爬取  实现翻页爬取  实现多页、内容详情的爬取  

DrissionPage的检测
DrissionPage检测的绕过
DrissionPage文档https://www.drissionpage.cn/browser_control/connect_browser/
连接浏览器
  连接浏览器其实就是创建Chromium对象。    根据不同的配置,可以启动浏览器,也可以接管已打开的浏览器。 
启动浏览器
  • 直接创建
from DrissionPage import Chromiumbrowser = Chromium()
  创建Chromium对象时会在指定端口启动浏览器,或接管该端口已有浏览器。
  程序默认使用 9222 端口,浏览器可执行文件路径为 chrome
  如路径中没找到浏览器可执行文件,Windows 系统下,程序会在注册表中查找路径。
  • 指定端口或地址
# 接管9333端口的浏览器,如该端口空闲,启动一个浏览器browser = Chromium(9333)browser = Chromium('127.0.0.1:9333')
  • 通过配置信息创ChromiumOptions用于管理创建浏览器时的配置,内置了常用的配置。详细使用方法后续介绍。
# 导入 ChromiumOptionsfrom DrissionPage import Chromium, ChromiumOptions# 创建浏览器配置对象,指定浏览器路径co = ChromiumOptions().auto_port()# 用该配置创建浏览器对象browser = Chromium(addr_or_opts=co)
  配置对象只有在启动浏览器时生效,浏览器创建后再修改这个配置是没有效果的,接管已打开的浏览器配置也不会生效。
接管已打开的浏览器
    Chromium对象创建时,只要指定的地址(ip:port)已有浏览器在运行,就会直接接管。用程序启动的浏览器  默认情况下,创建Chromium对象时会自动启动一个浏览器。只要这个浏览器不关闭,下次运行程序时会接管同一个浏览器继续操作(配置的 ip:port 信息不变)。这种方式极大地方便了程序的调试,使程序不必每次重新开始,可以单独调试某个功能。
from DrissionPage import Chromium# 在9333端口启动浏览器同时创建对象,如果浏览器已经存在,则接管它browser = Chromium(9333)  
Chromium对象介绍
  • Chromium象用于连接和管理浏览器(整体运行参数配置、浏览器信息获取、标签页的开关和获取等)。  
  • 根据不同的配置,可以启动新的浏览器,也可以接管已打开的浏览器。  
  • 每个浏览器只能有一个Chromium对象(同一进程中),对同一个浏览器重复使用Chromium()获取的都是同一个对象。  
  • 程序结束时,被打开的浏览器不会主动关闭(VSCode 启动的除外),以便下次运行程序时使用。 新手在使用无头模式时需特别注意。  
启动或接管多个已打开的浏览器
  如果想要同时操作多个浏览器,就需要给这些被程序控制的浏览器设置单独的"端口""用户文件夹",否则会造成冲突。
  • 指定单独的端口和用户文件夹
  每个要启动的浏览器使用单独的ChromiumOptions对象进行设置。
from DrissionPage import Chromium, ChromiumOptions# 创建多个配置对象,每个指定不同的端口号和用户文件夹路径co1 = ChromiumOptions().set_paths(local_port=9111, user_data_path=r'D:\data1')co2 = ChromiumOptions().set_paths(local_port=9222, user_data_path=r'D:\data2')# 创建多个页面对象tab1 = Chromium(addr_or_opts=co1).latest_tabtab2 = Chromium(addr_or_opts=co2).latest_tab# 每个页面对象控制一个浏览器tab1.get('http://DrissionPage.cn')tab2.get('https://www.baidu.com')
  • 使用 auto_port() 方法
    ChromiumOptions对象的 auto_port() 方法,可以指定程序每次使用空闲的端口和临时用户文件夹创建浏览器。  使用 auto_port() 的配置对象可由多个Chromium对象共用,不会出现冲突,但也无法多次启动程序时重复接管同一个浏览器。
from DrissionPage import Chromium, ChromiumOptionsco = ChromiumOptions().auto_port()# co = ChromiumOptions().auto_port(scope=(10000, 20000))tab1 = Chromium(addr_or_opts=co).latest_tabtab2 = Chromium(addr_or_opts=co).latest_tabtab2.get('http://DrissionPage.cn')tab1.get('https://www.baidu.com')
    auto_port()支持多线程。多进程使用时,有小概率出现端口冲突,可用scope参数指定每个进程使用的端口范围,以免发生冲突。
  • 创建全新的浏览器1. 默认情况下,程序会复用之前用过的浏览器用户数据,因此可能带有登录数据、历史记录等。  2. 如果要复用数据,就指定单独的端口和用户文件夹。运行数据不会自动清除,下次运行可复用。  3. 用户文件夹在哪?后续介绍!  4. 如果要全新的浏览器,就使用 auto_port() 方法即可。这种方式创建的浏览器是全新不带任何数据的,并且运行数据会自动清除。  5. auto_port() 会和 set_paths()set_local_port()set_address()set_user_data_path() 互相覆盖,不要同时使用。
浏览器启动设置  本库使用ChromiumOptions类管理启动配置。    该对象只能用于浏览器的启动,浏览器启动后,再修改该配置没有任何效果。    接管已打开的浏览器时,启动配置也是无效的。1. 创建配置对象
from DrissionPage import ChromiumOptionsco = ChromiumOptions()# 此处对co做一些设置# ...browser = Chromium(addr_or_opts=co)  # 以该配置创建页面对象
  默认情况下,ChromiumOptions对象会从 ini 文件中读取配置信息。      ini 文件默认的路径如下,每次升级本库,ini 文件都会被重置,可另存到其它路径以免重置。
# Python安装目录中的 ...\Lib\site-packages\DrissionPage\_configs\configs.ini  
2. 调整配置内容  创建配置对象后,可调整配置内容。    在Chromium对象创建时以参数形式把配置对象传递进去,Chromium对象会根据配置对象的内容对浏览器进行初始化。    配置对象支持链式操作。
from DrissionPage import Chromium, ChromiumOptionsco = ChromiumOptions()  # 创建配置对象(默认从 ini 文件中读取配置)co.set_browser_path("xxx")  # 设置浏览器可执行文件路径co.set_user_agent(user_agent='Mozilla/5.0')  # 设置 user_agentco.no_imgs(True).mute(True)  # 设置不加载图片、静音co.incognito()  # 无痕模式co.headless()  # 无头模式# 设置是否忽略证书错误。可以解决访问网页时出现的"您的连接不是私密连接"、"你的连接不是专用连接"等问题。co.ignore_certificate_errors()co.set_proxy('http://localhost:1080')# 设置几种超时时间,单位为秒# base 除以下两个参数的场景,都使用这个设置# page_load 页面加载超时时间# script JavaScript 运行超时时间co.set_timeouts(base=10)# 添加插件:把插件文件解压到一个独立文件夹,然后把插件路径指向这个文件夹,会比较稳定co.add_extension(r'D:\SwitchyOmega')browser = Chromium(addr_or_opts=co)  # 以该配置创建浏览器对象
    Chromium 内核浏览器有一系列的启动配置,以--开头,可在浏览器创建时传入,控制浏览器行为和初始状态。    启动参数非常多,详见:https://peter.sh/experiments/chromium-command-line-switches/
co.set_argument('--no-sandbox')  # 无沙盒模式co.set_argument('--start-maximized')  # 设置启动时最大化co.set_argument('--window-size''800,600')  # 设置初始窗口大小co.set_argument('--guest')  # 使用来宾模式打开浏览器
3. ChromiumOptions属性
from DrissionPage import ChromiumOptionsco = ChromiumOptions()# 该属性为要控制的浏览器地址,格式为 ip:port,默认为'127.0.0.1:9222'。print("address: ", co.address)  # 该属性返回浏览器可执行文件的路径。print("browser_path: ", co.browser_path)  # 该属性返回默认下载路径文件路径。print("download_path: ", co.download_path)  # 该属性返回用户数据文件夹路径。print("user_data_path: ", co.user_data_path)  # 该属性返回临时文件夹路径,可用于保存自动分配的用户文件夹路径。print("tmp_path: ", co.tmp_path)  # 该属性返回超时设置。包括三种:'base'、'page_load'、'script'。print("timeouts: ", co.timeouts)  # 该属性返回代理设置。print("proxy: ", co.proxy)  # 该属性以list形式返回浏览器启动参数。print("arguments: ", co.arguments)  # 该属性以list形式返回要加载的插件路径。print("extensions: ", co.extensions)  
用户文件夹位置  复用用户文件夹可使用已登录的状态、已安装的插件、已设置好的配置等。1. 默认配置 DrissionPage 创建的浏览器,用户文件夹在系统临时文件夹的 DrissionPage\userData 文件夹内,以端口命名。  比如 C:\Windows\Temp\DrissionPage\userData\9222   这个用户文件夹不会主动清除,下次再使用 9222 端口时,会继续使用。 2. auto_port()如果使用 auto_port(),会存放在系统临时文件夹的 DrissionPage\autoPortData 文件夹内,以端口命名。  比如 C:\Windows\Temp\DrissionPage\autoPortData\21489   这个用户文件夹是临时的,用完会被主动清除。  3. 使用系统安装的浏览器默认用户文件夹
  在浏览器输入 chrome://version/,可查阅其中的可执行文件路径、个人资料路径或者用户配置路径。
from DrissionPage import ChromiumOptions# 是否使用系统安装的浏览器默认用户文件夹,默认为是co = ChromiumOptions().use_system_user_path()  browser = Chromium(addr_or_opts=co)  # 以该配置创建浏览器对象
4. 自定义位置  如果要指定用户文件夹存放位置,可用 ChromiumOptions 对象的 set_user_data_path() 方法。使用这种方法时,需关闭已启动的系统浏览器,否则会连接失败。
from DrissionPage import Chromium, ChromiumOptionsco = ChromiumOptions().set_user_data_path(r'D:\tmp')browser = Chromium(co)
标签页管理  浏览器的标签页由 Tab 对象(ChromiumTabMixTab)控制。    与网页的交互都由标签页对象进行。    默认情况下,一个标签页由一个 Tab 对象控制。    多个标签页可以同时操作,不需要切换焦点,也不需要激活到前台。  1. 获取最后激活的标签页Chromium对象的latest_tab属性返回最后激活的标签页对象。
from DrissionPage import Chromiumbrowser = Chromium()tab = browser.latest_tab  # 获取最新标签页对象
2. 获取指定标签页Chromium对象的get_tab()get_tabs()方法用于获取指定的标签页对象。  可指定标签页序号、id、标题、url、类型等条件用于检索。
from DrissionPage import Chromiumbrowser = Chromium()browser.new_tab("https://www.baidu.com/")print("tabs: ", browser.get_tabs())# 当 id_or_num 不为 None 时,其它参数无效# 获取列表中第一个标签页的对象,序号从 1 开始,可传入负数获取倒数第几个# 不是视觉排列顺序,而是激活顺序tab1 = browser.get_tab(id_or_num=1)# 获取第一个 url 中带 'baidu' 的标签页对象# title、url 和 tab_type 三个参数是与关系tab2 = browser.get_tab(url='baidu')  # 获取第一个 title 中带 '百度' 的标签页对象tab3= browser.get_tab(title='百度')  print("tab1: ", tab1)print("tab2: ", tab2)print("tab3: ", tab3)# 获取指定 id 的标签页对象# tab = browser.get_tab(id_or_num='E00E044DDB630AEECC92B31E17BFBB3C')  # print("tab: ", tab)# 获取所有url中带 'baidu' 的标签页对象,返回列表;用法与 get_tab() 相同tabs = browser.get_tabs(url='baidu')  print("tabs: ", tabs)

3. 新建标签页并获取对象Chromium 对象的 new_tab() 方法用于新建一个标签页,返回其对象。

from DrissionPage import Chromiumbrowser = Chromium()browser.new_tab(url='http://DrissionPage.cn')# browser.new_tab().get(url='http://DrissionPage.cn')
4. 获取点击后出现的标签页在预期点击元素会出现新标签页时,可用元素的 click.for_new_tab() 方法实行点击,点击后会返回新标签页对象。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.cememall.com/class/1_1/')ele = tab.ele('xpath://*[@id="newscontent"]/div/ul/li/span[2]/a')if ele:      print(ele.text)      tab2 = ele.click.for_new_tab()  # 点击并获取新tab对象      tab2.set.activate()      tab2.wait(3)      tab2.close()else:      print('xiaojianbang')
5. 标签页的单例模式说明默认设置下,一个标签页只有一个 Tab 对象。  对同一个标签页反复使用 get_tab() 获取到的是同一个对象。  当关闭单例模式时,一个标签页也可以被多个 Tab 对象同时控制,每个负责不同的工作。比如一个执行主逻辑流程,另外的监视页面,处理各种弹窗。
from DrissionPage import Chromiumfrom DrissionPage.common import Settingsbrowser = Chromium()browser.new_tab()browser.new_tab()# 未启用多例:tab1 = browser.get_tab(1)tab2 = browser.get_tab(1)print(id(tab1), id(tab2))# 启用多例:Settings.set_singleton_tab_obj(False)tab1 = browser.get_tab(1)tab2 = browser.get_tab(1)print(id(tab1), id(tab2))# 2347582903056 2347582903056# 2347588741840 2347588877712
6. 其他操作
# 标签页显示到前端# 可传入 Tab 对象、标签页 id、标签页序号# 注意标签页序号不是视觉顺序,而是激活顺序broswer.activate_tab(...)broswer.set.auto_handle_alert()  # 此方法用于设置是否启用自动处理 alert 弹窗broswer.close_tabs()  # 关闭标签页。可指定多个,可关闭指定标签页以外的broswer.quit()  # 关闭浏览器tab.set.activate()  # 标签页显示到前端tab.close()  # 关闭标签页
7. cookie的读写
from DrissionPage import Chromiumbroswer = Chromium()tab = broswer.latest_tab# 此方法以列表形式返回浏览器所有域名的 cookies,cookie 是 dict 格式。print("cookies:", broswer.cookies()) broswer.set.cookies.clear()  # 此方法用于清除浏览器所有 cookies。print("cookies:", broswer.cookies())broswer.set.cookies(...)print("cookies:", broswer.cookies())
页面交互get()方法用于跳转到一个网址。当连接失败时,程序会进行重试。可指定本地文件路径。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('http://DrissionPage.cn')
set.blocked_urls()
此方法用于设置忽略的连接。可用 * 通配符
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.set.blocked_urls('*.png')  # 设置不加载 png 图片tab.get('http://DrissionPage.cn')
add_ele()此方法用于创建一个元素,可以选择是否插入到 DOM  
1. 创建元素并插入到 DOM
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get("https://www.baidu.com")html = '<a href="http://DrissionPage.cn" target="_blank">DrissionPage</a>'ele = tab.add_ele(html_or_info=html, insert_to="#s-top-left", before="新闻")ele.click()
html_or_info 参数可以传入元素完整 html 文本,也可以传入元素信息(格式:(tag, {name: value}))  会根据 insert_to  before 参数来确定插入的位置。  insert_to 参数用来指定父元素容器,before 参数用来指定插入到哪个子元素之前。这俩参数均可以接收元素对象或定位符。   insert_to 参数为None,则插入到body元素;如 before 参数为None,则插入到父元素末尾。  2. 创建元素不插入到 DOM
from DrissionPage import Chromiumtab = Chromium().latest_tabinfo = ('a', {'innerText''DrissionPage''href''http://DrissionPage.cn''target''blank'})ele = tab.add_ele(info)ele.click('js')  # 需用 js 点击
html_or_info 传入元素信息(格式:(tag, {name: value})),且 insert_to 参数为None时,不插入到 DOM   此时返回的元素需用 js 方式点击。
remove_ele()此方法用于从页面上删除一个元素,可以是元素对象或定位符
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.drissionpage.cn/browser_control/page_operation')tab.remove_ele('xpath://*[@id="__docusaurus_skipToContent_fallback"]/div/div/main/div/div/div/div/article/div[2]/div[1]')
执行脚本通常使用 run_js()、 run_js_loaded()、 run_async_js()
# 传入js脚本文本或脚本文件路径tab.run_js("alert('Hello world!');")  # 用传入参数的方式执行js脚本显示弹出框显示 Hello world!tab.run_js('alert(arguments[0]+arguments[1]);''Hello'' world!')# 如果as_expr为True,脚本应是返回一个结果的形式,并且不能有return# 如果as_expr不为True,脚本应尽量写成一个方法tab.run_js("alert('Hello world!');", as_expr=True)# tab.run_js("function test(){alert('Hello world!');}")
set.headers()此方法用于设置额外添加到当前页面请求 headers 的参数。headers 可以是dict格式的,也可以是文本格式。
# dict格式h = {'connection''keep-alive''accept-charset''GB2312,utf-8;q=0.7,*;q=0.7'}tab.set.headers(headers=h)# 文本格式h = '''connection: keep-aliveaccept-charset: GB2312,utf-8;q=0.7,*;q=0.7'''tab.set.headers(headers=h)
其他
# Tab 对象下的方法一般是针对当前页面的# Chromium 对象下的方法一般是全局的tab.set.user_agent(...)tab.set.auto_handle_alert()  # 自动处理弹窗tab.close()  # 用于关闭标签页tab.close(others=True)  # 关闭自己以外的标签页tab.cookies()  # 获取 cookietab.set.cookies(...)  # 设置 cookie, 可设置一个或多个tab.set.cookies.clear()  # 清除所有 cookie# 删除指定 cookie,这个方法在浏览器对象下面没有tab.set.cookies.remove('xxx')  # 设置某项 sessionStorage 信息tab.set.session_storage(item='abc', value='123' # 删除某项 sessionStorage 信息tab.set.session_storage(item='abc', value=False)  tab.set.local_storage(...)  # 用法与 session_storage 一样# 用于清除 sessionstorage、localStorage、cache、cookies# 可选择要清除的项tab.clear_cache(cookies=False)  # 除了 cookies,其它都清除tab.back(2)  # 后退两个网页tab.forward(2)  # 前进两步tab.refresh()  # 刷新页面tab.stop_loading()  # 强制停止当前页面加载
获取页面信息
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')print('title: ', tab.title)print('url: ', tab.url)print('html: ', tab.html)print('user_agent: ', tab.user_agent)print('has_alert: ', tab.states.has_alert)print('session_storage: ', tab.session_storage())print('local_storage: ', tab.local_storage())
查找元素  所有的查找元素方法(eleeles等),都可以使用本库自创的查找语法、xpathcss selector selenium 的定位符元组。推荐使用 xpath,更通用。1. xpath  用 xpath 方式查找元素。只在语句最前面且单独使用时生效。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')# 查找id为"kw"的元素element1 = tab.ele('xpath://*[@id="kw"]')  # 查找id为"u1"的元素,在其内部找第2个a元素element3 = tab.ele('xpath://*[@id="u1"]/a[2]')  # 查找html元素里面的body元素里面的第1个div元素element4 = tab.ele('xpath:/html/body/div')  # 查找html元素里面的body元素里面的第2个div元素element2 = tab.ele('xpath:/html/body/div[2]')  # 查找html元素里面的body元素里面的所有div元素element5 = tab.eles('xpath:/html/body/div')  print('element1: ', element1)print('element2: ', element2)print('element3: ', element3)print('element4: ', element4)print('element5: ', element5)
 更多的xpath 法,请自行查阅资料学习。也可以使用开发者工具里面的 copy Xpath 功能。只是在动态页面的时候,可能还需要自己修改。2. css selector  用css selector方式查找元素。只在语句最前面且单独使用时生效。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')element1 = tab.ele('css:#kw')  # 查找id为"kw"的元素# 查找class为"c-tips-container"的元素element2 = tab.ele('css:.c-tips-container')  # 查找class为"s-top-login-btn c-btn"的元素element3 = tab.ele('css:.s-top-login-btn.c-btn')  # 查找div元素,筛选class为"c-tips-container"的元素element4 = tab.ele('css:div.c-tips-container')  element5 = tab.ele('css:div')  # 查找第1个div元素element6 = tab.eles('css:div')  # 查找所有div元素print('element1: ', element1)print('element2: ', element2)print('element3: ', element3)print('element4: ', element4)print('element5: ', element5)print('element6: ', element6)
更多 css selector 语法,请自行查阅资料学习。也可以使用开发者工具里面的 copy selector 功能。只是在动态页面的时候,可能还需要自己修改。3. dp特有的查找元素语法
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')element1 = tab.ele('文库')  # 查找元素内容中包含"文库"的元素element2 = tab.ele('@text()=文库')  # 查找元素内容等于"文库"的元素element3 = tab.ele('@text():文库')  # 查找元素内容中包含"文库"的元素element4 = tab.ele('@value=百度一下')  # 查找元素属性中包含"value",并且值为"百度一下"的元素element5 = tab.ele('@id=s-top-loginbtn')  # 查找元素属性中包含"id",并且值为"s-top-loginbtn"的元素element6 = tab.ele('@text()=登录')  # 如果存在多个,则返回第1个element7 = tab.eles('@text()=登录')[1]  # eles的查找结果会放到列表中。这里返回第1个element8 = tab.eles('tag:div')  # 查找所有标签名包含div的元素print('element1: ', element1)print('element2: ', element2)print('element3: ', element3)print('element4: ', element4)print('element5: ', element5)print('element6: ', element6)print('element7: ', element7)print('element8: ', element8)
4. ele()  用于查找其内部第一个符合条件的元素。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')element1 = tab.ele('css:div')  # 查找第1个div元素# 查找第2个div元素。index用来表示获取第几个匹配的元素,从1开始,可输入负数表示从后面开始数element2 = tab.ele(locator='css:div', index=2)  element3 = tab.eles('css:div')[1]  # 查找第2个div元素print('element1: ', element1)print('element2: ', element2)print('element3: ', element3)
5. eles()  此方法与ele()相似,但返回的是匹配到的所有元素组成的列表。
6.获取页面焦点元素    使用页面对象的active_ele属性获取页面上焦点所在元素。 
ele = tab.active_ele  
7.找不到元素默认情况下,找不到元素,不会立即抛出异常,而是返回一个NoneElement对象。这个对象用if判断表现为False,调用其功能会抛出ElementNotFoundError异常。这样可以用if判断是否找到元素,也可以用try去捕获异常。查找多个元素找不到时,返回空的list
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')ele = tab.ele('xiaojianbang')if ele:      print('找到了。')if not ele:      print('没有找到。')try:      ele.click()except ElementNotFoundError:      print('没有找到。')
8. find()  所有页面或元素对象都有这个方法,可接收多个定位符,同时查找多个(批)不同定位符的元素。  
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com')res1 = tab.find(locators=['#kw''#su'])# any_one=True,包含一个定位符和找到的元素# any_one=False,包含每一个定位符和找到的元素# first_ele=True 时,返回找到的第1个元素对象# first_ele=False 时,返回找到的所有元素对象res2 = tab.find(locators=['#kw''#su'], any_one=False, first_ele=True)print('res1: ', res1)print('res2: ', res2)
相对定位  有时候元素比较难找,不要总想着一步到位。也可以先获取到一个元素,然后在里面或周围查找元素。    以某元素为基准,在 DOM 中按照条件获取其直接子节点、同级节点、祖先元素、文档前后节点。
1. 获取父级元素 parent()  此方法获取当前元素某一级父元素,可指定筛选条件或层数。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')ele1 = tab.ele('xpath://*[@id="kw"]')  # 查找id为"kw"的元素ele2 = ele1.parent(2)  # 获取ele1的第2层父元素ele3 = ele1.parent('#head_wrapper')  # 获取ele1父元素中id为 "head_wrapper" 的元素print('ele2: ', ele2)print('ele3: ', ele3)
2. 获取直接子节点 child()children()  此方法返回当前元素的一个直接子节点,可指定筛选条件和第几个。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')ele1 = tab.ele('xpath://*[@id="form"]')  # 查找id为"form"的元素ele2 = ele1.child(2)  # 获取ele1的第2个子元素ele3 = ele1.child('tag:span'1)  # 获取ele1子元素中tag包含 "span" 的元素ele4= ele3.child('#kw')  # 获取ele3子元素中id为 "kw" 的元素print('ele2: ', ele2)print('ele4: ', ele4)
3. 获取前面的同级节点 prev()prevs()  此方法返回当前元素前面的某一个同级节点,可指定筛选条件和第几个。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')ele1 = tab.ele('xpath://*[@id="form"]')  # 查找id为"form"的元素ele2 = ele1.prev(1)  # 获取ele1前面第1个兄弟元素ele3 = ele1.prev('tag:style'1)  # 获取ele2前面第1个style兄弟元素ele4 = ele1.prev('tag:style')  # 获取ele2前面第1个style兄弟元素print('ele2: ', ele2)print('ele3: ', ele3)print('ele4: ', ele4)
4. 获取后面的同级节点 next()nexts()  此方法返回当前元素后面的某一个同级节点,可指定筛选条件和第几个。
# 获取ele1后面第3个兄弟元素ele2 = ele1.next(3)# 获取ele1后面第3个div兄弟元素ele2 = ele1.next('tag:div'3)# 获取ele1后面文本节点的文本txt = ele1.next('xpath:text()')
5. 在前面文档中查找节点 before()befores()  此方法返回当前元素前面的某一个符合条件的节点,可指定筛选条件和第几个。查找范围不限同级节点,而是整个 DOM 文档。
# 获取ele1前面第3个元素ele2 = ele1.before(3)# 获取ele1前面第3个div元素ele2 = ele1.before('tag:div'3)# 获取ele1前面文本节点的文本txt = ele1.before('xpath:text()')
6.在后面文档中查找节点 after()afters()  此方法返回当前元素后面的某一个节点,可指定筛选条件和第几个。查找范围不限同级节点,而是整个 DOM 文档。
# 获取ele1后面第3个元素ele2 = ele1.after(index=3)# 获取ele1后面第3个div元素ele2 = ele1.after('tag:div'3)# 获取ele1后面文本节点的文本txt = ele1.after('xpath:text()')
7. 链式写法  因元素对象本身又可以查找对象,所以可实现多级链式操作,使程序更简洁。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')# 查找id为"form"的元素ele1 = tab.ele('xpath://*[@id="form"]')  # 获取ele1子元素中tag包含 "span" 的元素ele2 = ele1.child('tag:span'1)  # 获取ele2子元素中id为 "kw" 的元素ele3= ele2.child('#kw')  print('ele3: ', ele3)# 链式写法ele = tab.ele('xpath://*[@id="form"]').child('tag:span'1).child('#kw')print('ele: ', ele)
iframe网页内嵌网页1. 同域和跨域  同域 iframe 可以用页面对象直接跨级查找元素      https://drissionpage.cn/demos/iframe_same_domain.html
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('http://DrissionPage.cn/demos/iframe_same_domain.html')ele = tab('概述')print(ele)
  跨域 iframe 无法通过页面直接查找里面的元素,可以先获取到 iframe 元素,再在其下查找      http://DrissionPage.cn/demos/iframe_diff_domain.html
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('http://DrissionPage.cn/demos/iframe_diff_domain.html')iframe = tab.get_frame('t:iframe')ele = iframe('网易首页')print(ele)
2. get_frame()  专门用来获取 iframe  frame。页面对象和元素对象都有这个方法。      iframe  frame 也可以用ele()查找到,但不建议用。
# 在标签页中获取第一个iframe元素iframe = tab.get_frame(1)# 在元素中获取id为`theFrame`的<iframe>元素对象iframe = ele.get_frame(locator='#theFrame')  
3. get_frames()  此方法用于获取页面中多个符合条件的 frame  iframe 对象。元素对象无此方法。locator 参数为 None 时返回所有。获取所有 iframe 会很慢,而且浪费资源,非必要别用。
shadow-root  可以理解成就是一种封装,把一系列的HTML元素隔离起来。要访问里面的元素,就需要先找到ShadowRoot对象。    用元素对象的shadow_root属性可获取ShadowRoot对象。      ShadowRoot对象不能跨级查找。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('chrome://history/')items = tab.ele('#history-app').sr.ele('#history').sr.eles('t:history-item')for i in items:      print(i.sr.ele('#item-container').text.replace('\n'''))
静态方式查找  静态元素是纯文本构造的,因此用它处理速度非常快。    对于复杂的页面,要在成百上千个元素中采集数据时,转换为静态元素可把速度提升几个数量级。    这种元素不能进行点击等交互,比较适合单纯采集数据。1. s_ele()  页面对象和元素对象都拥有此方法,用于查找第一个匹配条件的元素,获取其静态版本。
from DrissionPage import Chromiumtab = Chromium().latest_tabtab.get('https://www.baidu.com/')_keywords = tab.ele('#kw')_button = tab.ele('#su')_keywords.input("小肩膀逆向")tab.wait(1)_button.click()tab.wait(2)s_a_links = tab.s_eles('xpath://*/div/div[1]/div[1]/h3/a')# print(s_a_links)for s_a_link in s_a_links:      print(s_a_link.text, s_a_link.attr('href'))# s_page = tab.s_ele()# s_a_links = s_page.eles('xpath://*/div/div[1]/div[1]/h3/a')# # print(s_a_links)# for s_a_link in s_a_links:#     print(s_a_link.text, s_a_link.attr('href'))
2. s_eles()  此方法与s_ele()相似,但返回的是匹配到的所有元素组成的列表。

逆向工程师2025》

ai + 爬虫逆向,大大降低门槛

课程大纲:https://www.processon.com/view/link/671f79d5c7e2a805517d78ab

更新进度:https://docs.qq.com/sheet/DSGxvUnp2T0FsbXVV

    《逆向工程师2025》将ai与爬虫逆向结合,实现自动写爬虫代码、自动初步逆向等。整套包含爬虫、网页JS逆向、安卓逆向、iOS逆向、小程序逆向、验证码识别等六大版块。

    从零基础开始,介绍了自动化爬虫、协议爬虫、随机指纹浏览器定制、 JS混淆、JS补环境、ARM汇编、安卓系统定制、各种算法细节等几十个章节。

    整套近300个小时,上千集。

    买逆向工程师2025送逆向工程师2023。

小肩膀本人联系方式↓

课程笔记 | 逆向工程师 -> 爬虫 -> 02.自动化爬虫

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月13日17:01:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   课程笔记 | 逆向工程师 -> 爬虫 -> 02.自动化爬虫https://cn-sec.com/archives/4161851.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.