开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

Selenium python 代码运行的时候提示 no attribute 'find_element_by_xpath'

我们有下面的一行代码,运行测时候提示没有特定的属性。 Name = 'kuch bhi' last = test.find_element_by_xpath('//*[@id="mG61Hd"]/div[2]/div/div[2]/div[1]/div/div/div[2]/div/div[1]/div/div[1]/input') last.send_keys(Name) 问题和解决 根据官方的修改记录, * Deprecated find_element_by_* and find_elements_by_* are now removed (#10712) 这个方法在 4.3 的版本后已经被删除了。 官方链接:https://github.com/SeleniumHQ/selenium/blob/a4995e2c096239b42c373f26498a6c9bb4f2b3e7/py/CHANGES     针对 xpath 的查找,官方简化为使用了 find_elementfind_element 这个方法。 如果是希望返回的是一个数组或者列表的话,我们将会使用下面的方法: rowContent = chrome.find_elements(By.XPATH, '/html/body/div[3]/div/div/div/div[4]/div/table/tbody/tr') 唯一不同的就是方法后面多了一个 s,有 s 的是返回数组或者列表。 https://www.isharkfly.com/t/selenium-python-no-attribute-find-element-by-xpath/14989

2023年09月20日 0Comments 621Browse 0Like Read more
Computer Science

Python 和 Selenium 的浏览器爬虫

Selenium 是一款强大的基于浏览器的开源自动化测试工具,最初由 Jason Huggins 于 2004 年在 ThoughtWorks 发起,它提供了一套简单易用的 API,模拟浏览器的各种操作,方便各种 Web 应用的自动化测试。 它的取名很有意思,因为当时最流行的一款自动化测试工具叫做 QTP,是由 Mercury 公司开发的商业应用。Mercury 是化学元素汞,而 Selenium 是化学元素硒,汞有剧毒,而硒可以解汞毒,它对汞有拮抗作用。 Selenium 的核心组件叫做 Selenium-RC(Remote Control),简单来说它是一个代理服务器,浏览器启动时通过将它设置为代理,它可以修改请求响应报文并向其中注入 Javascript,通过注入的 JS 可以模拟浏览器操作,从而实现自动化测试。 但是注入 JS 的方法存在很多限制,譬如无法模拟键盘和鼠标事件,处理不了对话框,不能绕过 JavaScript 沙箱等等。 就在这个时候,于 2006 年左右,Google 的工程师 Simon Stewart 发起了 WebDriver 项目,WebDriver 通过调用浏览器提供的原生自动化 API 来驱动浏览器,解决了 Selenium 的很多疑难杂症。不过 WebDriver 也有它不足的地方,它不能支持所有的浏览器,需要针对不同的浏览器来开发不同的 WebDriver,因为不同的浏览器提供的 API 也不尽相同,好在经过不断的发展,各种主流浏览器都已经有相应的 WebDriver 了。最终 Selenium 和 WebDriver 合并在一起,这就是 Selenium 2.0,有的地方也直接把它称作 WebDriver。 Selenium 目前最新的版本已经是 3.9 了,WebDriver 仍然是 Selenium 的核心。 为什么 Selenium 成了爬虫工具 Selenium 的初衷是打造一款优秀的自动化测试工具,但是慢慢的人们就发现,Selenium 的自动化用来做爬虫正合适。我们知道,传统的爬虫通过直接模拟 HTTP 请求来爬取站点信息,由于这种方式和浏览器访问差异比较明显,很多站点都采取了一些反爬的手段,而 Selenium 是通过模拟浏览器来爬取信息,其行为和用户几乎一样,反爬策略也很难区分出请求到底是来自 Selenium 还是真实用户。而且通过 Selenium 来做爬虫,不用去分析每个请求的具体参数,比起传统的爬虫开发起来更容易。 Selenium 爬虫唯一的不足是慢,如果你对爬虫的速度没有要求,那使用 Selenium 是个非常不错的选择。Selenium 提供了多种语言的支持(Java、.NET、Python、Ruby 等),不论你是用哪种语言开发爬虫,Selenium 都适合你。 这是因为 Selenium 启动都需要调用浏览器的核心来启动一个浏览器。 同时,当浏览器访问网站的时候,如果数据没有载入完全,Selenium 是不会对数据进行分析的,有些网站的载入很慢,这样就导致 Selenium 的处理很慢。 这个不是因为 Selenium 程序慢,而是等待数据载入的时间太长。 启动浏览器 使用下面 3 句话就可以模拟启动一个浏览器,并且通过浏览器访问一个网站后,对网站来进行分析。 from selenium.webdriver import Chrome chrome = Chrome(service=Service(r"C:\Users\yhu\Downloads\chromedriver-win64\chromedriver-win64\chromedriver.exe")) chrome.get('https://www.isharkfly.com/') // Get Element rowContent = chrome.find_elements(By.XPATH, '/html/body/div[3]/div/div/div/div[4]/div/table/tbody/tr') 如实例没有启动的话,获得元素的代码就没有办法执行。 其实慢就是慢在这里。   https://www.isharkfly.com/t/python-selenium/14988

2023年09月20日 0Comments 460Browse 0Like Read more
Computer Science

Python 网络爬取的时候使用那种框架

尽管现代的网站多采取前后端分离的方式进行开发了,但是对直接 API 的调用我们通常会有 token 的限制和可以调用频率的限制。     因此,在一些特定的网站上,我们可能还是需要使用网络爬虫的方式获得已经返回的 JSON 数据结构,甚至是处理已经完成界面展示的数据了。 Selenium 与BeautifulSoup和Scrapy相比,Selenium是一个不同的工具。 Selenium 并不是为网络爬取而生的。它实际上是为网络测试而开发的。Selenium被用于网络应用程序的自动化测试。 它使网络浏览器自动化,你可以用它来代表你在浏览器环境中进行操作。然而,它后来也被纳入了网络爬取的范畴。Selenium可以发送网络请求,还带有一个分析器。通过Selenium,你可以从HTML文档中提取数据,就像你使用Javascript DOM API那样。 Selenium的主要优势在于它能加载Javascript,并能帮助你访问JavaScript背后的数据,而不一定要自己经历发送额外请求的痛苦。这使得Selenium不仅对自己有用,而且对其他工具也有用。 使用Scrapy或BeautifulSoup 的网络爬虫如果需要只有在加载Javascript文件时才能获得的数据,就会使用Selenium。 Selenium 会启动一个浏览器,同时在这个浏览器中进行操作的模拟。 同时 Selenium 还具有 HTML 的 DOM 分析能力,通过选择器,你可以选择需要的数据。 Scrapy Scrapy是一个网络抓取框架,它配备了大量的工具,使网络抓取和爬取变得简单。它在设计上是多线程的,并建立在Twisted之上。Twisted是一个异步网络框架,遵循对服务器的非阻塞I/O调用。因为它是多线程和非阻塞的,所以它在性能方面实际上是最好的,实际上是3个工具中最快的。Scrapy比这三个工具的一个优势是,它带有发送请求和解析响应的模块。 Scrapy 是开发复杂的网络抓取和爬虫工具,因为你可以创建大量的工作者,而且每个工作者都能毫不费力地工作。它的建立是为了消耗更少的内存,并将CPU资源的使用降到最低。事实上,一些基准测试表明,Scrapy在抓取方面比其他工具快20倍。它是可移植的,而且其功能可以扩展。 与Scrapy相关的主要问题是,它不是一个以初学者为中心的工具。 Scrapy 的文档比较难读,学习曲线也比较陡峭,我不认为这个工具比较适合初学者来使用。 Scrapy的一个主要缺点是它不能渲染 JavaScript;你必须发送 Ajax 请求来获取隐藏在JavaScript事件后面的数据。 这种情况对当前前后端分离的技术来说,还是有点麻烦的,我们必须要比较清楚的分析 AJAX 的数据请求。 BeautifulSoup 对应 Java 世界来说,Java 会有一个 JSoup。 一个针对 HTML 的 Dom 文件分析器和选择器,BeautifulSoup 在Python 中做了同样的工作。 通过让你对 HTML 界面中的内容进行分析和处理以便于能够从中获取数据。 比如说,如果界面中有表格,在表格中有数据,我们需要获取的就是表格中的数据的话,就可以使用 DOM 分析工具来进行分析。 总结 因最近我们在对爬虫的使用进行研究,对上面 3 个框架都有了一些探讨。 个人觉得比较简单的还是 Selenium,同时 Selenium 也足够强大,能够满足我们对一些小网站的爬虫分析。   https://www.isharkfly.com/t/python/14987

2023年09月20日 0Comments 441Browse 0Like Read more
Computer Science

Python 如何创建一个 JSON 对象

我们可以使用下面的代码来在 Python 中创建一个 JSON 对象。 import json data = {} data['key'] = 'value' json_data = json.dumps(data) 上面的代码中,首先导入的是 json 使用的包。 然后定义一个 data 数据类型。 在定义好 data 数据类型后,可以使用 data['key'] = 'value' 就可以设置数据到 data JSON 对象中。 然后,json.dumps() 将Python的字典数据转换成 JSON 字符,数据的最外面都添加一层""变为字符串,这也是数据的序列化步骤。     因为有时候,我们需要 Dump 成字符串以便于能够和其他系统进行通信。 https://www.isharkfly.com/t/python-json/14985

2023年09月19日 0Comments 627Browse 0Like Read more
Computer Science

Python 遍历 JSON 数据结构

有时候不得不说 Python的遍历还是非常简单的。 responseData = r.json() 这句话是把我们请求的 http 返回对象转换为 Json 对象。 我们的 Json List 在列表 (responseData['Data'] 中。 我们只需要使用:for policyList in json.loads(responseData['Data']):·   这句话就可以完成数据的遍历了。 https://www.isharkfly.com/t/pthon-json/14976

2023年09月19日 0Comments 406Browse 0Like Read more
Computer Science

Python 如何把 String 转换为 Json 对象

在我们对 JSON 进行处理的时候,大概率我们会需要把字符串转换为 JSON 对象后才能进行处理。 Python 贴心的使用 json.loads(employee_string) 就可以了。 首先需要做的就是导入 JSON 库。 #include json library import json 对现代程序员来说,JSON 数据结构基本上是非常常见的数据结构了,几乎所有语言都可以处理。 #include json library import json #json string data employee_string = '{"first_name": "Michael", "last_name": "Rodgers", "department": "Marketing"}' #check data type with type() method print(type(employee_string)) #convert string to object json_object = json.loads(employee_string) #check new data type print(type(json_object)) 上面的代码就可以直接让 Python 把字符串转换为 JSON 的对象了。   当我们完成转换后,就可以对 JSON 的对象进行相关操作了。   https://www.isharkfly.com/t/python-string-json/14977

2023年09月19日 0Comments 446Browse 0Like Read more
Computer Science

Python 如何for loop 循环

我们都知道,在 Java 的时候如果需要使用 for loop 循环,首先需要定义一个 i,然后进行循环。 比如说,我们要循环 1 到 501,Java 的代码为: for(int i=1; i<501; i++) Python 把这个循环进行简化了。 我们可以使用下面的代码来在 Python 中执行循环:for i in range(1, 501):   = 直接使用一个 range 函数。   start: 计数从 start 开始。默认是从 0 开始。例如range(5)等价于range(0, 5); stop: 计数到 stop 结束,但不包括 stop。例如:range(0, 5) 是[0, 1, 2, 3, 4]没有5   https://www.isharkfly.com/t/python-for-loop/14978

2023年09月19日 0Comments 625Browse 0Like Read more
Computer Science

Python 爬虫使用 Selenium 如何在 WebElement 获得属性

首先,我们需要初始化驱动和指定使用特定的流量器。   代码如下:   from selenium import webdriver wd = webdriver.Firefox() 上面的代码可以简单的理解为启动一个 Firefox 的实例。 使用 css 选择器 可以把程序读取的 HTML 理解为一个 Doc。 我们需要在 Doc 中选择我们的元素,这个叫做选择器,通常来说 HTML 很多不同的选择器。 elem = wd.find_element_by_css_selector('#my-id') 上面的代码是使用 css 的选择器。 获得属性 但我们使用选择器获得元素后,下一步就是我们需要获得属性了。 Python 的代码为: element.get_attribute('innerHTML') 这样我们就可以通过元素获得属性了。   https://www.isharkfly.com/t/python-selenium-webelement/14980

2023年09月19日 0Comments 517Browse 0Like Read more
Computer Science

Discourse 是否应该设置登录查看

如题,我在论坛里搜索,只查到更改类别的安全性,但这样只会使全部类别都不可见,并不是我需要的功能。 我的使用情景是: 未注册用户可以查看一部分帖子内容,隐藏部分的内容只能登录才能查看。或者注册用户,需回复帖子才能查看。 这是一个吸引注册的手段,也是防止大部分的伸手党。 类似于下面的情况。 这个需求在 Discuz 的时代非常容易实现,这有就是导致 DISCUZ 的论坛到处需要注册的原因。 其实我们也有这种需求,但是感觉这种需求也不是非常必要。 我们觉得这个和不同的社区类型有很大的关系,如果你的社区属于开放性的,其实这样感觉意义不大。 比如说类似出国留学的一亩三分地,所有的内容注册都不行,还要花钱,感觉是非常烦躁,并且把用户的信息内容据为己有,从上商业上来说可行,但也许不是非常好。 插件方式 根据官方论坛中针对这个问题的讨论:如何实现登录查看内容的功能,为了更好的吸引用户注册 - support - Discourse Meta 这个插件已经废弃掉了,不再使用了。 所以我们这里也不进行测试安装了。     使用组件 如果您还是想使用这个功能的话,您还可以使用下面这个组件。 组件的官方地址为:Gated Topics in Category - theme-component - Discourse Meta 组件的安装非常简单,通过 Git 代码的方式进行安装。     安装后的效果情况。 需要针对使用的主题,应用这个插件。     安装插件后运行的结果如下:     通过运行上面的插件,能够让用户登录后进行查看内容。 总结 根据我们网站的使用情况了解,针对一个特定的网站,主题的查看数量是非常重要的一个参数。 如果一个主题的阅读数量每次发布一定时间类超过几百,通常这个社区还是有比较大的吸引力的,至于用户是否在社区中注册,我们认为并不能阻止用户的的访问。 另外,因为我们多是计算机技术和旅游类的内容,这些内容专业性比较强,需要吸引更多的用户参与。 所以,我们网站觉得这个功能并不是非常有意义,同时还会降低搜索引擎的索引内容。 https://www.isharkfly.com/t/discourse/14983?preview_theme_id=11

2023年09月19日 0Comments 544Browse 0Like Read more
Computer Science

Discourse API 提交的 ID 是哪个 ID

如下图,我们通过 API 提交了一个 Post 请求。 上面有返回数据。 在返回数据中几个 ID,上图返回的第一个 Id 实际上是 POST ID,在 POST 上面还对应了一个 Topic ID。     这个 2 个 ID,在我们使用 Discourse 进行数据处理的时候通常需要上面 2 个 ID。   https://www.isharkfly.com/t/discourse-api-id-id/14975

2023年09月19日 0Comments 495Browse 0Like Read more
1…6970717273…303
Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (518)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1