分享成果,随喜正能量】人的一生,肯定会遭遇各种挫折与挑战,莫大的压力会让你喘不过气。可是,只有真正懂得适时弯腰的人才能得以克服危机,赢得胜利。这不是懦弱,也不是没骨气,而是一种大智慧。强干、蛮干,只会带来不可必要的损失。
《VBA信息获取与处理》教程是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,八十四讲。今日的内容是专题六“VBA中利用XMLHTTP完成网抓数据”的第3讲:VBA网抓数据结果的链接
在上一讲中我们实现了利用XMLHTTP的方法抓取了搜索关键词的数据,但是我们在网络查询的时候,往往不仅需要总的数据支持,还需要一些具体的数据,比如:查找到了哪些网址,标题是什么?如果我需要进一步的查看往往要需要打开的链接。这种数据如何抓取呢?这讲我就来实现这个问题。
实现的场景:如下图当我们点击右侧的按钮“利用VBA提取搜索关键词的数据,并给出下载的链接”时能够在下面的数据区域给出查询到的结果。
其实,这种处理也是工作中经常遇到的,可以对于我们浏览的网页进行适当的保存,在需要的时候再详细的查询。特别是把这些数据保存在EXCEL表格中,更让管理条理清晰。那么如何实现这个场景呢?我们仍是利用XMLHTTP来完成我们的工作。
我们先模拟一下直接在网页上查询数据,当我们输入一个数据点击回车的时候,服务器会反馈回数据在我们的浏览器上,我们需要对网页的源代码进行分析,
上面的截图就是我录入“VBA语言专家”点击回车后的在后台看到的源代码,你会发现,所有我们要写入EXCEL表格的信息都出现在了这里。
其中“标题”可以用innerText属性来获得,链接可以用href的属性来获得,真的非常容易,下面我们就要实现把多页查询的结果填到excel表格中,这个时候我们利用发送给服务器时要求头部检查一下查询的时间即可如下代码:.setRequestHeader "If-Modified-Since", "0"
这样就可以实现我们的要求了。
下面我们把上面的思路转换为代码,如下所示:
Sub myNZA() '利用VBA提取搜索关键词的数据,并给出下载的链接
【具体见教程】
End Sub
代码截图:
代码讲解:
1) Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
Set objDOM = CreateObject("htmlfile")
上述代码建立了两个引用,一个是XMLHTTP ,一个是htmlfile ,之后将利用这两个引用完成我们的工作。
2)UU = Range("B1").Value 这是我们要查询的关键数据
3)For i = 0 To 50 Step 10 '五页 这是要查询5次利用i作为查询的页码
4) strURL = "https://www.baidu.com/s?"
strURL = strURL & "wd=" & UU
strURL = strURL & "&pn=" & i
上述代码是完成了我们要查询的请求URL。
5) .Open "GET", strURL, False 使用OPEN 方法
6) .setRequestHeader "If-Modified-Since", "0" 请求头部把浏览器端缓存页面的最后修改时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行比较,以保障我们每次请求到的数据是没有重复的。
7) .send 注意请求头部的提交要在此命令之前完成
8)objDOM.body.innerHTML = .responseText '将.responseText内容写入新objDOM对象的body
9) For Each objTitle In objDOM.getElementsByTagName("h3") 在每个H3标签即标题进行遍历操作。注意<h1> 到 <h6>是标签标题。<h1> 定义最大的标题。<h6> 定义最小的标题。
10)With objTitle.getElementsByTagName("a")(0) 对于每个属性名称为为“a”的元素
11)Cells(k, 2) = .innerText
Cells(k, 3) = .href
提取标签之间的纯文本信息和链接
12)Set objXMLHTTP = Nothing
Set objDOM = Nothing
Set objTitle = Nothing
回收内存。
我们先来看看当我们点击运行按钮后的实现效果:
此时我们任意点击一个单元格的链接,就会转跳到下面的页面:
从而实现了我们最初的课题要求。
本节知识点回向:如何利用XMLHTTP反馈网页中的关键词的搜索结果和网页的链接?
本讲参考程序文件:006工作表.XLSM
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序:
ebSight是由Hugging Face机构开发的一个网页截图转换为HTML代码的合成数据集。该数据集包含200万对HTML代码及其对应的截图,是开源社区中首次尝试将网页截图转换为可用HTML代码的重要资源。在构建过程中,研究人员首先使用一个小型语言模型来生成多样化的网站主题和设计,然后把这些网站主题和设计输入到一个代码大模型中生成最终的HTML代码,最后采用Playwright工具来可视化并捕获生成的HTML代码的输出。该数据集可用于训练视觉语言模型,使其能够基于网页截图生成对应的HTML代码,这对于无代码开发和提高UI开发效率具有重要意义。
详情请参见五号雷达:https://www.5radar.com/result?key=WebSight
文共1589字,预计学习时长10分钟
图源:unsplash
有人说,数据会取代石油的地位,成为未来最珍稀的资源之一。无论这个命题是否成立,毫无疑问,数据或信息(任意形式)已然成为21世纪最宝贵的无形资产之一。
数据极其强大,用途颇广:可以预测销售的未来趋势以获利,可以在医疗保健行业中用于诊断早期结核病,从而挽救患者的生命……而数据科学家要做的是,如何从各种资源中提取有价值的数据。
本文将帮助你掌握这个数据时代的必备技能——如何使用python中的库从网站提取数据。笔者将演示从inshorts网站提取与板球、羽毛球和网球等不同运动有关的新闻报道。
步骤1:导入相关库
import requests
from bs4 importBeautifulSoup
import pandas as pd
步骤2:发出Web请求并使用BeautifulSoup进行解析
先要查看特定新闻类别的源代码。进入网页后将看到不同种类的新闻,关注某一特定的新闻,使用Beautiful Soup提取源代码。在右侧可以看到新闻文章及相应的源代码。
图源:unsplash
使用请求库,并在URL上使用.get()从网页访问HTML脚本。然后,使用beautiful soup库在python中解析此HTML语言。根据要提取的信息类型,可以使用.find()函数从不同的html标签(例如<div>,<span>)中过滤该信息。
dummy_url="https://inshorts.com/en/read/badminton" data_dummy=requests.get(dummy_url)
soup=BeautifulSoup(data_dummy.content,'html.parser')
soup
完成上述步骤并解析HTML语言后,此特定新闻的部分解析如下所示:
我们看到该文章的标题位于-<div class =“ news-card-title news-right-box”>类别下,进一步可以看到标题位于<span>标记中,并且属性为“ itemprop”和“ headline”,可以使用.find()函数进行访问。
news1=soup.find_all('div',class_=["news-card-title news-right-box"])[0]
title=news1.find('span',attrs={'itemprop':"headline"}).string
print(title)
We get the following outputgiven below-
Shuttler Jayaram wins Dutch OpenGrand Prix
同样,如果要访问新闻内容,则将该新闻设置为<div class =“ news-card-contentnews-right-box”>类别。我们还可以看到新闻的正文位于<div>标记中,该标记的属性为“ itemprop”和“ articleBody”,可以使用.find()函数进行访问。
news1=soup.find_all('div',class_=["news-card-content news-right-box"])[0]
content=news1.find('div',attrs={'itemprop':"articleBody"}).string
print(content)
Indian Shuttler Ajay Jayaramclinched $50k Dutch Open Grand Prix at Almere in Netherlands on Sunday,becoming the first Indian to win badminton Grand Prix tournament under a newscoring system. Jayaram defeated Indonesia's Ihsan Maulana Mustofa 10-11, 11-6,11-7, 1-11, 11-9 in an exciting final clash. The 27-year-old returned to thecircuit in August after a seven-month injury layoff.
以类似的方式,我们可以提取图像、作者姓名、时间等任何信息。
步骤3:建立资料集
接下来,我们对3种新闻类别实施此操作,然后将所有文章相应的内容和类别存储在数据框中。笔者将使用三个不同的Urls,对每个URL实施相同的步骤,并将所有文章及其内容设置类别存储为列表形式。
urls=["https://inshorts.com/en/read/cricket","https://inshorts.com/en/read/tennis",
"https://inshorts.com/en/read/badminton"]
news_data_content,news_data_title,news_data_category=[],[],[]
for url in urls:
category=url.split('/')[-1]
data=requests.get(url)
soup=BeautifulSoup(data.content,'html.parser')
news_title=[]
news_content=[]
news_category=[]
for headline,article inzip(soup.find_all('div', class_=["news-card-titlenews-right-box"]),
soup.find_all('div',class_=["news-card-contentnews-right-box"])):
news_title.append(headline.find('span',attrs={'itemprop':"headline"}).string)
news_content.append(article.find('div',attrs={'itemprop':"articleBody"}).string)
news_category.append(category)
news_data_title.extend(news_title)
news_data_content.extend(news_content)
news_data_category.extend(news_category)
df1=pd.DataFrame(news_data_title,columns=["Title"])
df2=pd.DataFrame(news_data_content,columns=["Content"])
df3=pd.DataFrame(news_data_category,columns=["Category"])
df=pd.concat([df1,df2,df3],axis=1)
df.sample(10)
输出为:
你可以看到,使用beautiful soup 库在python中抓取网页信息是多么容易,你可以轻松地为任何数据科学项目收集有用数据。从此之后自备“慧眼”,在网页中飞速提取有价值的信息。
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范
*请认真填写需求信息,我们会在24小时内与您取得联系。