Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
分享成果,隨喜正能量】人的一生,肯定會遭遇各種挫折與挑戰,莫大的壓力會讓你喘不過氣??墒?,只有真正懂得適時彎腰的人才能得以克服危機,贏得勝利。這不是懦弱,也不是沒骨氣,而是一種大智慧。強干、蠻干,只會帶來不可必要的損失。
《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小時內與您取得聯系。