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

详解:用(Selenium+PhantomJS)python简单实现爬虫的功能 前言: 今天为大家带来的内容是详解:用(Selenium+PhantomJS)python简单实现爬虫的功能,希望大家会喜欢,文中示例代码介绍的颇为详细,具有不错的参考意义! 提示:开始之前,会给大家详细的介绍Selenium+PhantomJS 的安装步骤! Selenium 一、简介 selenium是一个用于Web应用自动化程序测试的工具,测试直接运行在浏览器中,就像真正的用... 阅读详情

目录

前言

环境

代码


前言

有个朋友想爬取一些数据,让我帮忙搞下,我也比较菜,不怎么用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 = 0

class Cell:
    def __init__(self, sheet, value, type=0, row_index=0, column_index=0, merge_row=0, merge_column=0):
        self.sheet = sheet
        self.row_index = row_index
        self.column_index = column_index
        self.row_name = row_index + 1
        self.column_name = self.transfer_column(column_index + 1)
        self.merge_row = merge_row
        self.merge_column = merge_column
        # type==0是写入值,1是写入公式
        self.type = type
        self.value = value

    def 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_row
            merge_column_index = self.column_index + self.merge_column

            if self.merge_row > 0:
                merge_row_index = merge_row_index - 1
            if self.merge_column > 0:
                merge_column_index = merge_column_index - 1

            self.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_row
            merge_column_index = self.column_index + self.merge_column

            if self.merge_row > 0:
                merge_row_index = merge_row_index - 1
            if self.merge_column > 0:
                merge_column_index = merge_column_index - 1
            self.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)-1
                if index == 1:
                    break
            else:
                result = chars[index % b - 1] + result
                index = int(index / b)
                if index == 0:
                    break
        return result



class ZhuanLiInfo:
    def __init__(self, sheet, data):
        self.data = data
        self.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 = 0
        for third_transport_monitor_data in self.data:
            row_index = row_index+1
            col_index = 0
            for val in third_transport_monitor_data:
                self.rows.append(Cell(sheet, val, NORMAL, row_index, col_index))
                col_index = col_index+1

    def 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 ZhuanLiInfo


