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

2024-09-03 17:28

本文主要是介绍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查询,还是会被识别需要验证码。大家学习为主,不要随便爬取网站信息哈

这篇关于python使用selenium,实现简单爬虫功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1133575

相关文章

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Python进阶之列表推导式的10个核心技巧

《Python进阶之列表推导式的10个核心技巧》在Python编程中,列表推导式(ListComprehension)是提升代码效率的瑞士军刀,本文将通过真实场景案例,揭示列表推导式的进阶用法,希望对... 目录一、基础语法重构:理解推导式的底层逻辑二、嵌套循环:破解多维数据处理难题三、条件表达式:实现分支

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数