python使用selenium,实现简单爬虫功能

目录

前言

环境

代码


前言

有个朋友想爬取一些数据,让我帮忙搞下,我也比较菜,不怎么用python就随便搜了点资料尝试下。

环境

idea,python3.1.0

edge浏览器(谷歌也可以),都需要在python的安装目录下存放驱动。

使用edge浏览器,当浏览器更新时,需要更新edgedriver驱动

https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/#downloads

然后在页面搜索版本号,比如127.0.2651.98
下载x86的,放在C:\Python311(python的安装目录) 修改文件名为MicrosoftWebDriver.exe

代码

data_model类,主要做数据的导出用的
import xlwt
FORMULA = 1
NORMAL = 0class Cell:def __init__(self, sheet, value, type=0, row_index=0, column_index=0, merge_row=0, merge_column=0):self.sheet = sheetself.row_index = row_indexself.column_index = column_indexself.row_name = row_index + 1self.column_name = self.transfer_column(column_index + 1)self.merge_row = merge_rowself.merge_column = merge_column# type==0是写入值,1是写入公式self.type = typeself.value = valuedef get_cell_location(self):return self.format_cell_location(self.column_name, self.row_name)def format_cell_location(self, col, row):return "{col}{row}".format(col=col, row=row)def get_pre_cell_location(self):return self.format_cell_location(self.transfer_column(self.column_index), self.row_name)def write(self):if self.type == NORMAL:self.write_value(self.value)elif self.type == FORMULA:self.write_formula(self.value)def write_value(self, value):print("write_value cell:", self.row_index, "-", self.column_index, "_", self.value, self.row_name)if self.merge_row == 0 and self.merge_column == 0:self.sheet.write(self.row_index, self.column_index, str(value))else:merge_row_index = self.row_index + self.merge_rowmerge_column_index = self.column_index + self.merge_columnif self.merge_row > 0:merge_row_index = merge_row_index - 1if self.merge_column > 0:merge_column_index = merge_column_index - 1self.sheet.write_merge(self.row_index, merge_row_index, self.column_index, merge_column_index, str(value))def write_formula(self, formula):#print(" write_formula cell:", self.row_index, "-", self.column_index, "_", self.value, "_", self.row_name)if self.merge_row == 0 and self.merge_column == 0:self.sheet.write(self.row_index, self.column_index, xlwt.Formula(formula))else:merge_row_index = self.row_index + self.merge_rowmerge_column_index = self.column_index + self.merge_columnif self.merge_row > 0:merge_row_index = merge_row_index - 1if self.merge_column > 0:merge_column_index = merge_column_index - 1self.sheet.write_merge(self.row_index, merge_row_index, self.column_index, merge_column_index,xlwt.Formula(formula))def transfer_column(self, index):'''转换列名:param index::return:'''chars = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T','U','V', 'W', 'X', 'Y', 'Z']b = len(chars)result = ""while True:if index % b == 0:result = chars[25]index = int(index / b)-1if index == 1:breakelse:result = chars[index % b - 1] + resultindex = int(index / b)if index == 0:breakreturn resultclass ZhuanLiInfo:def __init__(self, sheet, data):self.data = dataself.rows = []self.init_title(sheet)self.init_rows(sheet)def init_title(self, sheet):self.rows.append(Cell(sheet, "公司名称", NORMAL, 0, 0))self.rows.append(Cell(sheet, "电子邮箱", NORMAL, 0, 1))self.rows.append(Cell(sheet, "联系电话", NORMAL, 0, 2))self.rows.append(Cell(sheet, "机构网址", NORMAL, 0, 3))self.rows.append(Cell(sheet, "邮政编码", NORMAL, 0, 4))self.rows.append(Cell(sheet, "法定代表人", NORMAL, 0, 5))self.rows.append(Cell(sheet, "机构类型", NORMAL, 0, 6))self.rows.append(Cell(sheet, "通讯地址", NORMAL, 0, 7))self.rows.append(Cell(sheet, "代理机构状态", NORMAL, 0, 8))self.rows.append(Cell(sheet, "代理机构成立年限", NORMAL, 0, 9))self.rows.append(Cell(sheet, "信用等级", NORMAL, 0, 10))def init_rows(self, sheet):row_index = 0for third_transport_monitor_data in self.data:row_index = row_index+1col_index = 0for val in third_transport_monitor_data:self.rows.append(Cell(sheet, val, NORMAL, row_index, col_index))col_index = col_index+1def write(self):for row in self.rows:row.write()

