文章
· 一月 19, 2023 阅读大约需 6 分钟

介绍使用嵌入式 Python 进行 Web 抓取

什么是网页抓取:

简单来说,网络抓取网络收获网络数据提取是从网站收集大数据(非结构化)的自动化过程。用户可以根据需要提取特定站点上的所有数据或特定数据。收集的数据可以以结构化格式存储以供进一步分析。

什么是网页抓取? — 詹姆斯·勒

网页抓取涉及的步骤:

  1. 找到您要抓取的网页的 URL
  2. 通过检查选择特定元素
  3. 编写代码获取被选元素的内容
  4. 以需要的格式存储数据

就这么简单!

用于网络抓取的流行库/工具是:

  • Selenium – 用于测试 Web 应用程序的框架
  • BeautifulSoup – 用于从 HTML、XML 和其他标记语言中获取数据的 Python 库
  • Pandas – 用于数据操作和分析的 Python 库


什么是Beautiful Soup?

Beautiful Soup 是一个纯 Python 库,用于从网站中提取结构化数据。它允许您解析来自 HTML 和 XML 文件的数据。它充当辅助模块,并以与使用其他可用开发人员工具以网页交互的方式与 HTML 交互。

  • 它通常可以为程序员节省数小时或数天的工作时间,因为它可以与您最喜欢的解析器(如 lxml 和 html5lib)一起使用,以提供 Python organic方式来导航、搜索、并修改解析树。
  • beautiful soup 的另一个强大而有用的功能是它可以智能地将正在获取的文档转换为 Unicode 并将传出文档转换为 UTF-8。作为一名开发人员,您不必关心这一点,除非文档内在未指定编码或 Beautiful Soup 无法检测到编码。
  • 与其他一般解析或抓取技术相比,它也被认为更快

 

在今天的文章中,我们将使用带有对象脚本的嵌入式 Python 来抓取 ae.indeed.com 上的 Python 职位空缺和公司


第 1 步 -找到您要抓取的网页的 URL。

url = https://ae.indeed.com/jobs?q=python&l=Dubai&start=0

我们要从中抓取数据的网页看起来像这样

为了简单和学习目的,我们将提取“职位”和“公司”,输出将类似于下面的屏幕截图。

 

 

我们将使用两个 python 库。

  • requests :Requests 是 Python 编程语言的 HTTP 库。该项目的目标是使 HTTP 请求更简单、更人性化。  
  • bs4 for BeautifulSoup :BeautifulSoup 是一个用于解析 HTML 和 XML 文档的 Python 包。它为已解析的页面创建一个解析树,可用于从 HTML 中提取数据,这对于网络抓取很有用。

让我们安装这个 python 包 (windows)

 irispip install --target C:\InterSystems\IRISHealth\mgr\python bs4 irispip install --target C:\InterSystems\IRISHealth\mgr\python requests

让我们将 python 库导入到 ObjectScript

 Class PythonTesting.WebScraper Extends %Persistent { // pUrl = https://ae.indeed.com/jobs?q=python&l=Dubai&start= // pPage = 0 ClassMethod ScrapeWebPage(pUrl, pPage) { // imports the requests python library set requests = ##class ( %SYS.Python ).Import( "requests" ) // import the bs4 python library set soup = ##class ( %SYS.Python ).Import( "bs4" ) // import builtins package which contains all of the built-in identifiers set builtins = ##class ( %SYS.Python ).Import( "builtins" ) }

让我们使用请求收集 html 数据;

注意:我们从谷歌搜索“my user agent”中获取的用户代理
url为“https://ae.indeed.com/jobs?q=python&l=Dubai&start=”,pPage为页码

我们将使用 requests 对 URL 执行 http get 请求并将响应存储在“req”

 set headers = { "User-Agent" : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36" } set url = "https://ae.indeed.com/jobs?q=python&l=Dubai&start=" _pPage set req = requests.get(url, "headers=" _headers)

req 对象将具有从网页返回的 html。

让我们通过 BeautifulSoup html 解析器运行它,以便我们可以提取作业数据。

 set soupData = soup.BeautifulSoup(req.content, "html.parser" ) set title = soupData.title.text W !,title

标题看起来如下

 


第二步:通过检查选择需要的元素。

在这种情况下,我们对通常位于 <div> 标记中的作业列表感兴趣,在您的浏览器中,您可以检查该元素以找到 div 类。


在我们的例子中,所需的信息存储在 <div class="cardOutline tapItem   ... </div>


第三步:编写获取选中元素内容的代码

我们将使用 BeautifulSoup 上的 find_all 功能来查找所有包含类名“cardOutline”的 <div> 标签

//parameters to python would be sent as a python dictionary set divClass = { "class" : "cardOutline" } set divsArr = soupData. "find_all" ( "div" ,divClass...)

这将返回一个列表,我们可以遍历该列表并提取职位和公司



第 4 步:以所需格式存储/显示数据。

在下面的示例中,我们将数据写入终端。

 set len = builtins.len(divsArr) W !, "Job Title" , $C ( 9 )_ " --- " _ $C ( 9 ), "Company" for i = 1 : 1 :len { Set item = divsArr. "__getitem__" (i - 1 ) set title = $ZSTRIP (item.find( "a" ).text, "<>W" ) set companyClass = { "class_" : "companyName" } set company = $ZSTRIP (item.find( "span" , companyClass...).text, "<>W" ) W !,title, $C ( 9 ), " --- " , $C ( 9 ),company }

请注意,我们正在使用 builtins.len() 来获取 divsArr 列表的长度

标识符名称:
命名标识符的规则在 ObjectScript 和 Python 之间是不同的。例如,Python 方法名中允许使用下划线 (_),实际上广泛用于所谓的“dunder”方法和属性(“dunder”是“双下划线”的缩写),例如 __getitem__ 或 __class__ .要从 ObjectScript 使用此类标识符,请将它们括在双引号中:

关于标识符名称的系统间文档

 

类方法示例

 
类方法 ScrapeWebPage(pUrl, pPage)

下一步..

使用对象脚本和嵌入式 python 以及几行代码;我们可以很容易地从我们最喜欢的工作网站上抓取数据,收集工作名称、公司、薪水、工作描述和电子邮件/链接。
例如,如果您有多个页面,您可以使用页面轻松遍历它们
可以将此数据添加到 pandas 数据框并删除重复项,可以根据您感兴趣的特定关键字应用过滤器。
通过 numpy 运行此数据,并获得一些线图
或者对数据执行 One-Hot 编码,并创建/训练您的 ML 模型,如果有您感兴趣的特定职位空缺,请向自己发送通知。 😉

快乐编码!

别忘了按赞按钮😃

讨论 (0)1
登录或注册以继续