Python Selenium+cookie+XPATH爬取数据

news/2024/11/17 4:52:19/文章来源:https://www.cnblogs.com/Vicrooor/p/18295004

以某科研基金信息平台为例,写了一个基于selenium的web自动化爬虫。不带验证码防反爬以及代理ip池,是最基础的自动化工具爬虫。

一、首先,此平台需要登录后才能正常访问,否则数据不全,因此需要登录后获取cookie,以便selenium能够以登录状态运行

1.F12打开开发者工具,找到network(网络),在登录后其有一个刷新的请求

 可以看到该网站仅刷新了这一个请求

2.点击“cookie”选项卡,进入cookie截面(其实selenium自带了自动保存cookie的方法,但我希望尝试一下手动输入的流程)

 3.可以看到cookie的信息分为“name”和“value”两部分,为了让cookie能够注入selenium,需要将其全部整理为[{'name':'xxx','value':'xxx'}]的形式,如下:

 这便是一个完整的手动版cookie格式

 

二、在获取到cookie之后,第二步是需要分析页面找规律,找出我需要获取的信息

1.依旧是打开开发者工具,点开“元素”选项卡,可以看到整个网页的元素结构。将光标放到元素上,页面上就会显示该元素内具体包含了什么

经过查找,发现我需要的内容被包含在一个大元素中,下面分多个子元素,子元素下面又分多个子元素,

 

 

 

 

 虽然关系很复杂,但是实际上,我们可以发现,我们需要的内容的class是一致的,

我需要的内容可以被这样找到:

父元素→遍历其中的子元素→找到子元素中特定class的元素

有了这样的逻辑,我就可以轻松地在代码中定位我需要的数据

为了实际定位,我使用XPATH作为定位的方法

例如我想先找到父元素,也就是<div class="home-content-container">

其XPATH即可以被写为 './/div[@class="home-content-container"]' 即可与find_element配合来获取此元素

 

三、在以上两步都完成后,我就可以开始编写代码来获取我需要的数据

# coding:utf-8
import time
import random
from time import sleep
from csv import writer
from selenium import webdriver
from selenium.webdriver.common.by import By#初始化webdriver实例
driver = webdriver.Chrome()#定义函数
def get_information(search_name):
#打开某名字下的网站driver.get("https://www.xxxxx.cn/pro/sonE-stwE08?psnname={}".format(search_name))time.sleep(6)#手动添加cookiecookies = [{'name': 'HMACCOUNT', 'value': 'xxx'},{'name': 'Hm_lpvt_0449d831efe3131221f6d2f2b6c91897', 'value': 'xxx'},{'name': 'Hm_lvt_0449d831efe3131221f6d2f2b6c91897', 'value': 'xxx'},{'name': '_c_WBKFRo', 'value': 'xxx'},{'name': '_nb_ioWEgULi', 'value': ''},{'name': 'acw_tc', 'value': 'xxx'},{'name': 'counter', 'value': 'xxx'},{'name': 'gzr_session', 'value': 'xxx'},{'name': 'userId', 'value': 'xxx'},{'name': 'uuid', 'value': 'xxx'},] #加载cookie模拟登陆for cookie in cookies:driver.add_cookie(cookie)time.sleep(5)driver.refresh()time.sleep(random.randrange(5,10))#定位需要爬取的元素(这里我进一步简化了定位的路径,请见谅)#获取我需要的主元素,由于有好几个,所以使用find_elementsparent_element=driver.find_elements(By.XPATH,'.//div[@class="item-box layui-card "]')#遍历每一个主元素for child_element in parent_element:#主元素中的数据元素,也是有多个text_element=child_element.find_elements(By.XPATH,'.//div[@class="layui-col-xs4"]')info=''#对于每个数据元素,使用.text取出数据for n in text_element:info+=n.textinfo+=','print(info)#储存到csv里list_data=[name,info]with open("信息.csv", "a", newline="") as f_object:writer_object = writer(f_object)writer_object.writerow(list_data)time.sleep(5)list_name=[xxxxx]
#主程序
for name in list_name:get_information(name)time.sleep(random.randrange(10,30))

 

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

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

相关文章

个人赛补题