主类:

ddd.py 
from selenium import webdriver
from selenium.webdriver.common.by import By
import  time
import random
import xlwt
from datetime import datetime
from data_model import ZhuanLiInfodef getData(driver,detail_list):# 查找页面上的所有<a>标签all_a_tags = driver.find_elements(By.CSS_SELECTOR, 'a.name')# 遍历所有<a>标签,并打印它们的href属性(如果有的话)row = 0for a_tag in all_a_tags:try:a_tag.click()except Exception as e:#捕获try块中发生的任何其他异常print(f"查询详情发生了其他异常: {e}")break;row += 1print("row:"+str(row))time.sleep(random.randint(30, 50))# 切换到新窗口(假设新窗口是最后一个打开的)original_window = driver.current_window_handleall_handles = driver.window_handlesfor handle in all_handles:if handle != original_window:driver.switch_to.window(handle)break# 在新页面上执行操作# 使用XPath查找元素companyName = driver.find_element(By.XPATH, '//div[contains(@class, "box")]/h5[contains(@class, "name")]').textemail = driver.find_element(By.XPATH,"//dt[text()='电子邮箱:']/following-sibling::dd").textphone = driver.find_element(By.XPATH,"//dt[text()='联系电话:']/following-sibling::dd").textwebUrl = driver.find_element(By.XPATH,"//dt[text()='机构网址:']/following-sibling::dd").textpostCode = driver.find_element(By.XPATH,"//dt[text()='邮政编码:']/following-sibling::dd").textfaren_elements = driver.find_elements(By.XPATH,'//dt[contains(text(), "法定代表人:")]/following-sibling::dd')faren = ''if faren_elements:faren=faren_elements[0].text;faren_elements2 = driver.find_elements(By.XPATH,'//dt[contains(text(), "执行事务合伙人:")]/following-sibling::dd')if faren_elements2:faren=faren_elements2[0].text;type = driver.find_element(By.XPATH,"//dt[text()='机构类型:']/following-sibling::dd").textaddress = driver.find_element(By.XPATH,"//dt[text()='通讯地址:']/following-sibling::dd").textstatus = driver.find_element(By.XPATH,"//dt[text()='代理机构状态']/following-sibling::dd").textyears = driver.find_element(By.XPATH,"//dt[text()='代理机构成立年限']/following-sibling::dd").textlevel = driver.find_element(By.XPATH,"//dt[text()='信用等级']/following-sibling::dd").textdetail_list.append([companyName, email, phone, webUrl, postCode, faren, type,address,status,years,level])print(detail_list[-1])driver.close()  # 关闭当前窗口# (可选)切换回原始窗口driver.switch_to.window(original_window)return detail_list
def queryByProvince(driver):#只查询广东省的all_province_link = driver.find_elements(By.CSS_SELECTOR, '.localoffice a')for a_province in all_province_link:if a_province.text.strip() == '广东省':a_province.click()break#查询queryButton=driver.find_element(By.CSS_SELECTOR, '.button-btn')queryButton.click()# 初始化WebDriver
driver = webdriver.Edge()
# 打开网页
driver.get("http://XXXX")
#只查询广东省的
queryByProvince(driver)
#数据列表
detail_list = []
detail_list = getData(driver,detail_list);page = 1
while True:#下一页all_page_link = driver.find_elements(By.CSS_SELECTOR, '.incpage a')hasnext = 0for a_page in all_page_link:if a_page.text.strip() == '下一页':try:a_page.click()hasnext = 1except Exception as e:#捕获try块中发生的任何其他异常print(f"page发生了其他异常: {e}")finally:break;if hasnext:page += 1print("page:"+str(page))try:detail_list = getData(driver,detail_list)except Exception as e:#捕获try块中发生的任何其他异常print(f"getData发生了其他异常: {e}")finally:break;else:break# 获取当前时间
now = datetime.now()
# 格式化时间为年月日时分秒字符串,例如:"2023-04-01 14:30:45"
datetime_str = now.strftime("%Y%m%d%H%M%S")
week = datetime_str + "信息"
wb = xlwt.Workbook(encoding="utf-8")
zhuanlisheet=wb.add_sheet("信息")
zhuanliObj=ZhuanLiInfo(zhuanlisheet,detail_list)
zhuanliObj.write()
wb.save(f"res/data-{week}1.xls")
# 关闭WebDriver
driver.quit()