def getData(driver,detail_list):
    # 查找页面上的所有<a>标签
    all_a_tags = driver.find_elements(By.CSS_SELECTOR, 'a.name')

    # 遍历所有<a>标签,并打印它们的href属性(如果有的话)
    row = 0
    for a_tag in all_a_tags:
        try:
            a_tag.click()
        except Exception as e:
            #捕获try块中发生的任何其他异常
            print(f"查询详情发生了其他异常: {e}")
            break;
        row += 1
        print("row:"+str(row))
        time.sleep(random.randint(30, 50))
        # 切换到新窗口(假设新窗口是最后一个打开的)
        original_window = driver.current_window_handle
        all_handles = driver.window_handles
        for 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")]').text
        email = driver.find_element(By.XPATH,"//dt[text()='电子邮箱:']/following-sibling::dd").text
        phone = driver.find_element(By.XPATH,"//dt[text()='联系电话:']/following-sibling::dd").text
        webUrl = driver.find_element(By.XPATH,"//dt[text()='机构网址:']/following-sibling::dd").text
        postCode = driver.find_element(By.XPATH,"//dt[text()='邮政编码:']/following-sibling::dd").text
        faren_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").text
        address = driver.find_element(By.XPATH,"//dt[text()='通讯地址:']/following-sibling::dd").text
        status = driver.find_element(By.XPATH,"//dt[text()='代理机构状态']/following-sibling::dd").text
        years = driver.find_element(By.XPATH,"//dt[text()='代理机构成立年限']/following-sibling::dd").text
        level = driver.find_element(By.XPATH,"//dt[text()='信用等级']/following-sibling::dd").text
        detail_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 = 0
    for a_page in all_page_link:
        if a_page.text.strip() == '下一页':
            try:
                a_page.click()
                hasnext = 1
            except Exception as e:
                #捕获try块中发生的任何其他异常
                print(f"page发生了其他异常: {e}")
            finally:
                break;
    if hasnext:
        page += 1
        print("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 网络爬虫高阶用法 通过学习本文的内容,读者应掌握 Python 网络爬虫的高级用法,并能够应对反爬虫机制、抓取动态网页、实现分布式和异步爬虫。网络爬虫技术在数据抓取、信息采集等方面有着广泛的应用,掌握这些技能将大大提升数据处理和分析的效率。 阅读详情

相关推荐

五分钟学会Python网络爬虫

但不管怎样,爬虫技术是无罪的,还是值得我们开发人员去学习了解一下的。在学习之前,我们还是要先了解一下相关概念。 什么是爬虫 网络爬虫:又被称为网页蜘蛛,网络机器人,是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。 大数据时代,要进行数据分析,首先要有数据源,可数据源从哪里来,花钱买,没预算,只能从其它网站就行抓取。 细分下来,业内分为两类:爬虫和反爬虫。 反爬虫:顾名思义,就是防止你来我网站或APP上做爬虫的。 爬虫工程师和反爬虫工程师是一对相爱相杀的小伙伴,经常因为对方要加班写代码,

python588的博客 2352

python selenium 爬虫教程_python selenium爬虫

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。以下是一个案例分析,展示如何使用Python和Selenium进行安全的爬取。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

m0_57472099的博客 2492

Python玩转Excel的读写改实例

今天小编就为大家分享一篇关于Python玩转Excel的读写改实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

python 爬虫 入门 六、Selenium

selenium优点自然是使用比较简单,怎么访问网站就怎么写代码即可,但是访问速度比较慢,需要等待页面JS加载。

i道i的博客 2078

AI Agent在智能投研中的实战:多智能体信息整合与策略生成

本文将带你从0到1完整搭建一套基于LangChain和AutoGen的多智能体AI投研系统首先,我们会一起梳理智能投研的核心痛点、金融数据的独特性,以及为什么传统AI Agent,尤其是多智能体协同架构,是破局的唯一最优解;RAG检索增强生成(但这次是金融领域定制化的,包括向量检索+时序数据检索+知识图谱检索的“三元检索增强”)、AutoGen多智能体协同框架。

软件工程实践的博客 380

使用Label Studio标注车牌数据:YOLOv26模型训练指南

在计算机视觉领域,数据标注是模型训练的基础环节,直接影响最终模型的识别精度。Label Studio作为专业的标注工具,支持多种标注类型和格式导出,特别适合目标检测任务的数据准备。通过多边形标注技术,可以精确捕捉车牌的四个角点,生成旋转矩形框(OBB)标注数据,这种标注方式相比传统水平框能更好地处理倾斜车牌场景。标注完成后,数据可导出为YOLO格式,直接用于YOLOv26等先进目标检测模型的训练。在实际工程中,合理的标注策略和严格的质量控制能显著提升车牌识别模型在复杂场景下的鲁棒性,适用于智能交通、停车场管

chuozhi7142的博客 902

python自动测试g_Selenium Edge Driver Python 自动化测试

Finally I got it.没有自动化过edge,今天被小坑了一下,但是还好现在弄好了。1. 查看edge 版本,我的是14.143932. https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/ 下载edge driver。一定要下载support version的driver哦,否则你单独运行webdri...

weixin_39926540的博客 349

具身智能的边缘计算核心构成方案

摘要: 具身智能(Embodied Intelligence)依赖物理实体与环境交互,而边缘计算(Edge Computing)通过本地化数据处理降低延迟、提升实时性。两者结合的核心方案包含五层架构:传感器层采集环境数据,边缘处理单元执行本地计算,通信模块实现低延迟传输,决策引擎运行轻量AI模型,执行器接口转化动作为物理操作。该方案以“边缘优先”为原则,满足毫秒级响应(如延迟<50ms),同时优化能效(功耗降低30%)和隐私保护。适用于机器人、自动驾驶等场景,通过分层闭环设计确保在资源受限环境中的可靠

老郑的博客 809

ExcelWrite-自动生成中文表格

ExcelWrite-自动生成中文表格

矩阵的秩的专栏 579

CentOS Stream 9中安装MySQL的详细步骤

本文详细介绍了在CentOS Stream 9系统中如何进行MySQL的在线安装、离线安装以及忘记密码的恢复操作。通过阅读本文,您将能够了解并掌握在CentOS Stream 9上安装MySQL的步骤,以及在遇到忘记密码的情况下的解决方案。

小白典的博客 7257

【AUTOSAR-CanNM】-3.1-如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

如何让ECU发出的首帧是NM帧(Tx Nm报文先于Tx App应用报文发出)

「汽车电子助手」的博客 4723

Selenium + PhantomJS + python 简单实现爬虫的功能

Selenium 一、简介 selenium是一个用于Web应用自动化程序测试的工具,测试直接运行在浏览器中,就像真正的用户在操作一样 selenium2支持通过驱动真实浏览器(FirfoxDriver,IternetExplorerDriver,OperaDriver,ChromeDriver) selenium2支持通过驱动无界面浏览器(HtmlUnit,PhantomJs) 二、安装 Windows 第一种方法是:下载源码安装,下载地址(https://pypi.python.org/pypi/sel

测试界的彭于晏的博客 637

rk3576 点亮 LCD(eDP)

RK3576 处理器集成了对 **eDP (Embedded DisplayPort)** 接口的支持,主要用于驱动嵌入式或笔记本电脑的内置屏幕。支持 **eDP 1.3 版本协议**, 最大可支持 ****4K@120Hz**。

weixin_35723192的博客 352

详解:用python简单实现爬虫的功能!(Selenium+PhantomJS)

前言: 今天为大家带来的内容是详解:用(Selenium+PhantomJS)python简单实现爬虫的功能,希望大家会喜欢,文中示例代码介绍的颇为详细,具有不错的参考意义! 提示:开始之前,会给大家详细的介绍Selenium+PhantomJS 的安装步骤! Selenium 一、简介 selenium是一个用于Web应用自动化程序测试的工具,测试直接运行在浏览器中,就像真正的用...

weixin_41334453的博客 428

ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C 解决方案

本文主要介绍了ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject解决方案,希望能对使用Numpy的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

高匿反爬实战:Python打造无痕爬虫,规避风控系统追踪

网络层匿踪:核心是使用住宅IP代理池,按真实用户IP画像匹配,控制请求频率;协议层匿踪:动态生成请求头(每次都不同),参数添加随机噪声,避免规律化;行为层匿踪:模拟人类的非规律行为(贝塞尔轨迹、随机停顿、非精准点击);设备层匿踪:伪造Canvas/WebGL指纹,禁用webdriver标识,每次请求更换指纹;核心原则:无痕爬虫的本质是“无限接近真实用户”,所有维度都要消除爬虫特征,而非单一维度伪装。打造真正的无痕爬虫需要全维度的匿踪策略,单一维度的伪装极易被高级风控系统识别。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2641

使用Python3和Selenium打造百度图片爬虫

使用python3实现基础的百度图片爬虫功能。

猫晨的技术小屋 843

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【Python练习】066. 编写一个函数,实现简单的网络爬虫功能,抓取网页内容

本文介绍了使用Python实现简单网络爬虫的方法,主要讲解如何通过requests和BeautifulSoup库抓取网页内容。文章包含安装指南、示例代码及详细说明,展示了如何发送HTTP请求、解析HTML并提取标题和段落内容。同时提供了异常处理、请求头设置等实用技巧,并指出需遵守爬虫规范。最后还介绍了处理动态内容的替代方案(如Selenium)和扩展功能(如Scrapy框架),为读者提供了从基础到进阶的爬虫实现方案。

视睿 1122

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

python爬虫的使用

编写爬虫,我们要用到Python的 Selenium 库。 在终端键入pip install selenium

AthlenaA的博客 206

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

使用 Selenium Wire 进行 Python 网络爬虫

是 Selenium Python 绑定的一个扩展,能够对浏览器请求进行控制。它允许直接在使用 Selenium 的同时,从 Python 代码中实时拦截并修改请求与响应。注意该库目前已停止维护,但依然有不少爬虫技术和脚本在使用。

亮数据 Bright Data 的博客 1824

网络爬虫解析

网络爬虫(也称为网页蜘蛛、网络机器人)是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。网络爬虫可以用于从网站提取数据,例如监测社交媒体平台上的活动,或者从网上收集新闻和文章。它们也可以用于搜索引擎,如Google和Bing,来抓取和索引网页,以便在用户进行搜索时提供结果。URL通常由多个部分组成,包括协议类型(如HTTP、HTTPS)、主机名(域名或IP地址)、路径(资源在主机上的位置)以及可选的查询参数(用于传递额外的信息)。通过URL,用户可以方便地访问和定位到特定的网络资源。

2301_82032652的博客 2628
上一篇: springboot配置两个MongoDB
下一篇: redis缓存和数据库通过延迟双删除实现数据一致性
bxp1321
博客等级 码龄17年 146粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值