round 1范围很小用暴力+贪心,左右枚举,先拿再放。尽量放小的所以需要排下序 include include "map" include "algorithm" include "cmath" include "vector" include "set" include "queue" define int long lo…

观《深入理解C#》有感---泛型五种约束

一、引用类型约束 class Sample<T> where T : class类型实参可以是: 任何类: Sample<string> 接口: Sample<IDisposable> 数组: Sample<int[]> 委托: Sample<Action>二、值类型约束 class Sample<T> where T : struct类型实参可以是:…

2024/7/10 笔记

CF1693F对0,1个数相等的0,1串进行排序一定是最优的贪心策略。 我们把0记为1,1记为-1.求前缀和如果1的个数大于0的个数,那么就把整个串翻转然后取反,推一下就可以知道结果不会变。CF1646F这题我写了半天发现假了; 一开始看了样例很容易想到,每个人每轮都把自己不需要的牌往…

G65 线性基+贪心法 P4570 [BJWC2011] 元素

视频链接: P4570 [BJWC2011] 元素 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)// 线性基 O(60*n) #include <iostream> #include <cstring> #include <algorithm> using namespace std;#define LL long long const LL N=1005; int n,m; struct node{LL …

一套基于 Ant Design 和 Blazor 的开源企业级组件库

前言 今天大姚给大家分享一套基于Ant Design和Blazor的开源(MIT License)、免费的企业级组件库(喜欢Ant Design风格的同学推荐使用):Ant Design Blazor。项目特性提炼自企业级中后台产品的交互语言和视觉风格。 开箱即用的高质量 Blazor 组件,可在多种托管方式共享。 支持…

Linux-shell编程入门基础

本篇文章就是一个过渡学习的,先入门shell脚本,由于作者有编程基础,所以有些解释的比较少。由于现在还在努力学习中,以后等本散修进阶了之后再写进阶的、与网络安全更加贴合的shell编程目录前言Shell编程bash特性shell作用域变量环境变量$特殊变量$特殊状态变量$特殊符号(很…

HashMap和ConcurrentHashMap的底层实现原理

(1)HashMap底层实现原理 在 JDK 1.7 版本之前, HashMap 数据结构是数组和链表,HashMap 通过哈希算法将元素的键 (Key) 映射到数组中的槽位 (Bucket)。如果多个键映射到同一个槽位,它们会以链表的形式存储在同一个槽位上,因为链表的查询时间是 O(n),所以冲突很严重,一个…

【Azure Key Vault】关于Key Vault使用的几个问题

问题一:Key Vault 和 Event Grid 通过将 Key Vault 与事件网格集成,可以在密钥保管库中存储的机密的状态发生更改时收到通知。 状态更改将定义为即将到期的机密(到期前 30 天)、已过期的机密或具有可用新版本的机密。 支持所有三种机密类型(密钥、证书和机密)的通知。无法…

利用Selenium和PhantomJS绕过接口加密的技术探索与实践

本文介绍了如何利用Selenium结合PhantomJS绕过网站接口加密的方法,详细分析了实现过程中的关键步骤和技术挑战。此外,文章还包括一个具体案例:使用该技术爬取振坤行商品信息的实例,展示了该技术在实际网络数据采集中的应用和效果。selenium+phantomjs绕过接口加密 我们为什…

Profinet转ModbusTCP网关模块连发那科机器人与DCS通讯

本文介绍了使用巴图自动化Profinet转ModbusTCP网关(BT-ETHPN20)配置通讯,实现DCS与发那科机器人间数据传递的步骤。巴图自动化Modbus转Profinet网关模块(BT-MDPN10)集成了Modbus协议和Profinet协议,具有将Modbus和Profinet协议互转的能力,且支持Modbus RTU主从站。Profine…

动手学Avalonia:基于硅基流动构建一个文生图应用(一)

本文为动手学Avalonia:基于硅基流动构建一个文生图应用系列(一)。文生图 文生图,全称“文字生成图像”(Text-to-Image),是一种AI技术,能够根据给定的文本描述生成相应的图像。这种技术利用深度学习模型,如生成对抗网络(GANs)或变换器(Transformers),来理解和解析…