大多数网站都有防爬机制,最好是能换ip,不行就间隔时间久点查询,我这里间隔time.sleep(random.randint(30, 50)) 30-50s查询,还是会被识别需要验证码。大家学习为主,不要随便爬取网站信息哈

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

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

相关文章

自然语言处理系列六十一》分布式深度学习实战》TensorFlow深度学习框架

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十一分布式深度学习实战》TensorFlow深度学习…

linux定时监听ssh服务是否启动-------麒麟操作系统永久关闭swap

linux监听ssh服务是否启动 1、监听脚本2、定时任务3、麒麟操作系统&#xff0c;永久关闭swap 1、监听脚本 #在/usr/local/bin目录下新建脚本文件 cd /usr/local/bin touch check_sshd.sh #给可执行权限 chmod x /usr/local/bin/check_sshd.sh脚本内容如下&#xff1a; #!/…

回溯算法day24| 491.递增子序列、46. 全排列、47. 全排列 II

回溯算法day24| 491.递增子序列、46. 全排列、47. 全排列 II 491.递增子序列[46. 全排列](https://leetcode.cn/problems/permutations/)[47. 全排列 II](https://leetcode.cn/problems/permutations-ii/) 491.递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该…

SpringBoot2:请求处理原理分析-接口参数的常用注解

1、PathVariable 作用说明&#xff1a;获取路径参数 案例&#xff1a; 接口收参形式&#xff1a; GetMapping("/car/{id}/owner/{username}")public Map<String,Object> getCar(PathVariable("id") Integer id,PathVariable("username")…

element-ui单元格点击后进入编辑模式的功能

实现一个单元格点击后进入编辑模式的功能。可以通过动态切换组件来实现。 为了在el-table-column中实现单元格单击后变为可编辑的功能&#xff0c;可以使用v-if和v-else来判断当前单元格是否处于编辑状态&#xff0c;并配合数据绑定和事件处理。 代码示例 <el-table-colum…

【uml】graph_legend中的类图怎么看

上图中的方框具有以下含义&#xff1a; 实心灰色方框表示生成图表的结构或类。 带黑色边框的方框表示已记录的结构或类。 带灰色边框的方框表示未记录的结构或类。 带红色边框的方框表示未显示所有继承/包含关系的已记录的结构或类。如果图表不适合指定的边界&#xff0c;则图…

雷电9模拟器安装magisk和lsposed

模拟器环境配置 1、开启root 2、开启System.vmdk可写入 安装magisk 1、新建模拟器、开启root权限、并安装debug版magisk 下载地址去上面吾爱论坛作者文章下载吧&#xff01;支持他一下&#xff01; 2、打开magisk的app&#xff0c;点击安装 如果弹出获取权限&#xff0c;直接…

《A Few Useful Things to Know about Machine Learning》论文导读

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl机器学习作为人工智能领域的重要分支,近年来得到了广泛的关注和应用。Pedro Domingos的经典论文《A Few Useful Things to Know about Machine Learning》为我们提供了对机器学习深入且全面的理解…

前端代码规范- Commit 提交规范

什么是约定式提交 约定式提交&#xff08;Conventional Commits&#xff09;是一种用于代码版本控制的规范&#xff0c;旨在通过明确和标准化提交信息来提高代码协作质量和效率。其基本原则是通过规定提交信息的结构和语义来提高代码版本控制的可读性、可维护性和自动化程度。…

蚁剑webshell连接报错A JavaScript error occurred in the main process

报错如图&#xff1a; 已知解决方式&#xff1a; 将上传shell中文文件名修改为任意的英文文件名即可连接。

uniapp对tabbar封装,简单好用

第一种&#xff0c;效果展示 上代码&#xff0c;新建一个公用组件&#xff0c;tabbar.vue <template><view class"tabbar"><view class"tabbar-item" click"tabbarbtn(0)"><image class"item-image" v-if"…

Unreal Fest 2024 虚幻引擎影视动画制作的普遍问题

一 毛发缓存数据巨大的问题&#xff08;及5个解决方案&#xff09; 在引擎里模拟毛发&#xff0c;并且把它缓存下来&#xff0c;我们就不需要从外部导入了&#xff0c;所以我们要解决的问题就是怎么样在引擎里自由地控制毛发 1.物理场控制 延申 [技术分享]《UE中的世界物理场…

大二上学期计划安排

大二上学期计划安排 学期目标: 加强算法学习,提升算法思维,为以后的算法竞赛做准备学习java知识,学习框架,构建知识体系,深入底层,增强理解增加项目经验,独立完成至少一个项目,并进行交流,优化增强团队凝聚力,营造良好的团队氛围阅读书籍,阅读至少3本以上经典书籍 日常学习安…

第三天旅游线路预览——从贾登峪到禾木风景区入口

第三天&#xff1a;从贾登峪到禾木风景区&#xff0c;晚上住宿贾登峪&#xff1b; 从贾登峪到禾木风景区入口&#xff1a; 1&#xff09;早上9&#xff1a;00起床&#xff0c;吃完早饭&#xff0c;9&#xff1a;30出发&#xff1b; 2&#xff09;从贾登峪到禾木景区售票厅&am…

CSDN文章无水印转成PDF

文章目录 一、打开检查二、点击进入控制台三、在控制台中输入代码 一、打开检查 f11或者右键打开检查 二、点击进入控制台 三、在控制台中输入代码 (function(){ use strict;var articleBox $("div.article_content");articleBox.removeAttr("style&quo…

云计算之大数据(上)

目录 一、Elasticsearch 1.1 产品组件 1.1.1 X-Pack 1.1.2 Beats数据采集中心 1.1.3 Logstash 1.1.4 Kibana 1.2 架构特性 1.2.1 性能 1.2.2 安全性 1.2.3 可用性 1.2.4 可扩展性 1.2.5 可维护性 1.2.6 国际化 1.3 综合检索分析 1.4 全观测 1.5 大数据检索加速…

斑马鱼的超级大脑,光学脑机接口能否解锁生物行为的终极控制?

今天&#xff0c;让我们一起走进一个令人兴奋的科学领域——光学脑机接口&#xff0c;看看科学家们是如何通过这项技术&#xff0c;首次实现了对斑马鱼全脑活动的实时监控和控制。 从科幻到现实的一步之遥 想象一下&#xff0c;如果能够直接读取和影响生物大脑的神经活动&#…

spingboot中创建简单的WebSocket服务和使用OKHttp创建socket客户端接收数据

背景 springboot 中使用okhttp3创建webSocket服务端 server1 和客户端 client1&#xff0c;客户端clinet1调用server1用于发送图片&#xff0c;创建客户端client2接收此图片. 在Spring Boot中使用OkHttp3创建WebSocket服务端和客户端&#xff0c;涉及到两个不同的操作&#xff…

Android使用Room后无法找到字符BR

一般来讲&#xff0c;无法找到BR字符多与Data Binding 相关。 在 Android Studio 中使用 Data Binding 时&#xff0c;如果突然出现 “BR 文件不可用” 或 “找不到符号 BR” 的错误&#xff0c;可能是由以下原因造成的&#xff1a; Data Binding 未启用&#xff1a;确保在你的…

MySQL:进阶巩固-SQL优化

目录 一、INSERT优化1.1 采用批量插入的方式1.2 采用手动提交的方式1.3 主键顺序插入1.4 大批量插入数据 二、主键优化三、ORDER BY 排序优化四、GROUP BY 分组优化五、LIMIT优化六、COUNT优化 一、INSERT优化 1.1 采用批量插入的方式 INSERT INTO tb_user values(1, zhangsa…