文章采集調用
文章采集調用(【Python學(xué)習福利】豆瓣電影中如何多網(wǎng)頁(yè)請求?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 195 次瀏覽 ? 2021-10-10 04:00
點(diǎn)擊上方“IT共享屋”關(guān)注
回復“資料”領(lǐng)取Python學(xué)習福利
【一、項目背景】
豆瓣影業(yè)提供最新的電影介紹和影評,包括正在放映的電影的視頻查詢(xún)和購票服務(wù)。順便可以錄下想看的電影和電視劇,看,看,還可以寫(xiě)影評。它極大地方便了人們的生活。
今天以電視?。绖。槔?,批量抓取對應的電影,寫(xiě)入csv文件。用戶(hù)可以通過(guò)評分更好地選擇自己想要的電影。
【二、項目目標】
獲取對應的電影名稱(chēng)、評分、詳情鏈接,下載電影圖片,保存文件。
[三、 涉及的圖書(shū)館和 網(wǎng)站]
1、 網(wǎng)址如下:
https://movie.douban.com/j/sea ... rt%3D{}
2、 涉及的庫:requests、fake_useragent、json、csv
3、軟件:PyCharm
【四、項目分析】
1、如何請求多個(gè)頁(yè)面?
當您單擊下一頁(yè)時(shí),每增加一頁(yè),paged 將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
2. 如何獲取實(shí)際請求的地址?
在請求數據時(shí),發(fā)現頁(yè)面上沒(méi)有對應的數據。其實(shí)豆瓣是通過(guò)javascript動(dòng)態(tài)加載內容來(lái)防止采集的。
1)F12 右擊查看,在左側菜單中找到Network,和name,找到第五個(gè)數據,點(diǎn)擊Preview。
2) 點(diǎn)擊subjects,可以看到title是對應電影的名字。率是相應的分數。通過(guò)js解析subjects字典,找到需要的字段。
3. 如何訪(fǎng)問(wèn)網(wǎng)頁(yè)?
https://movie.douban.com/j/sea ... t%3D0
https://movie.douban.com/j/sea ... %3D20
https://movie.douban.com/j/sea ... %3D40
https://movie.douban.com/j/sea ... %3D60
單擊下一頁(yè)時(shí),每增加一頁(yè),該頁(yè)將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
【五、項目實(shí)施】
1、 我們定義一個(gè)類(lèi)繼承對象,然后定義init方法繼承self,再定義一個(gè)main函數main繼承self。導入所需的庫和請求 URL。
import requests,json
from fake_useragent import UserAgent
import csv
class Doban(object):
def __init__(self):
self.url = "https://movie.douban.com/j/sea ... rt%3D{}"
def main(self):
pass
if __name__ == '__main__':
Siper = Doban()
Siper.main()
2、 隨機生成UserAgent,構造請求頭,防止反爬。
for i in range(1, 50):
self.headers = {
'User-Agent': ua.random,
}
3、發(fā)送請求,獲取響應,頁(yè)面回調,方便下次請求。
def get_page(self, url):
res = requests.get(url=url, headers=self.headers)
html = res.content.decode("utf-8")
return html
4、json 解析頁(yè)面數據,獲取對應的字典。
data = json.loads(html)['subjects']
# print(data[0])
5、進(jìn)行遍歷,獲取對應的電影名,評分,鏈接到下一個(gè)詳情頁(yè)。
print(name, goblin_herf)
html2 = self.get_page(goblin_herf) # 第二個(gè)發(fā)生請求
parse_html2 = etree.HTML(html2)
r = parse_html2.xpath('//div[@class="entry"]/p/text()')
6、創(chuàng )建一個(gè)用于寫(xiě)入的csv文件,定義相應的header內容,并保存數據。
# 創(chuàng )建csv文件進(jìn)行寫(xiě)入
csv_file = open('scr.csv', 'a', encoding='gbk')
csv_writer = csv.writer(csv_file)
# 寫(xiě)入csv標題頭內容
csv_writerr.writerow(['電影', '評分', "詳情頁(yè)"])
#寫(xiě)入數據
csv_writer.writerow([id, rate, urll])
7、一個(gè)請求的圖片地址。定義圖片的名稱(chēng)并保存文檔。
html2 = requests.get(url=urll, headers=self.headers).content
dirname = "./圖/" + id + ".jpg"
with open(dirname, 'wb') as f:
f.write(html2)
print("%s 【下載成功?。。?!】" % id)
8、 調用方法來(lái)實(shí)現功能。
html = self.get_page(url)
self.parse_page(html)
9、項目?jì)?yōu)化:1)設置延時(shí)。
time.sleep(1.4)
2) 定義一個(gè)變量u,用于遍歷,表示爬取的是哪個(gè)頁(yè)面。(更清晰,更令人印象深刻)。
u = 0
self.u += 1;
【六、效果展示】
1、 點(diǎn)擊綠色三角進(jìn)入起始頁(yè)和結束頁(yè)(從第0頁(yè)開(kāi)始)。
2、 在控制臺顯示下載成功信息。
3、保存 csv 文件。
4、電影圖片顯示。
[七、總結]
1、 不建議抓取太多數據,可能造成服務(wù)器負載,簡(jiǎn)單試一下。
2、本文章針對Python爬取豆瓣應用中的難點(diǎn)和關(guān)鍵點(diǎn),以及如何防止反爬,做了一個(gè)相對的解決方案。
3、希望這個(gè)項目能幫助大家了解json解析頁(yè)面的基本流程,如何拼接字符串,如何使用format函數。
4、 本文基于Python網(wǎng)絡(luò )爬蟲(chóng),利用爬蟲(chóng)庫實(shí)現豆瓣電影及其圖片的獲取。說(shuō)到實(shí)現,總會(huì )有各種各樣的問(wèn)題。不要看最好的,努力去更深入地理解。
5、 需要本文源碼的請在下方公眾號后臺回復“豆瓣電影”獲取。
看完這篇文章你學(xué)會(huì )了嗎?請轉發(fā)并分享給更多人
IT共享之家 查看全部
文章采集調用(【Python學(xué)習福利】豆瓣電影中如何多網(wǎng)頁(yè)請求?)
點(diǎn)擊上方“IT共享屋”關(guān)注
回復“資料”領(lǐng)取Python學(xué)習福利
【一、項目背景】
豆瓣影業(yè)提供最新的電影介紹和影評,包括正在放映的電影的視頻查詢(xún)和購票服務(wù)。順便可以錄下想看的電影和電視劇,看,看,還可以寫(xiě)影評。它極大地方便了人們的生活。
今天以電視?。绖。槔?,批量抓取對應的電影,寫(xiě)入csv文件。用戶(hù)可以通過(guò)評分更好地選擇自己想要的電影。
【二、項目目標】
獲取對應的電影名稱(chēng)、評分、詳情鏈接,下載電影圖片,保存文件。
[三、 涉及的圖書(shū)館和 網(wǎng)站]
1、 網(wǎng)址如下:
https://movie.douban.com/j/sea ... rt%3D{}
2、 涉及的庫:requests、fake_useragent、json、csv
3、軟件:PyCharm
【四、項目分析】
1、如何請求多個(gè)頁(yè)面?
當您單擊下一頁(yè)時(shí),每增加一頁(yè),paged 將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
2. 如何獲取實(shí)際請求的地址?
在請求數據時(shí),發(fā)現頁(yè)面上沒(méi)有對應的數據。其實(shí)豆瓣是通過(guò)javascript動(dòng)態(tài)加載內容來(lái)防止采集的。
1)F12 右擊查看,在左側菜單中找到Network,和name,找到第五個(gè)數據,點(diǎn)擊Preview。
2) 點(diǎn)擊subjects,可以看到title是對應電影的名字。率是相應的分數。通過(guò)js解析subjects字典,找到需要的字段。
3. 如何訪(fǎng)問(wèn)網(wǎng)頁(yè)?
https://movie.douban.com/j/sea ... t%3D0
https://movie.douban.com/j/sea ... %3D20
https://movie.douban.com/j/sea ... %3D40
https://movie.douban.com/j/sea ... %3D60
單擊下一頁(yè)時(shí),每增加一頁(yè),該頁(yè)將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
【五、項目實(shí)施】
1、 我們定義一個(gè)類(lèi)繼承對象,然后定義init方法繼承self,再定義一個(gè)main函數main繼承self。導入所需的庫和請求 URL。
import requests,json
from fake_useragent import UserAgent
import csv
class Doban(object):
def __init__(self):
self.url = "https://movie.douban.com/j/sea ... rt%3D{}"
def main(self):
pass
if __name__ == '__main__':
Siper = Doban()
Siper.main()
2、 隨機生成UserAgent,構造請求頭,防止反爬。
for i in range(1, 50):
self.headers = {
'User-Agent': ua.random,
}
3、發(fā)送請求,獲取響應,頁(yè)面回調,方便下次請求。
def get_page(self, url):
res = requests.get(url=url, headers=self.headers)
html = res.content.decode("utf-8")
return html
4、json 解析頁(yè)面數據,獲取對應的字典。
data = json.loads(html)['subjects']
# print(data[0])
5、進(jìn)行遍歷,獲取對應的電影名,評分,鏈接到下一個(gè)詳情頁(yè)。
print(name, goblin_herf)
html2 = self.get_page(goblin_herf) # 第二個(gè)發(fā)生請求
parse_html2 = etree.HTML(html2)
r = parse_html2.xpath('//div[@class="entry"]/p/text()')
6、創(chuàng )建一個(gè)用于寫(xiě)入的csv文件,定義相應的header內容,并保存數據。
# 創(chuàng )建csv文件進(jìn)行寫(xiě)入
csv_file = open('scr.csv', 'a', encoding='gbk')
csv_writer = csv.writer(csv_file)
# 寫(xiě)入csv標題頭內容
csv_writerr.writerow(['電影', '評分', "詳情頁(yè)"])
#寫(xiě)入數據
csv_writer.writerow([id, rate, urll])
7、一個(gè)請求的圖片地址。定義圖片的名稱(chēng)并保存文檔。
html2 = requests.get(url=urll, headers=self.headers).content
dirname = "./圖/" + id + ".jpg"
with open(dirname, 'wb') as f:
f.write(html2)
print("%s 【下載成功?。。?!】" % id)
8、 調用方法來(lái)實(shí)現功能。
html = self.get_page(url)
self.parse_page(html)
9、項目?jì)?yōu)化:1)設置延時(shí)。
time.sleep(1.4)
2) 定義一個(gè)變量u,用于遍歷,表示爬取的是哪個(gè)頁(yè)面。(更清晰,更令人印象深刻)。
u = 0
self.u += 1;
【六、效果展示】
1、 點(diǎn)擊綠色三角進(jìn)入起始頁(yè)和結束頁(yè)(從第0頁(yè)開(kāi)始)。
2、 在控制臺顯示下載成功信息。
3、保存 csv 文件。
4、電影圖片顯示。
[七、總結]
1、 不建議抓取太多數據,可能造成服務(wù)器負載,簡(jiǎn)單試一下。
2、本文章針對Python爬取豆瓣應用中的難點(diǎn)和關(guān)鍵點(diǎn),以及如何防止反爬,做了一個(gè)相對的解決方案。
3、希望這個(gè)項目能幫助大家了解json解析頁(yè)面的基本流程,如何拼接字符串,如何使用format函數。
4、 本文基于Python網(wǎng)絡(luò )爬蟲(chóng),利用爬蟲(chóng)庫實(shí)現豆瓣電影及其圖片的獲取。說(shuō)到實(shí)現,總會(huì )有各種各樣的問(wèn)題。不要看最好的,努力去更深入地理解。
5、 需要本文源碼的請在下方公眾號后臺回復“豆瓣電影”獲取。
看完這篇文章你學(xué)會(huì )了嗎?請轉發(fā)并分享給更多人
IT共享之家
文章采集調用(調用鏈系列(2):服務(wù)端信息收集以及服務(wù)間上下文傳遞)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 184 次瀏覽 ? 2021-10-10 03:36
一、前言
調用鏈系列(1):UAVStack中貪吃蛇的解讀
上一篇文章分享了調用鏈的模型設計和模型時(shí)序圖。相信大家通過(guò)上一篇文章對調用鏈有了一個(gè)整體的了解,比如:調用鏈是什么,能做什么,整體的實(shí)現策略。
在這個(gè)文章中,我們繼續介紹調用鏈的服務(wù)端信息采集和服務(wù)間的上下文傳遞。
二、服務(wù)器信息采集
服務(wù)器端信息采集的整體流程如下圖所示。通過(guò)在應用容器(tomcat等)的啟動(dòng)過(guò)程中植入切入點(diǎn),可以在應用邏輯執行前后對請求進(jìn)行劫持。
三、切點(diǎn)植入
在介紹切入點(diǎn)之前,我們應該對servlet容器(本文以tomcat為例)處理請求的大致流程有一個(gè)全面的了解。
圖片來(lái)自網(wǎng)絡(luò )
Connector接收到一個(gè)連接并轉換成請求(Request)后,會(huì )將請求傳遞給Engine的管道(Pipeline)的閥門(mén)(ValveA)。該請求將被傳遞到引擎管道中的引擎閥門(mén)。然后請求將從 Engine Valve 傳遞到 Host 管道,并在管道中傳遞到 Host Valve 閥門(mén)。然后從Host Valve傳遞給一個(gè)Context管道,再傳遞給管道中的Context Valve。接下來(lái),請求將被傳遞到收錄在 Wrapper C 中的管道中的 Wrapper Valve,在那里它會(huì )通過(guò)一個(gè)過(guò)濾器鏈,最后發(fā)送到一個(gè) Servlet。借助tomcat的這種架構設計,我們可以通過(guò)在tomcat處理請求的生命周期中植入自己的邏輯來(lái)增強tomcat的對外能力,即:
除了巧妙地利用了tomcat容器的架構設計,中間件增強技術(shù)還使用了java Instrumentation(它為我們提供了第一次加載對象時(shí)動(dòng)態(tài)修改字節碼的能力。由于篇幅原因,不做詳細解釋?zhuān)幻靼椎目梢宰孕胁殚嗁Y料)。在 UAV 中,通過(guò) UAVServer 對外提供各種切點(diǎn)能力。
借助中間件增強技術(shù),在應用邏輯執行前后都有切點(diǎn),下一步就是在這些切點(diǎn)上執行我們自己的調用鏈邏輯。
四、調用鏈中間件增強技術(shù)的使用
上面介紹的中間件增強技術(shù)是一個(gè)框架,通過(guò)使用javaagent在tomcat代碼中動(dòng)態(tài)植入切入點(diǎn)代碼,并以UAVServer的形式對外提供能力(具體能力后面會(huì )詳細介紹文章)。輕量級調用鏈實(shí)現使用了 UAVServer 提供的 GlobalFilterHandler 能力。
GlobalFilterHandler:這里的GlobalFilterHandler是中間件增強技術(shù)中的一種能力,與傳統過(guò)濾器無(wú)關(guān)。它提供了四種外部功能:
調用鏈借助 GlobalFilterHandler 提供的前兩個(gè)能力,實(shí)現了應用處理請求前后執行調用鏈邏輯的功能。
五、輕量級調用鏈實(shí)現
具體的UML圖如下:
從UML圖中可以清楚地看出InvokeChainSupporter(調用鏈實(shí)現邏輯入口和調用鏈所需的資源初始化實(shí)現類(lèi))對中間件增強技術(shù)進(jìn)行了第二次增強。它允許用戶(hù)在其中注冊不同的處理程序,并在處理程序的 preCap 和 doCap(中間件增強技術(shù)中的邏輯執行前后的切入點(diǎn)術(shù)語(yǔ))方法之前和之后將適配器動(dòng)態(tài)編織到適配器中,以便能夠執行更多定制化適配和個(gè)性化邏輯。所有的支持者和適配器都采用反射調用方式,最大限度地減少了對中間件增強技術(shù)的依賴(lài)。
有了二次增強技術(shù),我們就可以開(kāi)始下面的調用鏈繪制工作了。
輕量級調用鏈繪制實(shí)現主要依賴(lài)于注冊在 InvokeChainSupporter 上的 ServiceSpanInvokeChainHandler。主要繪制過(guò)程如下:
我們來(lái)看看每一步都做了什么。
5.1 分析請求信息
對于像tomcat這樣的中間件容器,所有進(jìn)入tomcat的請求都會(huì )被封裝成HttpServletRequest和HttpServletResponse(以下簡(jiǎn)稱(chēng)請求和響應),最后進(jìn)入用戶(hù)的servlet。借助中間件增強技術(shù),調用鏈會(huì )在處理用戶(hù)邏輯之前攔截一次請求和響應,并分析其中是否收錄調用鏈信息。如果是,則將調用鏈信息封裝到上下文中。
5.2 邏輯導流
由于不同協(xié)議對應的調用鏈的繪制邏輯也不同,這里會(huì )根據協(xié)議類(lèi)型分配一次調用鏈。
5.3 初始化調用鏈上下文
分析調用鏈上下文中的信息:
Main span:服務(wù)中可能有多個(gè)客戶(hù)端通信或服務(wù)間通信,需要一個(gè)主span來(lái)記錄當前服務(wù)中調用鏈最后一個(gè)節點(diǎn)的信息。
5.4 調用鏈信息輸出
用戶(hù)邏輯處理結束后,調用鏈記錄器會(huì )從上下文中取出當前服務(wù)的調用鏈信息,輸出到指定的日志路徑。
5.5 服務(wù)間的上下文傳輸
不同協(xié)議調用鏈傳遞信息的方法也略有不同。具體的實(shí)現方式利用了中間件增強技術(shù)提供的另一個(gè)能力:AppFrkHook(簡(jiǎn)稱(chēng)hook,這個(gè)功能會(huì )在客戶(hù)端調用鏈實(shí)現的時(shí)候具體介紹)。它可以劫持用戶(hù)使用的客戶(hù)端技術(shù)。如果用戶(hù)使用httpclient進(jìn)行通信,則劫持httpclient并動(dòng)態(tài)編織代碼,從而達到在http通信過(guò)程中注入調用鏈上下文信息的效果。目標服務(wù)解析請求信息時(shí),解析調用鏈上下文;當調用鏈上下文邏輯被初始化時(shí),
六、總結
看完這篇文章,讀者應該對中間件增強技術(shù)的實(shí)現有了一個(gè)大致的了解,對其提供的GlobalFilterHandler能力也有了一定的了解。對于調用鏈,你應該了解繪制服務(wù)器和服務(wù)之間調用鏈的整個(gè)過(guò)程。 查看全部
文章采集調用(調用鏈系列(2):服務(wù)端信息收集以及服務(wù)間上下文傳遞)
一、前言
調用鏈系列(1):UAVStack中貪吃蛇的解讀
上一篇文章分享了調用鏈的模型設計和模型時(shí)序圖。相信大家通過(guò)上一篇文章對調用鏈有了一個(gè)整體的了解,比如:調用鏈是什么,能做什么,整體的實(shí)現策略。
在這個(gè)文章中,我們繼續介紹調用鏈的服務(wù)端信息采集和服務(wù)間的上下文傳遞。
二、服務(wù)器信息采集
服務(wù)器端信息采集的整體流程如下圖所示。通過(guò)在應用容器(tomcat等)的啟動(dòng)過(guò)程中植入切入點(diǎn),可以在應用邏輯執行前后對請求進(jìn)行劫持。

三、切點(diǎn)植入
在介紹切入點(diǎn)之前,我們應該對servlet容器(本文以tomcat為例)處理請求的大致流程有一個(gè)全面的了解。

圖片來(lái)自網(wǎng)絡(luò )
Connector接收到一個(gè)連接并轉換成請求(Request)后,會(huì )將請求傳遞給Engine的管道(Pipeline)的閥門(mén)(ValveA)。該請求將被傳遞到引擎管道中的引擎閥門(mén)。然后請求將從 Engine Valve 傳遞到 Host 管道,并在管道中傳遞到 Host Valve 閥門(mén)。然后從Host Valve傳遞給一個(gè)Context管道,再傳遞給管道中的Context Valve。接下來(lái),請求將被傳遞到收錄在 Wrapper C 中的管道中的 Wrapper Valve,在那里它會(huì )通過(guò)一個(gè)過(guò)濾器鏈,最后發(fā)送到一個(gè) Servlet。借助tomcat的這種架構設計,我們可以通過(guò)在tomcat處理請求的生命周期中植入自己的邏輯來(lái)增強tomcat的對外能力,即:
除了巧妙地利用了tomcat容器的架構設計,中間件增強技術(shù)還使用了java Instrumentation(它為我們提供了第一次加載對象時(shí)動(dòng)態(tài)修改字節碼的能力。由于篇幅原因,不做詳細解釋?zhuān)幻靼椎目梢宰孕胁殚嗁Y料)。在 UAV 中,通過(guò) UAVServer 對外提供各種切點(diǎn)能力。
借助中間件增強技術(shù),在應用邏輯執行前后都有切點(diǎn),下一步就是在這些切點(diǎn)上執行我們自己的調用鏈邏輯。
四、調用鏈中間件增強技術(shù)的使用
上面介紹的中間件增強技術(shù)是一個(gè)框架,通過(guò)使用javaagent在tomcat代碼中動(dòng)態(tài)植入切入點(diǎn)代碼,并以UAVServer的形式對外提供能力(具體能力后面會(huì )詳細介紹文章)。輕量級調用鏈實(shí)現使用了 UAVServer 提供的 GlobalFilterHandler 能力。
GlobalFilterHandler:這里的GlobalFilterHandler是中間件增強技術(shù)中的一種能力,與傳統過(guò)濾器無(wú)關(guān)。它提供了四種外部功能:
調用鏈借助 GlobalFilterHandler 提供的前兩個(gè)能力,實(shí)現了應用處理請求前后執行調用鏈邏輯的功能。
五、輕量級調用鏈實(shí)現
具體的UML圖如下:

從UML圖中可以清楚地看出InvokeChainSupporter(調用鏈實(shí)現邏輯入口和調用鏈所需的資源初始化實(shí)現類(lèi))對中間件增強技術(shù)進(jìn)行了第二次增強。它允許用戶(hù)在其中注冊不同的處理程序,并在處理程序的 preCap 和 doCap(中間件增強技術(shù)中的邏輯執行前后的切入點(diǎn)術(shù)語(yǔ))方法之前和之后將適配器動(dòng)態(tài)編織到適配器中,以便能夠執行更多定制化適配和個(gè)性化邏輯。所有的支持者和適配器都采用反射調用方式,最大限度地減少了對中間件增強技術(shù)的依賴(lài)。
有了二次增強技術(shù),我們就可以開(kāi)始下面的調用鏈繪制工作了。
輕量級調用鏈繪制實(shí)現主要依賴(lài)于注冊在 InvokeChainSupporter 上的 ServiceSpanInvokeChainHandler。主要繪制過(guò)程如下:
我們來(lái)看看每一步都做了什么。
5.1 分析請求信息
對于像tomcat這樣的中間件容器,所有進(jìn)入tomcat的請求都會(huì )被封裝成HttpServletRequest和HttpServletResponse(以下簡(jiǎn)稱(chēng)請求和響應),最后進(jìn)入用戶(hù)的servlet。借助中間件增強技術(shù),調用鏈會(huì )在處理用戶(hù)邏輯之前攔截一次請求和響應,并分析其中是否收錄調用鏈信息。如果是,則將調用鏈信息封裝到上下文中。
5.2 邏輯導流
由于不同協(xié)議對應的調用鏈的繪制邏輯也不同,這里會(huì )根據協(xié)議類(lèi)型分配一次調用鏈。
5.3 初始化調用鏈上下文
分析調用鏈上下文中的信息:
Main span:服務(wù)中可能有多個(gè)客戶(hù)端通信或服務(wù)間通信,需要一個(gè)主span來(lái)記錄當前服務(wù)中調用鏈最后一個(gè)節點(diǎn)的信息。
5.4 調用鏈信息輸出
用戶(hù)邏輯處理結束后,調用鏈記錄器會(huì )從上下文中取出當前服務(wù)的調用鏈信息,輸出到指定的日志路徑。
5.5 服務(wù)間的上下文傳輸
不同協(xié)議調用鏈傳遞信息的方法也略有不同。具體的實(shí)現方式利用了中間件增強技術(shù)提供的另一個(gè)能力:AppFrkHook(簡(jiǎn)稱(chēng)hook,這個(gè)功能會(huì )在客戶(hù)端調用鏈實(shí)現的時(shí)候具體介紹)。它可以劫持用戶(hù)使用的客戶(hù)端技術(shù)。如果用戶(hù)使用httpclient進(jìn)行通信,則劫持httpclient并動(dòng)態(tài)編織代碼,從而達到在http通信過(guò)程中注入調用鏈上下文信息的效果。目標服務(wù)解析請求信息時(shí),解析調用鏈上下文;當調用鏈上下文邏輯被初始化時(shí),
六、總結
看完這篇文章,讀者應該對中間件增強技術(shù)的實(shí)現有了一個(gè)大致的了解,對其提供的GlobalFilterHandler能力也有了一定的了解。對于調用鏈,你應該了解繪制服務(wù)器和服務(wù)之間調用鏈的整個(gè)過(guò)程。
文章采集調用(本文采集指定節點(diǎn)和“如何導出采集內容”的說(shuō)明)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 216 次瀏覽 ? 2021-10-10 03:35
前言:本文為《無(wú)分頁(yè)通用文章采集方法》的第三部分。在前兩節的基礎上,對《如何采集指定Node》和《如何導出采集的內容》進(jìn)行詳細講解。為了與上一篇保持一致,本節文章將繼續使用之前的章節標記。
接第二部分。
3.1采集指定節點(diǎn)
點(diǎn)擊“保存并啟動(dòng)采集”后,會(huì )進(jìn)入“采集指定節點(diǎn)”界面,如圖(圖34),
圖 34-采集指定節點(diǎn)
每頁(yè)采集:設置每頁(yè)需要的采集個(gè)數,根據網(wǎng)站是否有防刷新功能設置采集的間隔。
特殊選項:設置是否檢測重復圖片,默認為“檢測”。
附加選項:該選項共有3種采集模式可供選擇:第一種是“監控采集模式(檢查當前節點(diǎn)或所有節點(diǎn)是否有新內容)”。選擇后,系統只會(huì )采集指定節點(diǎn)的更新內容;第二種是“重新下載所有內容”,選擇后系統會(huì )采集指定節點(diǎn)的所有內容;第三種是“下載種子網(wǎng)站未下載的內容”,選擇后,系統只會(huì )采集指定節點(diǎn)未下載的內容,包括之前未下載和更新的內容。<//p
p設置完成并確認后,您可以點(diǎn)擊“開(kāi)始采集網(wǎng)頁(yè)”或“查看種子網(wǎng)址”。此時(shí),如果您單擊“查看種子 URL”,您將看到列表是空的。這是因為新創(chuàng )建的采集節點(diǎn)從來(lái)就不是采集,如圖(圖35)顯示,/p
pimg src='https://www.mayiziy.com/../../../uploads/18751582345767.png' alt='Dedecms采集功能的使用方法 --- 不含分頁(yè)的普通文章(三)'//p
p圖35-查看節點(diǎn)的seed URL/p
p點(diǎn)擊“開(kāi)始采集網(wǎng)頁(yè)”后,系統將啟動(dòng)采集節點(diǎn)中設置的URL,并出現相關(guān)提示,如圖36),< /@采集 p>
圖 36-采集提示消息進(jìn)行中
采集 完成后,再次點(diǎn)擊“查看種子網(wǎng)址”或點(diǎn)擊頁(yè)面右上角的“查看已下載”,可以看到已經(jīng)采集的網(wǎng)址信息,如圖在(圖37)如圖,
圖37-查看節點(diǎn)的seed URL
采集成功后,您可以根據實(shí)際需要選擇頁(yè)面右上角的“采集節點(diǎn)管理”或“導出數據”。點(diǎn)擊“導出數據”后,可以進(jìn)入“采集管理>采集內容導出”界面,如圖(圖38),
圖 38-采集內容導出
“默認導出列”:設置將采集的內容導入到
的列
“批量采集選項”:如果采集規則中已經(jīng)指定了列ID,則可以使用該函數。如果指定的列ID為0,系統會(huì )將采集導入到“默認導出列”中選擇的列中。
“發(fā)布選項”:有發(fā)布為“普通文檔”和“另存為草稿”的選項。
“每批次導入”:設置每批次導入的項目數。這個(gè)數字不能太大。
“帶選項”:這是一個(gè)多項選擇。如果不想采集重復文章標題,可以選擇“排除重復標題”;如果想直接從采集接收到的內容生成HTML,可以選擇“完成后自動(dòng)生成并導入Content HTML”;如果想讓系統自動(dòng)識別采集列表頁(yè)的標題名稱(chēng),可以選擇“使用列表索引的標題”。一般不建議勾選。
“隨機推薦”:填寫(xiě)一個(gè)數字,代表文檔的數量。推薦的文檔隨機出現在輸入的文檔數量中。如果輸入“0”,則表示不推薦。
設置完成后,可以點(diǎn)擊“確定”將下載的項目導入到選中的列中,如圖(圖39),
圖39-采集設置后的內容導出頁(yè)面
同時(shí)系統會(huì )提示導出過(guò)程,如圖(圖40),
圖40-采集內容導出時(shí)的提示信息
導出采集 內容提示“完成所有欄目列表更新”后,點(diǎn)擊“瀏覽欄目”,即可進(jìn)入網(wǎng)站的相關(guān)頁(yè)面查看采集到的文章List 及其具體內容。也可以在后臺管理界面的主菜單中點(diǎn)擊“Core”,然后點(diǎn)擊“General文章”進(jìn)入“Document List”頁(yè)面,從文章查看文章的列表@采集 ,如圖(圖41),
圖 41-文檔列表
到此為止,我已經(jīng)成功采集到達目標網(wǎng)站的文章內容。
總結,采集“普通文章無(wú)分頁(yè)”比較簡(jiǎn)單。由于本文文章是基礎教程,所以沒(méi)有太多涉及“過(guò)濾規則”。 “常用文章帶分頁(yè)”的采集方法以及過(guò)濾規則的使用將在下一篇文章介紹。
附上這篇文章的采集規則:
{dede:listconfig}
{dede:noteinfo notename="采集測試 (一)" channelid="1" macthtype="string"
refurl="" sourcelang="gb2312" cosort="asc" isref="no" exptime="10" usemore="0" /}
{dede:listrule sourcetype="batch" rssurl="http://" regxurl="(*).html"
startid="1" endid="1" addv="1" urlrule="area"
musthas=".html" nothas="" listpic="1" usemore="0"}
{dede:addurls}{/dede:addurls}
{dede:batchrule}{/dede:batchrule}
{dede:regxrule}{/dede:regxrule}
{dede:areastart}
{/dede:areastart}
{dede:areaend}
{/dede:areaend}
{/dede:listrule}
{/dede:listconfig}
{dede:itemconfig}
{dede:sppage sptype='full' sptype='full' srul='1' erul='5'}{/dede:sppage}
{dede:previewurl}{/dede:previewurl}
{dede:keywordtrim}{/dede:keywordtrim}
{dede:descriptiontrim}{/dede:descriptiontrim}
{dede:item field='title' value='' isunit='' isdown=''}
{dede:match}
[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='writer' value='' isunit='' isdown=''}
{dede:match}作者:[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='source' value='' isunit='' isdown=''}
{dede:match}來(lái)源:[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='pubdate' value='' isunit='' isdown=''}
{dede:match} 發(fā)布于:[Content]{/dede:match}
{dede:function}@me=GetMkTime(@me);{/dede:function}
{/dede:item}
{dede:item field='body' value='' isunit='1' isdown='1'}
{dede:match}
[內容]
{/de:match}
{dede:function}{/dede:function}
{/dede:item}
{/dede:itemconfig}
本文標簽:dedecms、采集、功能、用法、---、不收錄、分頁(yè)、通用、文章、前言 查看全部
文章采集調用(本文采集指定節點(diǎn)和“如何導出采集內容”的說(shuō)明)
前言:本文為《無(wú)分頁(yè)通用文章采集方法》的第三部分。在前兩節的基礎上,對《如何采集指定Node》和《如何導出采集的內容》進(jìn)行詳細講解。為了與上一篇保持一致,本節文章將繼續使用之前的章節標記。
接第二部分。
3.1采集指定節點(diǎn)
點(diǎn)擊“保存并啟動(dòng)采集”后,會(huì )進(jìn)入“采集指定節點(diǎn)”界面,如圖(圖34),

圖 34-采集指定節點(diǎn)
每頁(yè)采集:設置每頁(yè)需要的采集個(gè)數,根據網(wǎng)站是否有防刷新功能設置采集的間隔。
特殊選項:設置是否檢測重復圖片,默認為“檢測”。
附加選項:該選項共有3種采集模式可供選擇:第一種是“監控采集模式(檢查當前節點(diǎn)或所有節點(diǎn)是否有新內容)”。選擇后,系統只會(huì )采集指定節點(diǎn)的更新內容;第二種是“重新下載所有內容”,選擇后系統會(huì )采集指定節點(diǎn)的所有內容;第三種是“下載種子網(wǎng)站未下載的內容”,選擇后,系統只會(huì )采集指定節點(diǎn)未下載的內容,包括之前未下載和更新的內容。<//p
p設置完成并確認后,您可以點(diǎn)擊“開(kāi)始采集網(wǎng)頁(yè)”或“查看種子網(wǎng)址”。此時(shí),如果您單擊“查看種子 URL”,您將看到列表是空的。這是因為新創(chuàng )建的采集節點(diǎn)從來(lái)就不是采集,如圖(圖35)顯示,/p
pimg src='https://www.mayiziy.com/../../../uploads/18751582345767.png' alt='Dedecms采集功能的使用方法 --- 不含分頁(yè)的普通文章(三)'//p
p圖35-查看節點(diǎn)的seed URL/p
p點(diǎn)擊“開(kāi)始采集網(wǎng)頁(yè)”后,系統將啟動(dòng)采集節點(diǎn)中設置的URL,并出現相關(guān)提示,如圖36),< /@采集 p>



圖 36-采集提示消息進(jìn)行中
采集 完成后,再次點(diǎn)擊“查看種子網(wǎng)址”或點(diǎn)擊頁(yè)面右上角的“查看已下載”,可以看到已經(jīng)采集的網(wǎng)址信息,如圖在(圖37)如圖,

圖37-查看節點(diǎn)的seed URL
采集成功后,您可以根據實(shí)際需要選擇頁(yè)面右上角的“采集節點(diǎn)管理”或“導出數據”。點(diǎn)擊“導出數據”后,可以進(jìn)入“采集管理>采集內容導出”界面,如圖(圖38),

圖 38-采集內容導出
“默認導出列”:設置將采集的內容導入到
的列
“批量采集選項”:如果采集規則中已經(jīng)指定了列ID,則可以使用該函數。如果指定的列ID為0,系統會(huì )將采集導入到“默認導出列”中選擇的列中。
“發(fā)布選項”:有發(fā)布為“普通文檔”和“另存為草稿”的選項。
“每批次導入”:設置每批次導入的項目數。這個(gè)數字不能太大。
“帶選項”:這是一個(gè)多項選擇。如果不想采集重復文章標題,可以選擇“排除重復標題”;如果想直接從采集接收到的內容生成HTML,可以選擇“完成后自動(dòng)生成并導入Content HTML”;如果想讓系統自動(dòng)識別采集列表頁(yè)的標題名稱(chēng),可以選擇“使用列表索引的標題”。一般不建議勾選。
“隨機推薦”:填寫(xiě)一個(gè)數字,代表文檔的數量。推薦的文檔隨機出現在輸入的文檔數量中。如果輸入“0”,則表示不推薦。
設置完成后,可以點(diǎn)擊“確定”將下載的項目導入到選中的列中,如圖(圖39),

圖39-采集設置后的內容導出頁(yè)面
同時(shí)系統會(huì )提示導出過(guò)程,如圖(圖40),



圖40-采集內容導出時(shí)的提示信息
導出采集 內容提示“完成所有欄目列表更新”后,點(diǎn)擊“瀏覽欄目”,即可進(jìn)入網(wǎng)站的相關(guān)頁(yè)面查看采集到的文章List 及其具體內容。也可以在后臺管理界面的主菜單中點(diǎn)擊“Core”,然后點(diǎn)擊“General文章”進(jìn)入“Document List”頁(yè)面,從文章查看文章的列表@采集 ,如圖(圖41),

圖 41-文檔列表
到此為止,我已經(jīng)成功采集到達目標網(wǎng)站的文章內容。
總結,采集“普通文章無(wú)分頁(yè)”比較簡(jiǎn)單。由于本文文章是基礎教程,所以沒(méi)有太多涉及“過(guò)濾規則”。 “常用文章帶分頁(yè)”的采集方法以及過(guò)濾規則的使用將在下一篇文章介紹。
附上這篇文章的采集規則:
{dede:listconfig}
{dede:noteinfo notename="采集測試 (一)" channelid="1" macthtype="string"
refurl="" sourcelang="gb2312" cosort="asc" isref="no" exptime="10" usemore="0" /}
{dede:listrule sourcetype="batch" rssurl="http://" regxurl="(*).html"
startid="1" endid="1" addv="1" urlrule="area"
musthas=".html" nothas="" listpic="1" usemore="0"}
{dede:addurls}{/dede:addurls}
{dede:batchrule}{/dede:batchrule}
{dede:regxrule}{/dede:regxrule}
{dede:areastart}
{/dede:areastart}
{dede:areaend}
{/dede:areaend}
{/dede:listrule}
{/dede:listconfig}
{dede:itemconfig}
{dede:sppage sptype='full' sptype='full' srul='1' erul='5'}{/dede:sppage}
{dede:previewurl}{/dede:previewurl}
{dede:keywordtrim}{/dede:keywordtrim}
{dede:descriptiontrim}{/dede:descriptiontrim}
{dede:item field='title' value='' isunit='' isdown=''}
{dede:match}
[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='writer' value='' isunit='' isdown=''}
{dede:match}作者:[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='source' value='' isunit='' isdown=''}
{dede:match}來(lái)源:[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='pubdate' value='' isunit='' isdown=''}
{dede:match} 發(fā)布于:[Content]{/dede:match}
{dede:function}@me=GetMkTime(@me);{/dede:function}
{/dede:item}
{dede:item field='body' value='' isunit='1' isdown='1'}
{dede:match}
[內容]
{/de:match}
{dede:function}{/dede:function}
{/dede:item}
{/dede:itemconfig}
本文標簽:dedecms、采集、功能、用法、---、不收錄、分頁(yè)、通用、文章、前言
文章采集調用(生命不止,折騰不停,最近開(kāi)始接觸了wordpress(組圖))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 153 次瀏覽 ? 2021-09-25 15:14
生活一直在繼續。最近,我開(kāi)始聯(lián)系WordPress。我發(fā)現WordPress確實(shí)做得很好。有很多地方值得學(xué)習,而且很多地方都設置得非常巧妙。安裝WP之后,會(huì )有一個(gè)“hello to the world”文章,有點(diǎn)空,所以我想知道是否可以使用Python自動(dòng)發(fā)布WordPress采集的一些內容。那樣的話(huà),我們就開(kāi)始吧
一、所需的庫和模塊
Requests是一個(gè)模擬HTTP請求的庫。我們用它來(lái)抓取網(wǎng)頁(yè)
Lxml是一個(gè)用于解析HTML和XML的庫。我們使用它來(lái)解析網(wǎng)頁(yè)內容
Pymysql是一個(gè)MySQL數據庫。我們使用它將內容上傳到WordPress數據庫
時(shí)間是Python中內置的時(shí)間處理模塊。我們使用它來(lái)設置抓取網(wǎng)頁(yè)之間的間隔
Random是一個(gè)python內置模塊,用于生成隨機數。我們用它來(lái)生成隨機區間
Xpinyin是一個(gè)將漢字轉換成拼音的庫
二、使用pymysql向WordPress數據庫提交內容
通常,當我們使用WordPress時(shí),我們會(huì )在后臺編寫(xiě)它,然后單擊“發(fā)布”。過(guò)程如下:
瀏覽器=>;提交表格=>;php=>;數據庫
在這里,我們將跳過(guò)前面的三個(gè)步驟,直接連接到數據庫:
命令行=>;數據庫
<p>通過(guò)查看WordPress數據庫中的WP,在posts表中的字段之后,我編寫(xiě)了一條SQL語(yǔ)句并保留了三個(gè)位置:content、title和name,它們分別表示 查看全部
文章采集調用(生命不止,折騰不停,最近開(kāi)始接觸了wordpress(組圖))
生活一直在繼續。最近,我開(kāi)始聯(lián)系WordPress。我發(fā)現WordPress確實(shí)做得很好。有很多地方值得學(xué)習,而且很多地方都設置得非常巧妙。安裝WP之后,會(huì )有一個(gè)“hello to the world”文章,有點(diǎn)空,所以我想知道是否可以使用Python自動(dòng)發(fā)布WordPress采集的一些內容。那樣的話(huà),我們就開(kāi)始吧
一、所需的庫和模塊
Requests是一個(gè)模擬HTTP請求的庫。我們用它來(lái)抓取網(wǎng)頁(yè)
Lxml是一個(gè)用于解析HTML和XML的庫。我們使用它來(lái)解析網(wǎng)頁(yè)內容
Pymysql是一個(gè)MySQL數據庫。我們使用它將內容上傳到WordPress數據庫
時(shí)間是Python中內置的時(shí)間處理模塊。我們使用它來(lái)設置抓取網(wǎng)頁(yè)之間的間隔
Random是一個(gè)python內置模塊,用于生成隨機數。我們用它來(lái)生成隨機區間
Xpinyin是一個(gè)將漢字轉換成拼音的庫
二、使用pymysql向WordPress數據庫提交內容
通常,當我們使用WordPress時(shí),我們會(huì )在后臺編寫(xiě)它,然后單擊“發(fā)布”。過(guò)程如下:
瀏覽器=>;提交表格=>;php=>;數據庫
在這里,我們將跳過(guò)前面的三個(gè)步驟,直接連接到數據庫:
命令行=>;數據庫
<p>通過(guò)查看WordPress數據庫中的WP,在posts表中的字段之后,我編寫(xiě)了一條SQL語(yǔ)句并保留了三個(gè)位置:content、title和name,它們分別表示
文章采集調用(沒(méi)有內容就沒(méi)有排名嗎?你錯了,可以組合內容去排名)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 149 次瀏覽 ? 2021-09-25 15:12
采集 的排名策略有很多??傊?,大部分采集站都不會(huì )使用內容參與排名,因為采集的大部分內容都是低質(zhì)量的,所以排名無(wú)望,沒(méi)有內容就沒(méi)有排名嗎?你錯了,你可以結合內容進(jìn)行排名,看看采集站做的有多棒。
1、標簽頁(yè)
標簽頁(yè)是將大部分文章組合成一個(gè)列表,所以標簽頁(yè)被定義為一個(gè)偽原創(chuàng )頁(yè)。雖然是偽原創(chuàng )頁(yè)面,但是因為這個(gè)列表,質(zhì)量非常好。關(guān)鍵詞的內容都是和關(guān)鍵詞一致的,而一個(gè)采集網(wǎng)站的入口,至少會(huì )有幾萬(wàn)個(gè)標簽頁(yè),或多或少幾千個(gè)關(guān)鍵詞 的排名并不奇怪。
2、列表頁(yè)面
列表頁(yè)與標簽頁(yè)類(lèi)似,但是建立大量列表有點(diǎn)困難,所以很多采集站點(diǎn)可以通過(guò)創(chuàng )建自己的列表采集來(lái)形成一個(gè)高質(zhì)量的頁(yè)面頁(yè)面,并且排名方法類(lèi)似。通常采集更新,這個(gè)頁(yè)面也更新。
3、搜索頁(yè)面
搜索頁(yè)面被視為偽靜態(tài)。當用戶(hù)搜索某個(gè)關(guān)鍵詞時(shí),出現的頁(yè)面都是靜態(tài)頁(yè)面,有利于搜索引擎。當文章更新時(shí),搜索頁(yè)面也隨之更新,只要用戶(hù)進(jìn)行搜索,這個(gè)關(guān)鍵詞基本上是很容易上榜的。
4、專(zhuān)頁(yè)
通過(guò)創(chuàng )建特殊頁(yè)面,自動(dòng)調用相關(guān)文章形成列表,調用程序即可識別相關(guān)性。這時(shí)候這個(gè)頁(yè)面上關(guān)鍵詞的內容滿(mǎn)足內容要求,也形成了一個(gè)不錯的Page,排名在意料之中。
5、內容頁(yè)面
內容頁(yè)的排名策略很少見(jiàn),但是最近很多人用內容頁(yè)做排名,而且都是采集,主要是通過(guò)采集多張圖片和視頻組成一個(gè)頁(yè)面,第一張圖片視頻無(wú)法被搜索引擎識別,將網(wǎng)站的第二張多張圖片合二為一,偽原創(chuàng )的真相自然就出現了。
改變: 查看全部
文章采集調用(沒(méi)有內容就沒(méi)有排名嗎?你錯了,可以組合內容去排名)
采集 的排名策略有很多??傊?,大部分采集站都不會(huì )使用內容參與排名,因為采集的大部分內容都是低質(zhì)量的,所以排名無(wú)望,沒(méi)有內容就沒(méi)有排名嗎?你錯了,你可以結合內容進(jìn)行排名,看看采集站做的有多棒。
1、標簽頁(yè)
標簽頁(yè)是將大部分文章組合成一個(gè)列表,所以標簽頁(yè)被定義為一個(gè)偽原創(chuàng )頁(yè)。雖然是偽原創(chuàng )頁(yè)面,但是因為這個(gè)列表,質(zhì)量非常好。關(guān)鍵詞的內容都是和關(guān)鍵詞一致的,而一個(gè)采集網(wǎng)站的入口,至少會(huì )有幾萬(wàn)個(gè)標簽頁(yè),或多或少幾千個(gè)關(guān)鍵詞 的排名并不奇怪。
2、列表頁(yè)面
列表頁(yè)與標簽頁(yè)類(lèi)似,但是建立大量列表有點(diǎn)困難,所以很多采集站點(diǎn)可以通過(guò)創(chuàng )建自己的列表采集來(lái)形成一個(gè)高質(zhì)量的頁(yè)面頁(yè)面,并且排名方法類(lèi)似。通常采集更新,這個(gè)頁(yè)面也更新。
3、搜索頁(yè)面
搜索頁(yè)面被視為偽靜態(tài)。當用戶(hù)搜索某個(gè)關(guān)鍵詞時(shí),出現的頁(yè)面都是靜態(tài)頁(yè)面,有利于搜索引擎。當文章更新時(shí),搜索頁(yè)面也隨之更新,只要用戶(hù)進(jìn)行搜索,這個(gè)關(guān)鍵詞基本上是很容易上榜的。
4、專(zhuān)頁(yè)
通過(guò)創(chuàng )建特殊頁(yè)面,自動(dòng)調用相關(guān)文章形成列表,調用程序即可識別相關(guān)性。這時(shí)候這個(gè)頁(yè)面上關(guān)鍵詞的內容滿(mǎn)足內容要求,也形成了一個(gè)不錯的Page,排名在意料之中。
5、內容頁(yè)面
內容頁(yè)的排名策略很少見(jiàn),但是最近很多人用內容頁(yè)做排名,而且都是采集,主要是通過(guò)采集多張圖片和視頻組成一個(gè)頁(yè)面,第一張圖片視頻無(wú)法被搜索引擎識別,將網(wǎng)站的第二張多張圖片合二為一,偽原創(chuàng )的真相自然就出現了。
改變:
文章采集調用(【Python學(xué)習福利】豆瓣電影中如何運用多個(gè)網(wǎng)址請求)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 203 次瀏覽 ? 2021-09-25 15:10
點(diǎn)擊上方“IT共享屋”關(guān)注
回復“資料”領(lǐng)取Python學(xué)習福利
【一、項目背景】
豆瓣影業(yè)提供最新的電影介紹和影評,包括正在放映的電影的視頻查詢(xún)和購票服務(wù)。順便可以錄下想看的電影和電視劇,看,看,還可以寫(xiě)影評。它極大地方便了人們的生活。
今天以電視?。绖。槔?,批量抓取對應的電影,寫(xiě)入csv文件。用戶(hù)可以通過(guò)評分更好地選擇自己想要的電影。
【二、項目目標】
獲取對應的電影名稱(chēng)、評分、詳情鏈接,下載電影圖片,保存文件。
[三、 涉及的圖書(shū)館和 網(wǎng)站]
1、 網(wǎng)址如下:
https://movie.douban.com/j/sea ... rt%3D{}
2、 涉及的庫:requests、fake_useragent、json、csv
3、軟件:PyCharm
【四、項目分析】
1、如何請求多個(gè)頁(yè)面?
當您單擊下一頁(yè)時(shí),每增加一頁(yè),paged 將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
2. 如何獲取實(shí)際請求的地址?
在請求數據時(shí),發(fā)現頁(yè)面上沒(méi)有對應的數據。其實(shí)豆瓣是通過(guò)javascript動(dòng)態(tài)加載內容來(lái)防止采集的。
1)F12 右擊查看,在左側菜單中找到Network,和name,找到第五個(gè)數據,點(diǎn)擊Preview。
2) 點(diǎn)擊subjects,可以看到title是對應電影的名字。率是相應的分數。通過(guò)js解析subjects字典,找到需要的字段。
3. 如何訪(fǎng)問(wèn)網(wǎng)頁(yè)?
https://movie.douban.com/j/sea ... %3D60
單擊下一頁(yè)時(shí),每增加一頁(yè),該頁(yè)將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
【五、項目實(shí)施】
1、 我們定義一個(gè)類(lèi)繼承對象,然后定義init方法繼承self,再定義一個(gè)main函數main繼承self。導入所需的庫和請求 URL。
import requests,jsonfrom fake_useragent import UserAgentimport csvclass Doban(object): def __init__(self): self.url = "https://movie.douban.com/j/sea ... rt%3D{}" def main(self): passif __name__ == '__main__': Siper = Doban() Siper.main()
2、 隨機生成UserAgent,構造請求頭,防止反爬。
for i in range(1, 50): self.headers = { 'User-Agent': ua.random, }
3、發(fā)送請求,獲取響應,頁(yè)面回調,方便下次請求。
def get_page(self, url): res = requests.get(url=url, headers=self.headers) html = res.content.decode("utf-8") return html
4、json 解析頁(yè)面數據,獲取對應的字典。
data = json.loads(html)['subjects'] # print(data[0])
5、進(jìn)行遍歷,獲取對應的電影名,評分,鏈接到下一個(gè)詳情頁(yè)。
print(name, goblin_herf) html2 = self.get_page(goblin_herf) # 第二個(gè)發(fā)生請求 parse_html2 = etree.HTML(html2) r = parse_html2.xpath('//div[@]/p/text()')
6、創(chuàng )建一個(gè)用于寫(xiě)入的csv文件,定義相應的header內容,并保存數據。
# 創(chuàng )建csv文件進(jìn)行寫(xiě)入 csv_file = open('scr.csv', 'a', encoding='gbk') csv_writer = csv.writer(csv_file) # 寫(xiě)入csv標題頭內容 csv_writerr.writerow(['電影', '評分', "詳情頁(yè)"]) #寫(xiě)入數據 csv_writer.writerow([id, rate, urll])
7、一個(gè)請求的圖片地址。定義圖片的名稱(chēng)并保存文檔。
html2 = requests.get(url=urll, headers=self.headers).content dirname = "./圖/" + id + ".jpg" with open(dirname, 'wb') as f: f.write(html2) print("%s 【下載成功?。。?!】" % id)
8、 調用方法來(lái)實(shí)現功能。
html = self.get_page(url) self.parse_page(html)
9、項目?jì)?yōu)化:1)設置延時(shí)。
time.sleep(1.4)
2) 定義一個(gè)變量u,用于遍歷,表示爬取的是哪個(gè)頁(yè)面。(更清晰,更令人印象深刻)。
u = 0 self.u += 1;
[六、效果展示]
1、 點(diǎn)擊綠色三角進(jìn)入起始頁(yè)和結束頁(yè)(從第0頁(yè)開(kāi)始)。
2、 在控制臺顯示下載成功信息。
3、保存csv文件。
4、電影圖片顯示。
[七、總結]
1、 不建議抓取太多數據,可能造成服務(wù)器負載,簡(jiǎn)單試一下。
2、本文章針對Python爬豆豆應用中的難點(diǎn)和關(guān)鍵點(diǎn),以及如何防止回爬等問(wèn)題,做了一個(gè)相對的解決方案。
3、希望這個(gè)項目能幫助大家了解json解析頁(yè)面的基本流程,如何拼接字符串,如何使用format函數。
4、 本文基于Python網(wǎng)絡(luò )爬蟲(chóng),利用爬蟲(chóng)庫實(shí)現豆瓣電影及其圖片的獲取。說(shuō)到實(shí)現,總會(huì )有各種各樣的問(wèn)題。不要看最好的,努力去更深入地理解。
5、需要本文源代碼的可以在后臺回復“豆瓣電影”獲取。
看完這篇文章你學(xué)會(huì )了嗎?請轉發(fā)并分享給更多人
IT共享之家 查看全部
文章采集調用(【Python學(xué)習福利】豆瓣電影中如何運用多個(gè)網(wǎng)址請求)
點(diǎn)擊上方“IT共享屋”關(guān)注
回復“資料”領(lǐng)取Python學(xué)習福利
【一、項目背景】
豆瓣影業(yè)提供最新的電影介紹和影評,包括正在放映的電影的視頻查詢(xún)和購票服務(wù)。順便可以錄下想看的電影和電視劇,看,看,還可以寫(xiě)影評。它極大地方便了人們的生活。
今天以電視?。绖。槔?,批量抓取對應的電影,寫(xiě)入csv文件。用戶(hù)可以通過(guò)評分更好地選擇自己想要的電影。
【二、項目目標】
獲取對應的電影名稱(chēng)、評分、詳情鏈接,下載電影圖片,保存文件。
[三、 涉及的圖書(shū)館和 網(wǎng)站]
1、 網(wǎng)址如下:
https://movie.douban.com/j/sea ... rt%3D{}
2、 涉及的庫:requests、fake_useragent、json、csv
3、軟件:PyCharm
【四、項目分析】
1、如何請求多個(gè)頁(yè)面?
當您單擊下一頁(yè)時(shí),每增加一頁(yè),paged 將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
2. 如何獲取實(shí)際請求的地址?
在請求數據時(shí),發(fā)現頁(yè)面上沒(méi)有對應的數據。其實(shí)豆瓣是通過(guò)javascript動(dòng)態(tài)加載內容來(lái)防止采集的。
1)F12 右擊查看,在左側菜單中找到Network,和name,找到第五個(gè)數據,點(diǎn)擊Preview。

2) 點(diǎn)擊subjects,可以看到title是對應電影的名字。率是相應的分數。通過(guò)js解析subjects字典,找到需要的字段。

3. 如何訪(fǎng)問(wèn)網(wǎng)頁(yè)?
https://movie.douban.com/j/sea ... %3D60
單擊下一頁(yè)時(shí),每增加一頁(yè),該頁(yè)將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
【五、項目實(shí)施】
1、 我們定義一個(gè)類(lèi)繼承對象,然后定義init方法繼承self,再定義一個(gè)main函數main繼承self。導入所需的庫和請求 URL。
import requests,jsonfrom fake_useragent import UserAgentimport csvclass Doban(object): def __init__(self): self.url = "https://movie.douban.com/j/sea ... rt%3D{}" def main(self): passif __name__ == '__main__': Siper = Doban() Siper.main()
2、 隨機生成UserAgent,構造請求頭,防止反爬。
for i in range(1, 50): self.headers = { 'User-Agent': ua.random, }
3、發(fā)送請求,獲取響應,頁(yè)面回調,方便下次請求。
def get_page(self, url): res = requests.get(url=url, headers=self.headers) html = res.content.decode("utf-8") return html
4、json 解析頁(yè)面數據,獲取對應的字典。
data = json.loads(html)['subjects'] # print(data[0])
5、進(jìn)行遍歷,獲取對應的電影名,評分,鏈接到下一個(gè)詳情頁(yè)。
print(name, goblin_herf) html2 = self.get_page(goblin_herf) # 第二個(gè)發(fā)生請求 parse_html2 = etree.HTML(html2) r = parse_html2.xpath('//div[@]/p/text()')
6、創(chuàng )建一個(gè)用于寫(xiě)入的csv文件,定義相應的header內容,并保存數據。
# 創(chuàng )建csv文件進(jìn)行寫(xiě)入 csv_file = open('scr.csv', 'a', encoding='gbk') csv_writer = csv.writer(csv_file) # 寫(xiě)入csv標題頭內容 csv_writerr.writerow(['電影', '評分', "詳情頁(yè)"]) #寫(xiě)入數據 csv_writer.writerow([id, rate, urll])
7、一個(gè)請求的圖片地址。定義圖片的名稱(chēng)并保存文檔。
html2 = requests.get(url=urll, headers=self.headers).content dirname = "./圖/" + id + ".jpg" with open(dirname, 'wb') as f: f.write(html2) print("%s 【下載成功?。。?!】" % id)
8、 調用方法來(lái)實(shí)現功能。
html = self.get_page(url) self.parse_page(html)
9、項目?jì)?yōu)化:1)設置延時(shí)。
time.sleep(1.4)
2) 定義一個(gè)變量u,用于遍歷,表示爬取的是哪個(gè)頁(yè)面。(更清晰,更令人印象深刻)。
u = 0 self.u += 1;
[六、效果展示]
1、 點(diǎn)擊綠色三角進(jìn)入起始頁(yè)和結束頁(yè)(從第0頁(yè)開(kāi)始)。

2、 在控制臺顯示下載成功信息。

3、保存csv文件。

4、電影圖片顯示。

[七、總結]
1、 不建議抓取太多數據,可能造成服務(wù)器負載,簡(jiǎn)單試一下。
2、本文章針對Python爬豆豆應用中的難點(diǎn)和關(guān)鍵點(diǎn),以及如何防止回爬等問(wèn)題,做了一個(gè)相對的解決方案。
3、希望這個(gè)項目能幫助大家了解json解析頁(yè)面的基本流程,如何拼接字符串,如何使用format函數。
4、 本文基于Python網(wǎng)絡(luò )爬蟲(chóng),利用爬蟲(chóng)庫實(shí)現豆瓣電影及其圖片的獲取。說(shuō)到實(shí)現,總會(huì )有各種各樣的問(wèn)題。不要看最好的,努力去更深入地理解。
5、需要本文源代碼的可以在后臺回復“豆瓣電影”獲取。
看完這篇文章你學(xué)會(huì )了嗎?請轉發(fā)并分享給更多人
IT共享之家
文章采集調用(使用typecho程序搭建博客分享的函數代碼,博主僅需要設置)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 162 次瀏覽 ? 2021-09-24 13:05
使用 typecho 程序構建博客。如果想在網(wǎng)站頁(yè)面的某個(gè)位置展示博主想要指定的幾篇文章文章怎么辦?不懂typecho開(kāi)發(fā)的博主可以選擇直接在模板文件中添加html代碼。這顯然不夠靈活,添加、刪除和修改非常不方便。下面博客欄分享的功能代碼,博主只需要設置文章id就可以調用文章的列表顯示出來(lái),非常方便。
腳步:
1、在主題的functions.php文件中添加如下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//by boke8.net
function boke8GetIdPosts($id){
if($id){
$getid = explode(',',$id);
$db = Typecho_Db::get();
$result = $db->fetchAll($db->select()->from('table.contents')
->where('status = ?','publish')
->where('type = ?', 'post')
->where('cid in ?',$getid)
->order('cid', Typecho_Db::SORT_DESC)
);
if($result){
$i=1;
foreach($result as $val){
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);
$post_title = htmlspecialchars($val['title']);
$permalink = $val['permalink'];
echo ''.$post_title.'';
}
}
}else{
echo '請設置要調用的文章ID';
}
}
2、在要顯示的位置對應的模板文件中添加如下調用代碼文章:
1
其中1、4、6是要調用的文章id。你可以修改為你要調用的文章id。多個(gè) id 用英文逗號分隔。
除非另有說(shuō)明,文章將由博客整理發(fā)布,歡迎轉載。 查看全部
文章采集調用(使用typecho程序搭建博客分享的函數代碼,博主僅需要設置)
使用 typecho 程序構建博客。如果想在網(wǎng)站頁(yè)面的某個(gè)位置展示博主想要指定的幾篇文章文章怎么辦?不懂typecho開(kāi)發(fā)的博主可以選擇直接在模板文件中添加html代碼。這顯然不夠靈活,添加、刪除和修改非常不方便。下面博客欄分享的功能代碼,博主只需要設置文章id就可以調用文章的列表顯示出來(lái),非常方便。
腳步:
1、在主題的functions.php文件中添加如下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//by boke8.net
function boke8GetIdPosts($id){
if($id){
$getid = explode(',',$id);
$db = Typecho_Db::get();
$result = $db->fetchAll($db->select()->from('table.contents')
->where('status = ?','publish')
->where('type = ?', 'post')
->where('cid in ?',$getid)
->order('cid', Typecho_Db::SORT_DESC)
);
if($result){
$i=1;
foreach($result as $val){
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);
$post_title = htmlspecialchars($val['title']);
$permalink = $val['permalink'];
echo ''.$post_title.'';
}
}
}else{
echo '請設置要調用的文章ID';
}
}
2、在要顯示的位置對應的模板文件中添加如下調用代碼文章:
1
其中1、4、6是要調用的文章id。你可以修改為你要調用的文章id。多個(gè) id 用英文逗號分隔。
除非另有說(shuō)明,文章將由博客整理發(fā)布,歡迎轉載。
文章采集調用(“量光尺”可以回答這個(gè)問(wèn)題批量下載dng圖片教程)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 173 次瀏覽 ? 2021-09-24 08:02
文章采集調用的相機選項不同,例如所調用相機的可能性為jpeg、png、jpg、alpha?;蛘邔τ谀承┨厥飧袷剑ㄈ?jpg),可能會(huì )需要對相機進(jìn)行格式轉換,所以文件需要進(jìn)行另外設置,如bmp等。(不同廠(chǎng)商相機格式可能也會(huì )略有不同)文件大小因相機而異,反正有些m43相機(相當于sonyq5)是8mb,a7(相當于a7r)是7mb。批量操作時(shí),可以先發(fā)布批量任務(wù),然后采集好圖片即可,然后批量將批量圖片下載下來(lái)放在相機指定目錄即可。
“量光尺”可以回答這個(gè)問(wèn)題批量下載dng圖片教程dng下載批量下載dng圖片步驟1,文件分類(lèi),按照照片分別命名。例如“分辨率”、“位數”等。2,用批量下載軟件來(lái)批量下載到電腦。3,電腦選好圖片后,用郵件上傳至服務(wù)器。4,根據接收郵件中dng文件的路徑,上傳圖片。5,上傳成功后,等待服務(wù)器主動(dòng)下載。
設置每個(gè)圖片的md5,然后跟位數之類(lèi)的做比對,圖片的位數是以一個(gè)二進(jìn)制最高位為標準的,所以fg100的同一個(gè)圖片可能最高位是51,
可以將所有圖片用批量下載軟件處理,以r057223606下載文件為例,我們只需要將r057223606文件下載到電腦中,然后我們運行批量下載軟件處理完成, 查看全部
文章采集調用(“量光尺”可以回答這個(gè)問(wèn)題批量下載dng圖片教程)
文章采集調用的相機選項不同,例如所調用相機的可能性為jpeg、png、jpg、alpha?;蛘邔τ谀承┨厥飧袷剑ㄈ?jpg),可能會(huì )需要對相機進(jìn)行格式轉換,所以文件需要進(jìn)行另外設置,如bmp等。(不同廠(chǎng)商相機格式可能也會(huì )略有不同)文件大小因相機而異,反正有些m43相機(相當于sonyq5)是8mb,a7(相當于a7r)是7mb。批量操作時(shí),可以先發(fā)布批量任務(wù),然后采集好圖片即可,然后批量將批量圖片下載下來(lái)放在相機指定目錄即可。
“量光尺”可以回答這個(gè)問(wèn)題批量下載dng圖片教程dng下載批量下載dng圖片步驟1,文件分類(lèi),按照照片分別命名。例如“分辨率”、“位數”等。2,用批量下載軟件來(lái)批量下載到電腦。3,電腦選好圖片后,用郵件上傳至服務(wù)器。4,根據接收郵件中dng文件的路徑,上傳圖片。5,上傳成功后,等待服務(wù)器主動(dòng)下載。
設置每個(gè)圖片的md5,然后跟位數之類(lèi)的做比對,圖片的位數是以一個(gè)二進(jìn)制最高位為標準的,所以fg100的同一個(gè)圖片可能最高位是51,
可以將所有圖片用批量下載軟件處理,以r057223606下載文件為例,我們只需要將r057223606文件下載到電腦中,然后我們運行批量下載軟件處理完成,
文章采集調用(文章采集調用的視頻及文本字幕特征識別(s標簽))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 140 次瀏覽 ? 2021-09-24 00:55
文章采集調用的cv庫d2d2d,轉為json傳遞給jd2d進(jìn)行讀取相應標簽(s標簽)的視頻及文本字幕特征識別文本識別:text-rnn,
json格式對一個(gè)video進(jìn)行文本標注
轉為txt格式在jsonread函數中讀取
用jsonread讀取字幕數據
除了使用這些字幕數據之外,也可以嘗試用txt讀取器進(jìn)行txt格式的字幕數據抓取,
可以參考下面這個(gè)函數:jsonreader字幕讀取器pivot={"s":"theroute","i":"a1","o":"theroute","v":"photo","a":1,"b":1,"c":2,"d":3,"e":1,"f":"entry","g":"home","h":"scanner","g":"websearch","t":"video","j":"image","k":"red","m":"news","n":"popular's'}。
沒(méi)聽(tīng)說(shuō)過(guò)這個(gè)庫python最為知名的庫
現在有直接讀取視頻的腳本,github一搜一大把。但是你問(wèn)的是中文字幕的話(huà),這個(gè)我不知道。自己寫(xiě)過(guò)一個(gè)中文字幕讀取腳本,用一種自己常用的方法。搜了一下,發(fā)現這種方法很簡(jiǎn)單,就不獻丑了,可以百度學(xué)習下。 查看全部
文章采集調用(文章采集調用的視頻及文本字幕特征識別(s標簽))
文章采集調用的cv庫d2d2d,轉為json傳遞給jd2d進(jìn)行讀取相應標簽(s標簽)的視頻及文本字幕特征識別文本識別:text-rnn,
json格式對一個(gè)video進(jìn)行文本標注
轉為txt格式在jsonread函數中讀取
用jsonread讀取字幕數據
除了使用這些字幕數據之外,也可以嘗試用txt讀取器進(jìn)行txt格式的字幕數據抓取,
可以參考下面這個(gè)函數:jsonreader字幕讀取器pivot={"s":"theroute","i":"a1","o":"theroute","v":"photo","a":1,"b":1,"c":2,"d":3,"e":1,"f":"entry","g":"home","h":"scanner","g":"websearch","t":"video","j":"image","k":"red","m":"news","n":"popular's'}。
沒(méi)聽(tīng)說(shuō)過(guò)這個(gè)庫python最為知名的庫
現在有直接讀取視頻的腳本,github一搜一大把。但是你問(wèn)的是中文字幕的話(huà),這個(gè)我不知道。自己寫(xiě)過(guò)一個(gè)中文字幕讀取腳本,用一種自己常用的方法。搜了一下,發(fā)現這種方法很簡(jiǎn)單,就不獻丑了,可以百度學(xué)習下。
文章采集調用(文章調用別人的服務(wù)器實(shí)現站內搜索功能的方法)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 151 次瀏覽 ? 2021-09-23 02:01
文章采集調用文檔來(lái)采集文章,這就涉及到,平時(shí)看到的,朋友圈轉發(fā)的鏈接,這些都是能采集的,或者想采集的,一般編寫(xiě)好采集代碼就可以實(shí)現,也可以把采集的頁(yè)面地址放到我的網(wǎng)站里面去實(shí)現自動(dòng)采集也行。采集工具都是采集的別人的站點(diǎn)地址,可以通過(guò)編寫(xiě)采集代碼實(shí)現自動(dòng)采集的功能。了解更多干貨文章可以關(guān)注筆者公眾號:huangling_com,每天都有更新原創(chuàng )文章,歡迎大家來(lái)轉載,也可以通過(guò)留言,交流學(xué)習。
可以使用python的urllib.request去調用別人的服務(wù)器實(shí)現站內搜索功能。想自己實(shí)現的話(huà),我建議你學(xué)習python爬蟲(chóng)。
站內搜索的話(huà),應該能直接調用或京東的網(wǎng)站,否則你就得爬數十個(gè)國內站點(diǎn)。另外,京東應該不是所有商品都放在同一個(gè)商品頁(yè)面,有些商品是放在不同頁(yè)面上的,你得通過(guò)google或百度去找到目標商品頁(yè)面。另外,按你的需求,好像很多高傭的平臺也都能爬,比如京東、客、返利網(wǎng)等等。當然如果你想要有趣的東西的話(huà),我建議你找“全能搜索引擎google搜索”來(lái)練練手。
站內搜索還是比較麻煩的因為在同一商品頁(yè)面可能有多個(gè)搜索頁(yè)面。
我倒是知道直接爬取和京東的商品頁(yè)面。直接有太多的選擇了, 查看全部
文章采集調用(文章調用別人的服務(wù)器實(shí)現站內搜索功能的方法)
文章采集調用文檔來(lái)采集文章,這就涉及到,平時(shí)看到的,朋友圈轉發(fā)的鏈接,這些都是能采集的,或者想采集的,一般編寫(xiě)好采集代碼就可以實(shí)現,也可以把采集的頁(yè)面地址放到我的網(wǎng)站里面去實(shí)現自動(dòng)采集也行。采集工具都是采集的別人的站點(diǎn)地址,可以通過(guò)編寫(xiě)采集代碼實(shí)現自動(dòng)采集的功能。了解更多干貨文章可以關(guān)注筆者公眾號:huangling_com,每天都有更新原創(chuàng )文章,歡迎大家來(lái)轉載,也可以通過(guò)留言,交流學(xué)習。
可以使用python的urllib.request去調用別人的服務(wù)器實(shí)現站內搜索功能。想自己實(shí)現的話(huà),我建議你學(xué)習python爬蟲(chóng)。
站內搜索的話(huà),應該能直接調用或京東的網(wǎng)站,否則你就得爬數十個(gè)國內站點(diǎn)。另外,京東應該不是所有商品都放在同一個(gè)商品頁(yè)面,有些商品是放在不同頁(yè)面上的,你得通過(guò)google或百度去找到目標商品頁(yè)面。另外,按你的需求,好像很多高傭的平臺也都能爬,比如京東、客、返利網(wǎng)等等。當然如果你想要有趣的東西的話(huà),我建議你找“全能搜索引擎google搜索”來(lái)練練手。
站內搜索還是比較麻煩的因為在同一商品頁(yè)面可能有多個(gè)搜索頁(yè)面。
我倒是知道直接爬取和京東的商品頁(yè)面。直接有太多的選擇了,
文章采集調用(全網(wǎng)收錄最快百度快速收錄排名系統測試當天收錄無(wú)限裂變優(yōu)化權重必備)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 184 次瀏覽 ? 2021-09-21 11:23
收錄是全網(wǎng)最快的百度f(wàn)ast收錄排名系統。有必要在試驗當天優(yōu)化收錄無(wú)限裂變的重量
導言:
這組程序的運行環(huán)境是PHP環(huán)境。在網(wǎng)站目錄下創(chuàng )建一個(gè)輔助目錄,例如XX目錄。將程序放入這個(gè)XX目錄,并配置相關(guān)設置文件,包括關(guān)鍵詞、相關(guān)性文章、模板、標題等。該程序可以自動(dòng)拆分Web鏈接并將其推送到百度24小時(shí),以加速收錄。操作非常簡(jiǎn)單,有教程,一步一步詳細介紹!添加收錄并將必要的程序排列到主站
支持軟件:
1、關(guān)鍵詞采集軟件
采集幾個(gè)與關(guān)鍵詞相關(guān)的行業(yè)被插入到該計劃中,以?xún)?yōu)化排名
@K22文章和title采集軟件
點(diǎn)擊全自動(dòng)采集行業(yè)相關(guān)性文章和標題,軟件會(huì )自動(dòng)調用文章of采集來(lái)執行文章標題和內容,以增加內容相關(guān)性
3、自動(dòng)裂變百度推送軟件
自動(dòng)無(wú)限分割網(wǎng)頁(yè)鏈接并將其推送到百度,以加快蜘蛛爬行收錄
測試效果演示。測試已經(jīng)在收錄進(jìn)行了2天,一些關(guān)鍵詞已經(jīng)排名
有了視頻教程,設置起來(lái)很方便。如果你不明白,你可以看視頻來(lái)解決它
這個(gè)程序是由一個(gè)工作室開(kāi)發(fā)的。這個(gè)網(wǎng)站花了3999元獲得它?,F在以低價(jià)賣(mài)給新老客戶(hù)
PHP程序,自行研究。我們不提供免費的技術(shù)支持。我會(huì )原諒你的
把這個(gè)論壇放到程序目錄中測試效果
2021年4月7日百度收錄5W7432
2021年4月8日百度收錄7W0098
瘋狂收錄
另一個(gè)試驗場(chǎng)地效應
看到上面的數據是不是很棒?p>
發(fā)送百度推送軟件
百度推送軟件幫助您的網(wǎng)站引導百度蜘蛛爬行,并加速收錄魔術(shù)軟件
文件名:Baidu fast收錄ranking system.rar
元寶比例:10元=100元;售價(jià):3500元
下載權限:無(wú)限或VIP會(huì )員【購買(mǎi)VIP】【充值元寶】【拉大轉盤(pán)贏(yíng)取元寶】
安全檢測,請放心下載
售價(jià):350元=3500元 查看全部
文章采集調用(全網(wǎng)收錄最快百度快速收錄排名系統測試當天收錄無(wú)限裂變優(yōu)化權重必備)
收錄是全網(wǎng)最快的百度f(wàn)ast收錄排名系統。有必要在試驗當天優(yōu)化收錄無(wú)限裂變的重量
導言:
這組程序的運行環(huán)境是PHP環(huán)境。在網(wǎng)站目錄下創(chuàng )建一個(gè)輔助目錄,例如XX目錄。將程序放入這個(gè)XX目錄,并配置相關(guān)設置文件,包括關(guān)鍵詞、相關(guān)性文章、模板、標題等。該程序可以自動(dòng)拆分Web鏈接并將其推送到百度24小時(shí),以加速收錄。操作非常簡(jiǎn)單,有教程,一步一步詳細介紹!添加收錄并將必要的程序排列到主站
支持軟件:
1、關(guān)鍵詞采集軟件
采集幾個(gè)與關(guān)鍵詞相關(guān)的行業(yè)被插入到該計劃中,以?xún)?yōu)化排名
@K22文章和title采集軟件
點(diǎn)擊全自動(dòng)采集行業(yè)相關(guān)性文章和標題,軟件會(huì )自動(dòng)調用文章of采集來(lái)執行文章標題和內容,以增加內容相關(guān)性
3、自動(dòng)裂變百度推送軟件
自動(dòng)無(wú)限分割網(wǎng)頁(yè)鏈接并將其推送到百度,以加快蜘蛛爬行收錄
測試效果演示。測試已經(jīng)在收錄進(jìn)行了2天,一些關(guān)鍵詞已經(jīng)排名
有了視頻教程,設置起來(lái)很方便。如果你不明白,你可以看視頻來(lái)解決它
這個(gè)程序是由一個(gè)工作室開(kāi)發(fā)的。這個(gè)網(wǎng)站花了3999元獲得它?,F在以低價(jià)賣(mài)給新老客戶(hù)
PHP程序,自行研究。我們不提供免費的技術(shù)支持。我會(huì )原諒你的





把這個(gè)論壇放到程序目錄中測試效果

2021年4月7日百度收錄5W7432

2021年4月8日百度收錄7W0098

瘋狂收錄

另一個(gè)試驗場(chǎng)地效應



看到上面的數據是不是很棒?p>
發(fā)送百度推送軟件
百度推送軟件幫助您的網(wǎng)站引導百度蜘蛛爬行,并加速收錄魔術(shù)軟件

文件名:Baidu fast收錄ranking system.rar
元寶比例:10元=100元;售價(jià):3500元
下載權限:無(wú)限或VIP會(huì )員【購買(mǎi)VIP】【充值元寶】【拉大轉盤(pán)贏(yíng)取元寶】
安全檢測,請放心下載
售價(jià):350元=3500元
文章采集調用(引用計數策略和垃圾收集策略都屬于資源的自動(dòng)化管理)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 193 次瀏覽 ? 2021-09-21 05:01
源鏈接:
從本質(zhì)上講,引用計數策略和垃圾采集策略都屬于資源的自動(dòng)管理。所謂的自動(dòng)管理是指邏輯層不知道資源何時(shí)釋放,而是依靠底層庫來(lái)維持資源的生命周期
手動(dòng)管理可以準確地了解資源的生命周期,并在準確的位置回收資源。在C++中,析構函數指定用于刪除的資源,編譯器生成的代碼自動(dòng)析構函數基類(lèi)和成員變量
因此,為C++編寫(xiě)垃圾采集器與手動(dòng)管理資源并不沖突。幾乎所有大型C++項目都使用自動(dòng)化管理,但它使用引用計數策略,而不是垃圾采集。也就是說(shuō),長(cháng)期以來(lái),我們采用C++或C語(yǔ)言,將人工管理和自動(dòng)管理相結合來(lái)構建系統。無(wú)論是使用引用計數還是垃圾采集,我們仍然可以在軟件實(shí)現的細節中管理手動(dòng)管理
為什么使用自動(dòng)資源生命周期管理
讓我們看一下面向對象。如果一切都是一個(gè)物體,那么每個(gè)物體都應該對自己的生命負責。我們可以直接準確地確定死亡時(shí)間。不幸的是,很多東西都不是純對象。最重要的是對象容器。除了它們自己的屬性外,它們還維護對一組類(lèi)似對象的引用
一個(gè)對象可以被多個(gè)容器引用,這使得容器不同于貓和狗的對象實(shí)體。因為容器指的是一個(gè)事物,它并不意味著(zhù)它是容器的一部分(有時(shí)可以,有時(shí)不能)。當我們想把整個(gè)世界分成物體,所有原子都分成各個(gè)層次的物體時(shí),我們會(huì )發(fā)現,物體無(wú)法提取的概念總數為零。引用而不是擁有是不可避免的
面向對象的本質(zhì)是從許多對象中提取共性,并將它們一起處理。這樣,各種容器的使用是不可避免的
同樣,該對象不知道他是否可以宣布死亡。除非您知道自己與其他對象的關(guān)系(此關(guān)系不是對象)。資源可以是對象,而自動(dòng)管理就是管理這些對象和對象之間的關(guān)系
引用計數是最容易實(shí)現的解決方案:記錄對象被引用的次數,而不具體記錄引用對象的人。這樣,建立和取消引用的成本就降低了。然而,也有得失。在引用計數的過(guò)程中,我們也丟失了重要的信息:誰(shuí)引用了我們自己。因此,在處理間接引用時(shí),引用計數的成本更高
物體死亡的判斷是物體是否與世界有直接或間接的聯(lián)系。因此,即使一個(gè)對象被另一個(gè)對象直接引用,該對象也可能不存在。為了解決這個(gè)問(wèn)題,使用引用計數的系統必須在與世界斷開(kāi)連接時(shí)通知與其關(guān)聯(lián)的對象。目標銷(xiāo)毀成本的增加是參考計數策略的短板
物體的破壞頻率取決于物體的平均壽命。一方面,對象的生存時(shí)間受對象粒度的影響。對象粒度越細,對象的平均生存時(shí)間越短(雖然表面上沒(méi)有直接聯(lián)系,但在實(shí)際設計中往往會(huì )導致這種結果);另一方面,我們通常將容器和引用關(guān)系實(shí)現為一個(gè)對象(概念上,它不應該是一個(gè)對象)。例如,許多自動(dòng)維護引用計數的智能指針是一個(gè)小容器,其中收錄對對象的唯一引用,并且它是作為一個(gè)小對象實(shí)現的
通常,對象本身的性質(zhì)不會(huì )隨其在內存空間中的位置而改變。但是,引用關(guān)系(通常用指針實(shí)現)與內存地址有關(guān)。C++缺少用于在內存中移動(dòng)對象的語(yǔ)義表達式。等效的方法是在一個(gè)新的內存塊中復制和構造一個(gè)新對象,并銷(xiāo)毀原創(chuàng )對象
另一方面,在程序的運行序列中,由函數調用引起的堆棧上的嵌套作用域也可以視為容器。機器指令通過(guò)這些作用域,臨時(shí)構造的對象引用(智能指針)被放置在這些作用域中。函數調用越頻繁,創(chuàng )建和銷(xiāo)毀這些作用域的頻率就越高
因此,C++必須依賴(lài)大量的內聯(lián)函數來(lái)讓編譯器知道更多的上下文信息,從而減少創(chuàng )建和銷(xiāo)毀小對象(智能指針)的負擔。STL庫也必須優(yōu)化。例如,在STL端口中,pod類(lèi)型被視為特例。不幸的是,智能指針不是pod,這使得編譯器足夠智能,可以在執行序列中合并引用的加減,這太困難了(考慮到多線(xiàn)程因素,除非編譯器知道線(xiàn)程信息,否則幾乎不可能實(shí)現)
在實(shí)現面向對象編程方面,C++比C更方便。其中之一是,當描述一個(gè)對象是另一個(gè)對象的一部分時(shí),可以通過(guò)構造和析構函數機制自動(dòng)維護相關(guān)部分的生命周期。但它在語(yǔ)言中未能解決的是,當兩者之間只有一個(gè)參照關(guān)系時(shí),如何處理生命周期。對于前者,我們幾乎只有簡(jiǎn)潔明了的解決方案;后者可以根據實(shí)際需要有多種選擇,而C++在語(yǔ)言級別上沒(méi)有提供一致的解決方案。不幸的是,C++始終能夠提供一個(gè)簡(jiǎn)潔且易于使用的通用GC庫。我們都喜歡比較容易實(shí)現的參考計數方案。這一結果與具體實(shí)現的復雜性有關(guān)。畢竟,在實(shí)現GC時(shí),C缺乏必要的語(yǔ)言支持(C++是在實(shí)現級別從C開(kāi)發(fā)的)
讓我們看看垃圾采集。更成熟的算法基于標記移除(或標記排序)或其變體。簡(jiǎn)而言之,采集器框架記錄對象之間的關(guān)系(存儲這些聯(lián)系信息的位置并不重要。它可以位于對象的內存布局空間中,也可以位于獨立的位置。關(guān)鍵是采集器可以訪(fǎng)問(wèn)這些信息)。確定世界的根,定期從此根遍歷世界,標記關(guān)聯(lián)的對象,最后回收未標記的對象
從算法的角度來(lái)看,建立對象之間連接的時(shí)間開(kāi)銷(xiāo)和參考計數的時(shí)間開(kāi)銷(xiāo)在數量級上是相同的,兩者都是o(1))。然而,在實(shí)際實(shí)施中,前者的成本通常較高??臻g成本也略高,但在數量級上沒(méi)有差別
銷(xiāo)毀GC管理的對象的成本要低得多。它不需要通知與其關(guān)聯(lián)的對象
這就是為什么許多使用GC的軟件有時(shí)比使用引用計數的軟件更高效的原因
然而,GC在標記過(guò)程中需要額外的時(shí)間成本。完成一個(gè)完整的清潔過(guò)程必須穿越世界上每一個(gè)有生命的物體。成本為O(n),n隨著(zhù)對象總數的增加而增加。因此,我們應該減少GC管理的對象數量。在這方面,手工管理仍然是有意義的。也就是說(shuō),當一個(gè)對象顯然是另一個(gè)對象的一部分時(shí),可以考慮手動(dòng)管理
另一個(gè)缺點(diǎn)是,在實(shí)現時(shí),我們經(jīng)常將對象之間的關(guān)聯(lián)信息放在對象本身的內存布局空間中。在這個(gè)世界上遍歷對象意味著(zhù)訪(fǎng)問(wèn)所有對象的內存。當虛擬內存空間大于實(shí)際物理內存空間時(shí),表示頁(yè)面交換。我認為,在很大程度上,Java或c#等語(yǔ)言是一起使用的。構建的龐大系統有時(shí)運行緩慢,這是根本原因。當然,這些是可以改進(jìn)的。這不是算法本身的問(wèn)題
可以說(shuō),GC(垃圾采集)將RC(引用計數)中短期對象的銷(xiāo)毀成本轉移到一次性標記移除過(guò)程中。這是邏輯處理和資源管理的正交分解。隨著(zhù)硬件的進(jìn)步(如多核開(kāi)發(fā)),這種分解問(wèn)題將更容易提高性能,但是,這種優(yōu)勢在小型軟件或獨立模塊中并不明顯。相反,GC本身的復雜性遠遠高于RC,這將成為它的弱點(diǎn)
對于不需要面向對象軟件,甚至不需要自動(dòng)資源管理的軟件,GC或RC是無(wú)用的
我做的簡(jiǎn)單垃圾采集器只是想在為C或C++語(yǔ)言構建軟件時(shí)做一些簡(jiǎn)單的嘗試并做出更多的選擇
從本質(zhì)上講,引用計數策略和垃圾采集策略都屬于資源的自動(dòng)管理。所謂自動(dòng)管理是指邏輯層不知道資源何時(shí)釋放,而是依賴(lài)底層庫來(lái)維護資源的生命周期
在C++中,析構函數指定用于刪除的資源,編譯器生成的代碼自動(dòng)構造基類(lèi)和成員變量
因此,為C++編寫(xiě)垃圾采集器與手動(dòng)資源管理沒(méi)有沖突。自動(dòng)化管理在一個(gè)系統中使用 查看全部
文章采集調用(引用計數策略和垃圾收集策略都屬于資源的自動(dòng)化管理)
源鏈接:
從本質(zhì)上講,引用計數策略和垃圾采集策略都屬于資源的自動(dòng)管理。所謂的自動(dòng)管理是指邏輯層不知道資源何時(shí)釋放,而是依靠底層庫來(lái)維持資源的生命周期
手動(dòng)管理可以準確地了解資源的生命周期,并在準確的位置回收資源。在C++中,析構函數指定用于刪除的資源,編譯器生成的代碼自動(dòng)析構函數基類(lèi)和成員變量
因此,為C++編寫(xiě)垃圾采集器與手動(dòng)管理資源并不沖突。幾乎所有大型C++項目都使用自動(dòng)化管理,但它使用引用計數策略,而不是垃圾采集。也就是說(shuō),長(cháng)期以來(lái),我們采用C++或C語(yǔ)言,將人工管理和自動(dòng)管理相結合來(lái)構建系統。無(wú)論是使用引用計數還是垃圾采集,我們仍然可以在軟件實(shí)現的細節中管理手動(dòng)管理
為什么使用自動(dòng)資源生命周期管理
讓我們看一下面向對象。如果一切都是一個(gè)物體,那么每個(gè)物體都應該對自己的生命負責。我們可以直接準確地確定死亡時(shí)間。不幸的是,很多東西都不是純對象。最重要的是對象容器。除了它們自己的屬性外,它們還維護對一組類(lèi)似對象的引用
一個(gè)對象可以被多個(gè)容器引用,這使得容器不同于貓和狗的對象實(shí)體。因為容器指的是一個(gè)事物,它并不意味著(zhù)它是容器的一部分(有時(shí)可以,有時(shí)不能)。當我們想把整個(gè)世界分成物體,所有原子都分成各個(gè)層次的物體時(shí),我們會(huì )發(fā)現,物體無(wú)法提取的概念總數為零。引用而不是擁有是不可避免的
面向對象的本質(zhì)是從許多對象中提取共性,并將它們一起處理。這樣,各種容器的使用是不可避免的
同樣,該對象不知道他是否可以宣布死亡。除非您知道自己與其他對象的關(guān)系(此關(guān)系不是對象)。資源可以是對象,而自動(dòng)管理就是管理這些對象和對象之間的關(guān)系
引用計數是最容易實(shí)現的解決方案:記錄對象被引用的次數,而不具體記錄引用對象的人。這樣,建立和取消引用的成本就降低了。然而,也有得失。在引用計數的過(guò)程中,我們也丟失了重要的信息:誰(shuí)引用了我們自己。因此,在處理間接引用時(shí),引用計數的成本更高
物體死亡的判斷是物體是否與世界有直接或間接的聯(lián)系。因此,即使一個(gè)對象被另一個(gè)對象直接引用,該對象也可能不存在。為了解決這個(gè)問(wèn)題,使用引用計數的系統必須在與世界斷開(kāi)連接時(shí)通知與其關(guān)聯(lián)的對象。目標銷(xiāo)毀成本的增加是參考計數策略的短板
物體的破壞頻率取決于物體的平均壽命。一方面,對象的生存時(shí)間受對象粒度的影響。對象粒度越細,對象的平均生存時(shí)間越短(雖然表面上沒(méi)有直接聯(lián)系,但在實(shí)際設計中往往會(huì )導致這種結果);另一方面,我們通常將容器和引用關(guān)系實(shí)現為一個(gè)對象(概念上,它不應該是一個(gè)對象)。例如,許多自動(dòng)維護引用計數的智能指針是一個(gè)小容器,其中收錄對對象的唯一引用,并且它是作為一個(gè)小對象實(shí)現的
通常,對象本身的性質(zhì)不會(huì )隨其在內存空間中的位置而改變。但是,引用關(guān)系(通常用指針實(shí)現)與內存地址有關(guān)。C++缺少用于在內存中移動(dòng)對象的語(yǔ)義表達式。等效的方法是在一個(gè)新的內存塊中復制和構造一個(gè)新對象,并銷(xiāo)毀原創(chuàng )對象
另一方面,在程序的運行序列中,由函數調用引起的堆棧上的嵌套作用域也可以視為容器。機器指令通過(guò)這些作用域,臨時(shí)構造的對象引用(智能指針)被放置在這些作用域中。函數調用越頻繁,創(chuàng )建和銷(xiāo)毀這些作用域的頻率就越高
因此,C++必須依賴(lài)大量的內聯(lián)函數來(lái)讓編譯器知道更多的上下文信息,從而減少創(chuàng )建和銷(xiāo)毀小對象(智能指針)的負擔。STL庫也必須優(yōu)化。例如,在STL端口中,pod類(lèi)型被視為特例。不幸的是,智能指針不是pod,這使得編譯器足夠智能,可以在執行序列中合并引用的加減,這太困難了(考慮到多線(xiàn)程因素,除非編譯器知道線(xiàn)程信息,否則幾乎不可能實(shí)現)
在實(shí)現面向對象編程方面,C++比C更方便。其中之一是,當描述一個(gè)對象是另一個(gè)對象的一部分時(shí),可以通過(guò)構造和析構函數機制自動(dòng)維護相關(guān)部分的生命周期。但它在語(yǔ)言中未能解決的是,當兩者之間只有一個(gè)參照關(guān)系時(shí),如何處理生命周期。對于前者,我們幾乎只有簡(jiǎn)潔明了的解決方案;后者可以根據實(shí)際需要有多種選擇,而C++在語(yǔ)言級別上沒(méi)有提供一致的解決方案。不幸的是,C++始終能夠提供一個(gè)簡(jiǎn)潔且易于使用的通用GC庫。我們都喜歡比較容易實(shí)現的參考計數方案。這一結果與具體實(shí)現的復雜性有關(guān)。畢竟,在實(shí)現GC時(shí),C缺乏必要的語(yǔ)言支持(C++是在實(shí)現級別從C開(kāi)發(fā)的)
讓我們看看垃圾采集。更成熟的算法基于標記移除(或標記排序)或其變體。簡(jiǎn)而言之,采集器框架記錄對象之間的關(guān)系(存儲這些聯(lián)系信息的位置并不重要。它可以位于對象的內存布局空間中,也可以位于獨立的位置。關(guān)鍵是采集器可以訪(fǎng)問(wèn)這些信息)。確定世界的根,定期從此根遍歷世界,標記關(guān)聯(lián)的對象,最后回收未標記的對象
從算法的角度來(lái)看,建立對象之間連接的時(shí)間開(kāi)銷(xiāo)和參考計數的時(shí)間開(kāi)銷(xiāo)在數量級上是相同的,兩者都是o(1))。然而,在實(shí)際實(shí)施中,前者的成本通常較高??臻g成本也略高,但在數量級上沒(méi)有差別
銷(xiāo)毀GC管理的對象的成本要低得多。它不需要通知與其關(guān)聯(lián)的對象
這就是為什么許多使用GC的軟件有時(shí)比使用引用計數的軟件更高效的原因
然而,GC在標記過(guò)程中需要額外的時(shí)間成本。完成一個(gè)完整的清潔過(guò)程必須穿越世界上每一個(gè)有生命的物體。成本為O(n),n隨著(zhù)對象總數的增加而增加。因此,我們應該減少GC管理的對象數量。在這方面,手工管理仍然是有意義的。也就是說(shuō),當一個(gè)對象顯然是另一個(gè)對象的一部分時(shí),可以考慮手動(dòng)管理
另一個(gè)缺點(diǎn)是,在實(shí)現時(shí),我們經(jīng)常將對象之間的關(guān)聯(lián)信息放在對象本身的內存布局空間中。在這個(gè)世界上遍歷對象意味著(zhù)訪(fǎng)問(wèn)所有對象的內存。當虛擬內存空間大于實(shí)際物理內存空間時(shí),表示頁(yè)面交換。我認為,在很大程度上,Java或c#等語(yǔ)言是一起使用的。構建的龐大系統有時(shí)運行緩慢,這是根本原因。當然,這些是可以改進(jìn)的。這不是算法本身的問(wèn)題
可以說(shuō),GC(垃圾采集)將RC(引用計數)中短期對象的銷(xiāo)毀成本轉移到一次性標記移除過(guò)程中。這是邏輯處理和資源管理的正交分解。隨著(zhù)硬件的進(jìn)步(如多核開(kāi)發(fā)),這種分解問(wèn)題將更容易提高性能,但是,這種優(yōu)勢在小型軟件或獨立模塊中并不明顯。相反,GC本身的復雜性遠遠高于RC,這將成為它的弱點(diǎn)
對于不需要面向對象軟件,甚至不需要自動(dòng)資源管理的軟件,GC或RC是無(wú)用的
我做的簡(jiǎn)單垃圾采集器只是想在為C或C++語(yǔ)言構建軟件時(shí)做一些簡(jiǎn)單的嘗試并做出更多的選擇
從本質(zhì)上講,引用計數策略和垃圾采集策略都屬于資源的自動(dòng)管理。所謂自動(dòng)管理是指邏輯層不知道資源何時(shí)釋放,而是依賴(lài)底層庫來(lái)維護資源的生命周期
在C++中,析構函數指定用于刪除的資源,編譯器生成的代碼自動(dòng)構造基類(lèi)和成員變量
因此,為C++編寫(xiě)垃圾采集器與手動(dòng)資源管理沒(méi)有沖突。自動(dòng)化管理在一個(gè)系統中使用
文章采集調用(Java?清潔工程師BrianGoetz探究了弱引用(weakreferences)問(wèn)題)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 148 次瀏覽 ? 2021-09-19 16:07
在Java理論與實(shí)踐的前一期文章中,Java? 清理工程師Brian Goetz探索弱引用,它允許您警告垃圾采集器您希望維護對對象的引用,而不阻止對象被垃圾采集。在本期文章中,他將解釋另一種形式的引用對象,軟引用,以幫助垃圾采集器管理內存使用并消除潛在的內存泄漏
垃圾采集可以防止Java程序內存泄漏,至少對于“內存泄漏”的狹義定義來(lái)說(shuō)是這樣,但這并不意味著(zhù)我們可以完全忽略Java程序中的對象生存期問(wèn)題。當我們沒(méi)有對對象生命周期給予足夠的關(guān)注或打破了管理對象生命周期的標準機制時(shí),Java程序中經(jīng)常會(huì )發(fā)生內存泄漏。例如,上次我們看到,在嘗試將元數據與臨時(shí)對象關(guān)聯(lián)時(shí),未能劃分對象的生命周期可能會(huì )導致意外的對象保留。還有其他類(lèi)似的情況會(huì )忽略或破壞對象生命周期管理,并導致內存泄漏
對象分離
清單1中的leakychecksum類(lèi)說(shuō)明了一種形式的內存泄漏,有時(shí)稱(chēng)為對象游蕩,其中使用getfilechecksum()方法計算文件內容的校驗和。getfilechecksum()方法將文件內容讀入緩沖區以計算校驗和。更直觀(guān)的實(shí)現只是在getfilechecksum()中將緩沖區作為局部變量分配,但是這個(gè)版本比那個(gè)版本更“智能”,而不是在實(shí)例字段中緩存緩沖區以減少內存流失。這種“優(yōu)化”通常不會(huì )帶來(lái)預期的效益;對象分配比許多人預期的要便宜。(還要注意,將緩沖區從局部變量提升到實(shí)例變量會(huì )使類(lèi)在沒(méi)有額外同步的情況下不再是線(xiàn)程安全的。直觀(guān)的實(shí)現不需要將getfilechecksum()聲明為已同步,并且在同時(shí)調用時(shí)將提供更好的可伸縮性。)
清單1.顯示了“對象分離”類(lèi)
//BADCODE-DONOTE公式
publicclassLeakyChecksum{
privatebyte[]字節數組
PublicSynchronizedEntGetFileChecksum(StringfileName){
intlen=getFileSize(文件名)
if(bytearray==null | | bytearray.Length)管理。后一個(gè)選項通常更好,因為它為垃圾采集器帶來(lái)更少的工作,并允許在特別需要內存時(shí)以更少的工作回收整個(gè)緩存。弱引用有時(shí)被錯誤地用于替換軟引用來(lái)構建緩存,但這將導致緩存性能差。實(shí)際上,弱引用會(huì )在圖像變弱后(通常在再次使用緩存對象之前)迅速清除它們嗎?因為小型垃圾采集經(jīng)常運行
對于性能?chē)乐匾蕾?lài)緩存的應用程序,軟引用是一種無(wú)用的手段。它確實(shí)無(wú)法取代復雜的緩存框架,該框架可以提供靈活的終止、復制和事務(wù)緩存。但是,作為一種“廉價(jià)且骯臟”的緩存機制,降低價(jià)格非常有吸引力
與弱引用一樣,還可以使用關(guān)聯(lián)的引用隊列創(chuàng )建軟引用,該隊列在垃圾回收器清除時(shí)進(jìn)入隊列。引用隊列對于軟引用沒(méi)有弱引用有用,但它們可以用于發(fā)出應用程序內存開(kāi)始耗盡的管理警報
垃圾采集器如何處理引用
弱引用和軟引用都擴展了抽象引用類(lèi)(幻影引用也是如此,稍后將在文章中描述)。引用對象由垃圾回收器以特殊方式處理。當垃圾回收器在跟蹤堆期間遇到引用對象時(shí),它不會(huì )標記或跟蹤引用對象,而是將引用放置在已知活動(dòng)引用對象的隊列上。在跟蹤之后,垃圾回收器會(huì )識別軟訪(fǎng)問(wèn)對象嗎?除軟引用外,這些對象上沒(méi)有強引用。垃圾回收器根據當前采集回收的內存總量和其他策略注意事項確定此時(shí)是否需要清除軟引用。如果要清除的軟引用具有相應的引用隊列,則y將進(jìn)入隊列。剩余的軟訪(fǎng)問(wèn)對象(未清除的對象)將被視為根集,堆跟蹤將繼續使用這些新根,以便可以標記通過(guò)活動(dòng)軟引用訪(fǎng)問(wèn)的對象
處理軟引用后,將標識弱可及對象的集合?此類(lèi)對象上沒(méi)有強引用或軟引用。這些對象將被清除并排隊。所有引用類(lèi)型在排隊之前都會(huì )被清除,因此將進(jìn)行事后處理。清除的線(xiàn)程將永遠無(wú)法訪(fǎng)問(wèn)引用對象,但t僅指向引用對象。因此,當引用與引用隊列一起使用時(shí),通常需要細分適當的引用類(lèi)型,并在設計中直接使用它(如weakhashmap,其map.entry擴展了WeakReference)或存儲對需要清除的實(shí)體的引用
參考處理的性能成本
引用對象會(huì )給垃圾采集過(guò)程帶來(lái)一些額外的成本。對于每個(gè)垃圾采集,必須構造一個(gè)活動(dòng)引用對象的列表,并且必須適當地處理每個(gè)引用,這會(huì )增加每個(gè)采集的每個(gè)引用的一些開(kāi)銷(xiāo),而不管此時(shí)是否采集引用引用對象本身接受垃圾采集,并且可以在引用對象之前進(jìn)行采集,在這種情況下,它們不會(huì )添加到隊列中
基于數組的集合
當使用數組實(shí)現堆?;颦h(huán)形緩沖區等數據結構時(shí),會(huì )出現另一種形式的對象分離在該方法中,在頂部指針遞減后,元素仍然保留對將彈出堆棧的對象的引用。這意味著(zhù)對該對象的引用仍然可以被程序訪(fǎng)問(wèn)(即使程序實(shí)際上不會(huì )使用該引用),它防止對象被垃圾采集,直到該位置被future push()重用為止
在基于數組的集合中列出3.對象
publicclassLeakyStack{
privateObject[]元素=新對象[MAX_元素]
privateintsize=0
publicvoidpush(Objecto){elements[size++]=o;}
publicObjectpop(){
如果(大小==0)
thrownewmptystackexception()
否則{
Objectresult=元素[--size]
//元素[大小+1]=空
返回結果
}
}
}
結論
與弱引用一樣,軟引用通過(guò)利用垃圾采集器在做出緩存采集決策時(shí)的幫助,有助于防止應用程序中的對象漂移。只有當應用程序能夠容忍大量軟引用對象時(shí),軟引用才適用
參考資料:
您可以在developerWorks全球網(wǎng)站上參考本文的英文原文
“Java理論與實(shí)踐:用弱引用阻止內存泄漏”:上一期《Java理論與實(shí)踐》介紹了類(lèi)似的軟引用
“關(guān)注性能:調優(yōu)垃圾回收”:kirkpepperdine和JackShirazi證明,即使是緩慢的內存泄漏最終也會(huì )給垃圾回收器帶來(lái)巨大壓力
引用對象和垃圾采集:本文由sun在引用對象添加到類(lèi)庫后不久撰寫(xiě),描述垃圾采集器如何處理引用對象
Java理論與實(shí)踐:Brian Goetz的完整系列
Java技術(shù)專(zhuān)區:數百篇關(guān)于Java編程文章各個(gè)方面的文章@
獲得產(chǎn)品和技術(shù)
Jtune:這個(gè)免費的Jtune工具利用GC日志,以圖形方式顯示堆大小、GC持續時(shí)間和其他有用的內存管理數據 查看全部
文章采集調用(Java?清潔工程師BrianGoetz探究了弱引用(weakreferences)問(wèn)題)
在Java理論與實(shí)踐的前一期文章中,Java? 清理工程師Brian Goetz探索弱引用,它允許您警告垃圾采集器您希望維護對對象的引用,而不阻止對象被垃圾采集。在本期文章中,他將解釋另一種形式的引用對象,軟引用,以幫助垃圾采集器管理內存使用并消除潛在的內存泄漏
垃圾采集可以防止Java程序內存泄漏,至少對于“內存泄漏”的狹義定義來(lái)說(shuō)是這樣,但這并不意味著(zhù)我們可以完全忽略Java程序中的對象生存期問(wèn)題。當我們沒(méi)有對對象生命周期給予足夠的關(guān)注或打破了管理對象生命周期的標準機制時(shí),Java程序中經(jīng)常會(huì )發(fā)生內存泄漏。例如,上次我們看到,在嘗試將元數據與臨時(shí)對象關(guān)聯(lián)時(shí),未能劃分對象的生命周期可能會(huì )導致意外的對象保留。還有其他類(lèi)似的情況會(huì )忽略或破壞對象生命周期管理,并導致內存泄漏
對象分離
清單1中的leakychecksum類(lèi)說(shuō)明了一種形式的內存泄漏,有時(shí)稱(chēng)為對象游蕩,其中使用getfilechecksum()方法計算文件內容的校驗和。getfilechecksum()方法將文件內容讀入緩沖區以計算校驗和。更直觀(guān)的實(shí)現只是在getfilechecksum()中將緩沖區作為局部變量分配,但是這個(gè)版本比那個(gè)版本更“智能”,而不是在實(shí)例字段中緩存緩沖區以減少內存流失。這種“優(yōu)化”通常不會(huì )帶來(lái)預期的效益;對象分配比許多人預期的要便宜。(還要注意,將緩沖區從局部變量提升到實(shí)例變量會(huì )使類(lèi)在沒(méi)有額外同步的情況下不再是線(xiàn)程安全的。直觀(guān)的實(shí)現不需要將getfilechecksum()聲明為已同步,并且在同時(shí)調用時(shí)將提供更好的可伸縮性。)
清單1.顯示了“對象分離”類(lèi)
//BADCODE-DONOTE公式
publicclassLeakyChecksum{
privatebyte[]字節數組
PublicSynchronizedEntGetFileChecksum(StringfileName){
intlen=getFileSize(文件名)
if(bytearray==null | | bytearray.Length)管理。后一個(gè)選項通常更好,因為它為垃圾采集器帶來(lái)更少的工作,并允許在特別需要內存時(shí)以更少的工作回收整個(gè)緩存。弱引用有時(shí)被錯誤地用于替換軟引用來(lái)構建緩存,但這將導致緩存性能差。實(shí)際上,弱引用會(huì )在圖像變弱后(通常在再次使用緩存對象之前)迅速清除它們嗎?因為小型垃圾采集經(jīng)常運行
對于性能?chē)乐匾蕾?lài)緩存的應用程序,軟引用是一種無(wú)用的手段。它確實(shí)無(wú)法取代復雜的緩存框架,該框架可以提供靈活的終止、復制和事務(wù)緩存。但是,作為一種“廉價(jià)且骯臟”的緩存機制,降低價(jià)格非常有吸引力
與弱引用一樣,還可以使用關(guān)聯(lián)的引用隊列創(chuàng )建軟引用,該隊列在垃圾回收器清除時(shí)進(jìn)入隊列。引用隊列對于軟引用沒(méi)有弱引用有用,但它們可以用于發(fā)出應用程序內存開(kāi)始耗盡的管理警報
垃圾采集器如何處理引用
弱引用和軟引用都擴展了抽象引用類(lèi)(幻影引用也是如此,稍后將在文章中描述)。引用對象由垃圾回收器以特殊方式處理。當垃圾回收器在跟蹤堆期間遇到引用對象時(shí),它不會(huì )標記或跟蹤引用對象,而是將引用放置在已知活動(dòng)引用對象的隊列上。在跟蹤之后,垃圾回收器會(huì )識別軟訪(fǎng)問(wèn)對象嗎?除軟引用外,這些對象上沒(méi)有強引用。垃圾回收器根據當前采集回收的內存總量和其他策略注意事項確定此時(shí)是否需要清除軟引用。如果要清除的軟引用具有相應的引用隊列,則y將進(jìn)入隊列。剩余的軟訪(fǎng)問(wèn)對象(未清除的對象)將被視為根集,堆跟蹤將繼續使用這些新根,以便可以標記通過(guò)活動(dòng)軟引用訪(fǎng)問(wèn)的對象
處理軟引用后,將標識弱可及對象的集合?此類(lèi)對象上沒(méi)有強引用或軟引用。這些對象將被清除并排隊。所有引用類(lèi)型在排隊之前都會(huì )被清除,因此將進(jìn)行事后處理。清除的線(xiàn)程將永遠無(wú)法訪(fǎng)問(wèn)引用對象,但t僅指向引用對象。因此,當引用與引用隊列一起使用時(shí),通常需要細分適當的引用類(lèi)型,并在設計中直接使用它(如weakhashmap,其map.entry擴展了WeakReference)或存儲對需要清除的實(shí)體的引用
參考處理的性能成本
引用對象會(huì )給垃圾采集過(guò)程帶來(lái)一些額外的成本。對于每個(gè)垃圾采集,必須構造一個(gè)活動(dòng)引用對象的列表,并且必須適當地處理每個(gè)引用,這會(huì )增加每個(gè)采集的每個(gè)引用的一些開(kāi)銷(xiāo),而不管此時(shí)是否采集引用引用對象本身接受垃圾采集,并且可以在引用對象之前進(jìn)行采集,在這種情況下,它們不會(huì )添加到隊列中
基于數組的集合
當使用數組實(shí)現堆?;颦h(huán)形緩沖區等數據結構時(shí),會(huì )出現另一種形式的對象分離在該方法中,在頂部指針遞減后,元素仍然保留對將彈出堆棧的對象的引用。這意味著(zhù)對該對象的引用仍然可以被程序訪(fǎng)問(wèn)(即使程序實(shí)際上不會(huì )使用該引用),它防止對象被垃圾采集,直到該位置被future push()重用為止
在基于數組的集合中列出3.對象
publicclassLeakyStack{
privateObject[]元素=新對象[MAX_元素]
privateintsize=0
publicvoidpush(Objecto){elements[size++]=o;}
publicObjectpop(){
如果(大小==0)
thrownewmptystackexception()
否則{
Objectresult=元素[--size]
//元素[大小+1]=空
返回結果
}
}
}
結論
與弱引用一樣,軟引用通過(guò)利用垃圾采集器在做出緩存采集決策時(shí)的幫助,有助于防止應用程序中的對象漂移。只有當應用程序能夠容忍大量軟引用對象時(shí),軟引用才適用
參考資料:
您可以在developerWorks全球網(wǎng)站上參考本文的英文原文
“Java理論與實(shí)踐:用弱引用阻止內存泄漏”:上一期《Java理論與實(shí)踐》介紹了類(lèi)似的軟引用
“關(guān)注性能:調優(yōu)垃圾回收”:kirkpepperdine和JackShirazi證明,即使是緩慢的內存泄漏最終也會(huì )給垃圾回收器帶來(lái)巨大壓力
引用對象和垃圾采集:本文由sun在引用對象添加到類(lèi)庫后不久撰寫(xiě),描述垃圾采集器如何處理引用對象
Java理論與實(shí)踐:Brian Goetz的完整系列
Java技術(shù)專(zhuān)區:數百篇關(guān)于Java編程文章各個(gè)方面的文章@
獲得產(chǎn)品和技術(shù)
Jtune:這個(gè)免費的Jtune工具利用GC日志,以圖形方式顯示堆大小、GC持續時(shí)間和其他有用的內存管理數據
文章采集調用(【干貨】強引用、軟引用和幻象引用有什么區別?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 202 次瀏覽 ? 2021-09-19 16:05
強參考、軟參考、弱參考和幻影參考之間有什么區別
1.definition
強引用是最常見(jiàn)的對象引用。只要有一個(gè)指向某個(gè)對象的強引用,它就可以指示該對象仍然是“活動(dòng)的”,并且垃圾采集器不會(huì )接觸該對象。對于普通對象,如果沒(méi)有其他引用關(guān)系,只要它超出引用的范圍或顯式地將相應的(強)引用分配給null,就可以對其進(jìn)行垃圾采集。當然,具體的回收時(shí)間取決于垃圾采集策略
特點(diǎn):在我們典型的代碼中,Obj=newobject()是一個(gè)很強的引用。與關(guān)鍵字new創(chuàng )建的對象關(guān)聯(lián)的引用是強引用。當JVM內存空間不足時(shí),JVM寧愿拋出OfMemoryError runtime error(OOM),使程序異常終止,也不愿通過(guò)任意回收具有強引用的“活動(dòng)”對象來(lái)解決內存不足的問(wèn)題。對于普通對象,如果沒(méi)有其他引用關(guān)系,只要它超出引用的范圍或顯式地將相應的(強)引用分配給null,就可以對其進(jìn)行垃圾采集。具體的回收時(shí)間取決于垃圾采集策略
軟引用是一種相對較強和較弱的引用,它可以使對象免于某些垃圾采集。只有當JVM認為內存不足時(shí),才會(huì )嘗試回收軟引用指向的對象。JVM確保在拋出outofmemoryerror之前清除軟引用指向的對象。軟引用通常用于實(shí)現內存敏感緩存。如果有空閑內存,可以臨時(shí)保留緩存,并在內存不足時(shí)進(jìn)行清理,以確保在使用緩存時(shí)不會(huì )耗盡內存
特點(diǎn):軟參考通過(guò)軟參考類(lèi)實(shí)現。軟參考文獻的生命周期短于強參考文獻。只有當JVM認為內存不足時(shí),才會(huì )嘗試回收軟引用指向的對象:也就是說(shuō),JVM將確保在拋出outofmemoryerror之前清除軟引用指向的對象。軟引用可以與引用隊列一起使用。如果軟引用引用的對象被垃圾采集器回收,Java虛擬機將把軟引用添加到關(guān)聯(lián)的引用隊列中。稍后,我們可以調用ReferenceQueue的poll()方法來(lái)檢查它所關(guān)心的對象是否被回收。如果隊列為空,則返回null;否則,該方法將返回隊列前面的引用對象
應用場(chǎng)景:軟引用通常用于實(shí)現對內存敏感的緩存。如果仍有可用內存,您可以暫時(shí)保留緩存,并在內存不足時(shí)將其清除,以確保緩存在使用時(shí)不會(huì )耗盡內存
弱引用不會(huì )免除對象的垃圾采集,但只提供了一種訪(fǎng)問(wèn)處于弱引用狀態(tài)的對象的方法。這可以用于構建沒(méi)有特定約束的關(guān)系。例如,維護非強制映射關(guān)系。如果試圖獲取對象時(shí)該對象仍然存在,請使用它,否則請重新實(shí)例化它。它也是許多緩存實(shí)現的一個(gè)選項
弱引用是通過(guò)WeakReference類(lèi)實(shí)現的。弱引用的生命周期比軟引用短。當垃圾采集器線(xiàn)程掃描其管轄下的內存區域時(shí),一旦找到弱引用的對象,它將回收其內存,無(wú)論當前內存空間是否足夠。由于垃圾采集器是一個(gè)低優(yōu)先級線(xiàn)程,因此不需要快速回收弱引用對象。弱引用可以與引用隊列一起使用。如果弱引用引用的對象被垃圾采集,Java虛擬機將把弱引用添加到關(guān)聯(lián)的引用隊列中
應用場(chǎng)景:弱應用程序也可用于內存敏感緩存
幻影引用有時(shí)會(huì )轉換為虛擬引用,您無(wú)法通過(guò)虛擬引用訪(fǎng)問(wèn)對象?;糜耙弥惶峁┝艘环N機制來(lái)確保對象在最終確定后可以執行某些操作。例如,它通常用于執行所謂的事后清理機制(post-mortem cleaning mechanism)、在我的專(zhuān)欄文章中介紹的Java平臺的清理機制,還有一些使用幻影引用來(lái)監視對象的創(chuàng )建和銷(xiāo)毀
特點(diǎn):虛擬引用也稱(chēng)為phantomreference,通過(guò)phantomreference類(lèi)實(shí)現。無(wú)法通過(guò)虛擬引用訪(fǎng)問(wèn)對象的任何屬性或函數?;糜耙弥皇翘峁┝艘环N機制來(lái)確保對象在最終確定后執行某些操作。如果一個(gè)對象只收錄虛擬引用,垃圾采集器可以隨時(shí)將其回收,就像它沒(méi)有引用一樣。虛擬引用必須與ReferenceQueue結合使用。當垃圾采集器準備回收對象時(shí),如果它發(fā)現它仍然有一個(gè)虛擬引用,它將在回收對象的內存之前將虛擬引用添加到關(guān)聯(lián)的引用隊列中
ReferenceQueue=newreferencequeue()
PhantomReference pr=新的PhantomReference(對象、隊列)
通過(guò)判斷虛擬引用是否已添加到引用隊列,程序可以知道引用對象是否將被垃圾采集。如果程序發(fā)現已將虛擬引用添加到引用隊列中,它可以在回收引用對象的內存之前執行一些程序操作
應用場(chǎng)景:它可以用來(lái)跟蹤垃圾采集器回收的對象的活動(dòng)。當垃圾采集器回收與虛擬引用關(guān)聯(lián)的對象時(shí),它將收到系統通知
2.對象可訪(fǎng)問(wèn)性分析
3.Reference
所有引用類(lèi)型都是抽象類(lèi)java.lang.ref.reference的子類(lèi)。您可能會(huì )注意到,它提供了一個(gè)get()方法:
除了幻影引用(因為get總是返回null),如果對象沒(méi)有被銷(xiāo)毀,那么可以通過(guò)get方法獲得原創(chuàng )對象。這意味著(zhù)使用軟引用和弱引用,我們可以將被訪(fǎng)問(wèn)對象重新指向強引用,即人為地改變對象的可訪(fǎng)問(wèn)性狀態(tài)!這就是為什么我在上圖中的一些地方畫(huà)了雙向箭頭
因此,對于軟引用和弱引用,垃圾采集器可能存在二次確認問(wèn)題,以確保處于弱引用狀態(tài)的對象不會(huì )更改為強引用
但是你認為這里可能有什么問(wèn)題嗎
是的,如果我們錯誤地維護強引用(例如,分配給靜態(tài)變量),對象可能沒(méi)有機會(huì )更改回類(lèi)似于弱引用的可訪(fǎng)問(wèn)性狀態(tài),從而導致內存泄漏。因此,檢查弱引用指向對象是否被垃圾采集也是診斷是否存在特定內存泄漏的一種方法。如果我們的框架使用弱引用并懷疑存在內存泄漏,我們可以從這個(gè)角度進(jìn)行檢查
4.ReferenceQueue
當我們創(chuàng )建各種引用并將它們與相應的對象關(guān)聯(lián)時(shí),我們可以選擇是否關(guān)聯(lián)引用隊列。JVM將在特定時(shí)間引用隊列。我們可以從隊列中獲取相關(guān)后續邏輯的引用(remove方法實(shí)際上意味著(zhù)在這里獲取它)。特別是對于phantom引用,get方法只返回null。如果未指定引用隊列,則它基本上沒(méi)有意義。請看下面的示例代碼。使用引用隊列,我們可以在對象處于相應狀態(tài)時(shí)執行后處理邏輯(對于phantom reference,它已完成并處于phantom Reach狀態(tài))
Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference p = new PhantomReference(counter, refQueue);
counter = null;
System.gc();
try {
// Remove是一個(gè)阻塞方法,可以指定timeout,或者選擇一直阻塞
Reference ref = refQueue.remove(1000L);
if (ref != null) {
// do something
}
} catch (InterruptedException e) {
// Handle it
}
5.顯式影響軟引用垃圾采集
軟引用通常在最后一次引用之后保留一段時(shí)間。默認值是基于剩余堆空間(以M字節為單位)計算的。來(lái)自Java1.3.1首先,提供了-XX:softreflrupolicymspermb參數。我們可以在毫秒內設置它。例如,以下示例設置為3秒(3000毫秒)
-XX:SoftRefLRUPolicyMSPerMB=3000
事實(shí)上,剩余空間將受到不同JVM模式的影響。對于客戶(hù)端模式,如通常的windows 32位JDK,剩余空間用于計算當前堆中的可用大小,因此更傾向于循環(huán)使用;對于服務(wù)器模式JVM,它是根據-Xmx指定的最大值計算的
本質(zhì)上,這種行為仍然是一個(gè)黑盒,具體取決于JVM實(shí)現。即使上述參數在新版本的JDK上也可能無(wú)效。此外,客戶(hù)端模式下的JDK已逐漸退出歷史舞臺。因此,當我們應用時(shí),我們可以參考類(lèi)似的設置,但不要太依賴(lài)它
6.diagnose JVM引用
如果您懷疑應用程序存在由引用(或finalize)引起的回收問(wèn)題,那么有許多工具或選項可供選擇。例如,hotspot JVM本身提供了一個(gè)清晰的選項(printreferencegc)來(lái)獲取相關(guān)信息
注意:JDK 9廣泛地重構JVM和垃圾采集日志。Printgctimestamps和printreferencegc不再存在。我將在本專(zhuān)欄后面的垃圾采集主題中更系統地解釋它們
7.Reachability籬笆
可以達到強參考的效果 查看全部
文章采集調用(【干貨】強引用、軟引用和幻象引用有什么區別?)
強參考、軟參考、弱參考和幻影參考之間有什么區別
1.definition
強引用是最常見(jiàn)的對象引用。只要有一個(gè)指向某個(gè)對象的強引用,它就可以指示該對象仍然是“活動(dòng)的”,并且垃圾采集器不會(huì )接觸該對象。對于普通對象,如果沒(méi)有其他引用關(guān)系,只要它超出引用的范圍或顯式地將相應的(強)引用分配給null,就可以對其進(jìn)行垃圾采集。當然,具體的回收時(shí)間取決于垃圾采集策略
特點(diǎn):在我們典型的代碼中,Obj=newobject()是一個(gè)很強的引用。與關(guān)鍵字new創(chuàng )建的對象關(guān)聯(lián)的引用是強引用。當JVM內存空間不足時(shí),JVM寧愿拋出OfMemoryError runtime error(OOM),使程序異常終止,也不愿通過(guò)任意回收具有強引用的“活動(dòng)”對象來(lái)解決內存不足的問(wèn)題。對于普通對象,如果沒(méi)有其他引用關(guān)系,只要它超出引用的范圍或顯式地將相應的(強)引用分配給null,就可以對其進(jìn)行垃圾采集。具體的回收時(shí)間取決于垃圾采集策略
軟引用是一種相對較強和較弱的引用,它可以使對象免于某些垃圾采集。只有當JVM認為內存不足時(shí),才會(huì )嘗試回收軟引用指向的對象。JVM確保在拋出outofmemoryerror之前清除軟引用指向的對象。軟引用通常用于實(shí)現內存敏感緩存。如果有空閑內存,可以臨時(shí)保留緩存,并在內存不足時(shí)進(jìn)行清理,以確保在使用緩存時(shí)不會(huì )耗盡內存
特點(diǎn):軟參考通過(guò)軟參考類(lèi)實(shí)現。軟參考文獻的生命周期短于強參考文獻。只有當JVM認為內存不足時(shí),才會(huì )嘗試回收軟引用指向的對象:也就是說(shuō),JVM將確保在拋出outofmemoryerror之前清除軟引用指向的對象。軟引用可以與引用隊列一起使用。如果軟引用引用的對象被垃圾采集器回收,Java虛擬機將把軟引用添加到關(guān)聯(lián)的引用隊列中。稍后,我們可以調用ReferenceQueue的poll()方法來(lái)檢查它所關(guān)心的對象是否被回收。如果隊列為空,則返回null;否則,該方法將返回隊列前面的引用對象
應用場(chǎng)景:軟引用通常用于實(shí)現對內存敏感的緩存。如果仍有可用內存,您可以暫時(shí)保留緩存,并在內存不足時(shí)將其清除,以確保緩存在使用時(shí)不會(huì )耗盡內存
弱引用不會(huì )免除對象的垃圾采集,但只提供了一種訪(fǎng)問(wèn)處于弱引用狀態(tài)的對象的方法。這可以用于構建沒(méi)有特定約束的關(guān)系。例如,維護非強制映射關(guān)系。如果試圖獲取對象時(shí)該對象仍然存在,請使用它,否則請重新實(shí)例化它。它也是許多緩存實(shí)現的一個(gè)選項
弱引用是通過(guò)WeakReference類(lèi)實(shí)現的。弱引用的生命周期比軟引用短。當垃圾采集器線(xiàn)程掃描其管轄下的內存區域時(shí),一旦找到弱引用的對象,它將回收其內存,無(wú)論當前內存空間是否足夠。由于垃圾采集器是一個(gè)低優(yōu)先級線(xiàn)程,因此不需要快速回收弱引用對象。弱引用可以與引用隊列一起使用。如果弱引用引用的對象被垃圾采集,Java虛擬機將把弱引用添加到關(guān)聯(lián)的引用隊列中
應用場(chǎng)景:弱應用程序也可用于內存敏感緩存
幻影引用有時(shí)會(huì )轉換為虛擬引用,您無(wú)法通過(guò)虛擬引用訪(fǎng)問(wèn)對象?;糜耙弥惶峁┝艘环N機制來(lái)確保對象在最終確定后可以執行某些操作。例如,它通常用于執行所謂的事后清理機制(post-mortem cleaning mechanism)、在我的專(zhuān)欄文章中介紹的Java平臺的清理機制,還有一些使用幻影引用來(lái)監視對象的創(chuàng )建和銷(xiāo)毀
特點(diǎn):虛擬引用也稱(chēng)為phantomreference,通過(guò)phantomreference類(lèi)實(shí)現。無(wú)法通過(guò)虛擬引用訪(fǎng)問(wèn)對象的任何屬性或函數?;糜耙弥皇翘峁┝艘环N機制來(lái)確保對象在最終確定后執行某些操作。如果一個(gè)對象只收錄虛擬引用,垃圾采集器可以隨時(shí)將其回收,就像它沒(méi)有引用一樣。虛擬引用必須與ReferenceQueue結合使用。當垃圾采集器準備回收對象時(shí),如果它發(fā)現它仍然有一個(gè)虛擬引用,它將在回收對象的內存之前將虛擬引用添加到關(guān)聯(lián)的引用隊列中
ReferenceQueue=newreferencequeue()
PhantomReference pr=新的PhantomReference(對象、隊列)
通過(guò)判斷虛擬引用是否已添加到引用隊列,程序可以知道引用對象是否將被垃圾采集。如果程序發(fā)現已將虛擬引用添加到引用隊列中,它可以在回收引用對象的內存之前執行一些程序操作
應用場(chǎng)景:它可以用來(lái)跟蹤垃圾采集器回收的對象的活動(dòng)。當垃圾采集器回收與虛擬引用關(guān)聯(lián)的對象時(shí),它將收到系統通知
2.對象可訪(fǎng)問(wèn)性分析

3.Reference



所有引用類(lèi)型都是抽象類(lèi)java.lang.ref.reference的子類(lèi)。您可能會(huì )注意到,它提供了一個(gè)get()方法:
除了幻影引用(因為get總是返回null),如果對象沒(méi)有被銷(xiāo)毀,那么可以通過(guò)get方法獲得原創(chuàng )對象。這意味著(zhù)使用軟引用和弱引用,我們可以將被訪(fǎng)問(wèn)對象重新指向強引用,即人為地改變對象的可訪(fǎng)問(wèn)性狀態(tài)!這就是為什么我在上圖中的一些地方畫(huà)了雙向箭頭
因此,對于軟引用和弱引用,垃圾采集器可能存在二次確認問(wèn)題,以確保處于弱引用狀態(tài)的對象不會(huì )更改為強引用
但是你認為這里可能有什么問(wèn)題嗎
是的,如果我們錯誤地維護強引用(例如,分配給靜態(tài)變量),對象可能沒(méi)有機會(huì )更改回類(lèi)似于弱引用的可訪(fǎng)問(wèn)性狀態(tài),從而導致內存泄漏。因此,檢查弱引用指向對象是否被垃圾采集也是診斷是否存在特定內存泄漏的一種方法。如果我們的框架使用弱引用并懷疑存在內存泄漏,我們可以從這個(gè)角度進(jìn)行檢查
4.ReferenceQueue
當我們創(chuàng )建各種引用并將它們與相應的對象關(guān)聯(lián)時(shí),我們可以選擇是否關(guān)聯(lián)引用隊列。JVM將在特定時(shí)間引用隊列。我們可以從隊列中獲取相關(guān)后續邏輯的引用(remove方法實(shí)際上意味著(zhù)在這里獲取它)。特別是對于phantom引用,get方法只返回null。如果未指定引用隊列,則它基本上沒(méi)有意義。請看下面的示例代碼。使用引用隊列,我們可以在對象處于相應狀態(tài)時(shí)執行后處理邏輯(對于phantom reference,它已完成并處于phantom Reach狀態(tài))
Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference p = new PhantomReference(counter, refQueue);
counter = null;
System.gc();
try {
// Remove是一個(gè)阻塞方法,可以指定timeout,或者選擇一直阻塞
Reference ref = refQueue.remove(1000L);
if (ref != null) {
// do something
}
} catch (InterruptedException e) {
// Handle it
}
5.顯式影響軟引用垃圾采集
軟引用通常在最后一次引用之后保留一段時(shí)間。默認值是基于剩余堆空間(以M字節為單位)計算的。來(lái)自Java1.3.1首先,提供了-XX:softreflrupolicymspermb參數。我們可以在毫秒內設置它。例如,以下示例設置為3秒(3000毫秒)
-XX:SoftRefLRUPolicyMSPerMB=3000
事實(shí)上,剩余空間將受到不同JVM模式的影響。對于客戶(hù)端模式,如通常的windows 32位JDK,剩余空間用于計算當前堆中的可用大小,因此更傾向于循環(huán)使用;對于服務(wù)器模式JVM,它是根據-Xmx指定的最大值計算的
本質(zhì)上,這種行為仍然是一個(gè)黑盒,具體取決于JVM實(shí)現。即使上述參數在新版本的JDK上也可能無(wú)效。此外,客戶(hù)端模式下的JDK已逐漸退出歷史舞臺。因此,當我們應用時(shí),我們可以參考類(lèi)似的設置,但不要太依賴(lài)它
6.diagnose JVM引用
如果您懷疑應用程序存在由引用(或finalize)引起的回收問(wèn)題,那么有許多工具或選項可供選擇。例如,hotspot JVM本身提供了一個(gè)清晰的選項(printreferencegc)來(lái)獲取相關(guān)信息
注意:JDK 9廣泛地重構JVM和垃圾采集日志。Printgctimestamps和printreferencegc不再存在。我將在本專(zhuān)欄后面的垃圾采集主題中更系統地解釋它們
7.Reachability籬笆
可以達到強參考的效果
文章采集調用(文章采集調用mysql的話(huà),你可以不使用瀏覽器)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 156 次瀏覽 ? 2021-09-19 07:03
文章采集調用mysql的話(huà),你可以不使用瀏覽器或者其他采集軟件,可以直接用mysqlscript采集,給大家整理了一下資料,
一、安裝mysql+cython環(huán)境在安裝之前,我們要配置好mysql。
二、通過(guò)mysql調用cython的api非常簡(jiǎn)單直接,參照官方文檔,即可實(shí)現。
#建立表createtable`abc`(`id`int(1
1)notnullauto_increment,`username`varchar(3
0)notnulldefaultnull,`password`varchar(3
0)notnulldefaultnull,`page`int(1
1)notnulldefaultnull);
三、mysql的參數配置a:數據庫名b:binpath通常設置為:/tmp/mysql/bin這樣我們的cython就能訪(fǎng)問(wèn)到mysql了.你還可以在更多的配置方式上進(jìn)行探索。mysql數據庫的配置例如,我們可以進(jìn)一步配置數據庫id在這個(gè)例子中代表的是id到username到page的這個(gè)列--c:/opt/cython/local/bin/mysql-c:/opt/cython/local/bin/mysql---d:c:/opt/cython/local/bin/mysql-e:。 查看全部
文章采集調用(文章采集調用mysql的話(huà),你可以不使用瀏覽器)
文章采集調用mysql的話(huà),你可以不使用瀏覽器或者其他采集軟件,可以直接用mysqlscript采集,給大家整理了一下資料,
一、安裝mysql+cython環(huán)境在安裝之前,我們要配置好mysql。
二、通過(guò)mysql調用cython的api非常簡(jiǎn)單直接,參照官方文檔,即可實(shí)現。
#建立表createtable`abc`(`id`int(1
1)notnullauto_increment,`username`varchar(3
0)notnulldefaultnull,`password`varchar(3
0)notnulldefaultnull,`page`int(1
1)notnulldefaultnull);
三、mysql的參數配置a:數據庫名b:binpath通常設置為:/tmp/mysql/bin這樣我們的cython就能訪(fǎng)問(wèn)到mysql了.你還可以在更多的配置方式上進(jìn)行探索。mysql數據庫的配置例如,我們可以進(jìn)一步配置數據庫id在這個(gè)例子中代表的是id到username到page的這個(gè)列--c:/opt/cython/local/bin/mysql-c:/opt/cython/local/bin/mysql---d:c:/opt/cython/local/bin/mysql-e:。
文章采集調用(換個(gè)網(wǎng)站你什么都做不了,這個(gè)教程是最詳盡的教程)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 133 次瀏覽 ? 2021-09-17 07:05
·我看到很多網(wǎng)友對織夢(mèng)(Dedecms)采集教程感到頭疼。事實(shí)上,官方教程太籠統了,什么也沒(méi)說(shuō)。你不能在網(wǎng)站做任何事情。本教程是最詳細的教程。你一眼就能學(xué)會(huì )
首先,打開(kāi)織夢(mèng)background并單擊采集-采集節點(diǎn)管理-添加新節點(diǎn)
這里我們以采集普通文章為例。我們選擇普通文章然后確認
我們進(jìn)入了采集的設置頁(yè)面,并填寫(xiě)了節點(diǎn)名稱(chēng),即為新節點(diǎn)命名。你可以在這里填寫(xiě)任何名字
然后打開(kāi)所需采集的文章列表頁(yè)面。在這里,我們以織夢(mèng)官方網(wǎng)站為例打開(kāi)此頁(yè)面。右鍵單擊以查看源文件
在字符集之后查找目標頁(yè)代碼
頁(yè)面和其他頁(yè)面的基本信息通常并不重要。填寫(xiě)后,請參見(jiàn)圖
現在,讓我們填寫(xiě)URL獲取規則列表
請看文章列表第一頁(yè)上的地址
比較第二頁(yè)上的地址
我們發(fā)現它們除了49外,后面的數字是不同的,其他的都是一樣的,所以我們可以這樣寫(xiě)
?。?).html
只需將1替換為(*),因為這里只有2頁(yè),所以讓我們填寫(xiě)從1到2的增量。當然是1。2-1... 等于1
我們到此為止
可能您的一些采集列表沒(méi)有規則,因此您必須手動(dòng)指定列表URL,如圖所示
每行寫(xiě)一頁(yè)地址
當列表規則完成后,我們開(kāi)始編寫(xiě)文章URL匹配規則并返回文章list頁(yè)面
右鍵單擊以查看源文件,并在區域的開(kāi)頭找到HTML,這是搜索文章列表開(kāi)頭的符號
我們可以很容易地在圖中找到“新聞列表”。從這里開(kāi)始,列表上的是文章
讓我們在列表的末尾找到文章HTML
就是這樣,一個(gè)很容易找到的標志
如果鏈接收錄圖片:
不要將采集處理為縮略圖。根據您的需要選擇
重新篩選區域網(wǎng)址:
?。ㄊ褂谜齽t表達式)
必須包括:(優(yōu)先于后者)
不能收錄:
打開(kāi)源文件時(shí),您可以清楚地看到文章鏈接以結尾。HTML
因此,我們必須填寫(xiě)。收錄后的HTML。如果有些清單很麻煩,我們也可以填寫(xiě)那些不能包括在內的清單
我們點(diǎn)擊保存設置進(jìn)入下一步,我們可以看到我們獲得的文章網(wǎng)站
看到這一點(diǎn)是對的。我們保存信息并進(jìn)入下一步設置內容字段獲取規則
讓我們看看文章是否有分頁(yè),然后隨機輸入一個(gè)文章。。我們看到這里有文章沒(méi)有分頁(yè)
所以這里我們默認
現在讓我們來(lái)查找文章標題等等。只需輸入一篇文章文章并右鍵單擊即可查看源文件
看看這些
根據源代碼填寫(xiě)
讓我們填寫(xiě)文章開(kāi)頭和結尾
如上所述,找到開(kāi)始和結束標志
開(kāi)始:
完:
如果要在文章中過(guò)濾任何內容,請將其寫(xiě)入過(guò)濾規則,例如在文章中過(guò)濾圖片@
選擇常用規則
再次檢查img
然后決定
通過(guò)這種方式,我們過(guò)濾文本中的圖片
設置完成后,單擊“保存設置并預覽”
這樣一個(gè)采集規則是編寫(xiě)的。這很簡(jiǎn)單。有些網(wǎng)站很難寫(xiě),但我們需要更加努力
我們點(diǎn)擊保存并開(kāi)始采集-start采集網(wǎng)頁(yè),采集將在一段時(shí)間內完成
讓我們看看我們采集k7得到了什么@
這似乎是一次成功。讓我們導出數據
首先,選擇要導入的列,然后按“請選擇”在彈出窗口中選擇要導入的列發(fā)布選項。除非您不想立即發(fā)布,否則它通常是默認值。默認情況下,每批導入有30個(gè)條目。它是否被修改并不重要。附加選項通常為“排除重復標題”。至于自動(dòng)生成HTML的選項,建議不要先生成它,因為我們必須批量提取摘要和關(guān)鍵字 查看全部
文章采集調用(換個(gè)網(wǎng)站你什么都做不了,這個(gè)教程是最詳盡的教程)
·我看到很多網(wǎng)友對織夢(mèng)(Dedecms)采集教程感到頭疼。事實(shí)上,官方教程太籠統了,什么也沒(méi)說(shuō)。你不能在網(wǎng)站做任何事情。本教程是最詳細的教程。你一眼就能學(xué)會(huì )
首先,打開(kāi)織夢(mèng)background并單擊采集-采集節點(diǎn)管理-添加新節點(diǎn)
這里我們以采集普通文章為例。我們選擇普通文章然后確認
我們進(jìn)入了采集的設置頁(yè)面,并填寫(xiě)了節點(diǎn)名稱(chēng),即為新節點(diǎn)命名。你可以在這里填寫(xiě)任何名字
然后打開(kāi)所需采集的文章列表頁(yè)面。在這里,我們以織夢(mèng)官方網(wǎng)站為例打開(kāi)此頁(yè)面。右鍵單擊以查看源文件
在字符集之后查找目標頁(yè)代碼
頁(yè)面和其他頁(yè)面的基本信息通常并不重要。填寫(xiě)后,請參見(jiàn)圖
現在,讓我們填寫(xiě)URL獲取規則列表
請看文章列表第一頁(yè)上的地址
比較第二頁(yè)上的地址
我們發(fā)現它們除了49外,后面的數字是不同的,其他的都是一樣的,所以我們可以這樣寫(xiě)
?。?).html
只需將1替換為(*),因為這里只有2頁(yè),所以讓我們填寫(xiě)從1到2的增量。當然是1。2-1... 等于1
我們到此為止
可能您的一些采集列表沒(méi)有規則,因此您必須手動(dòng)指定列表URL,如圖所示
每行寫(xiě)一頁(yè)地址
當列表規則完成后,我們開(kāi)始編寫(xiě)文章URL匹配規則并返回文章list頁(yè)面
右鍵單擊以查看源文件,并在區域的開(kāi)頭找到HTML,這是搜索文章列表開(kāi)頭的符號
我們可以很容易地在圖中找到“新聞列表”。從這里開(kāi)始,列表上的是文章
讓我們在列表的末尾找到文章HTML
就是這樣,一個(gè)很容易找到的標志
如果鏈接收錄圖片:
不要將采集處理為縮略圖。根據您的需要選擇
重新篩選區域網(wǎng)址:
?。ㄊ褂谜齽t表達式)
必須包括:(優(yōu)先于后者)
不能收錄:
打開(kāi)源文件時(shí),您可以清楚地看到文章鏈接以結尾。HTML
因此,我們必須填寫(xiě)。收錄后的HTML。如果有些清單很麻煩,我們也可以填寫(xiě)那些不能包括在內的清單
我們點(diǎn)擊保存設置進(jìn)入下一步,我們可以看到我們獲得的文章網(wǎng)站
看到這一點(diǎn)是對的。我們保存信息并進(jìn)入下一步設置內容字段獲取規則
讓我們看看文章是否有分頁(yè),然后隨機輸入一個(gè)文章。。我們看到這里有文章沒(méi)有分頁(yè)
所以這里我們默認
現在讓我們來(lái)查找文章標題等等。只需輸入一篇文章文章并右鍵單擊即可查看源文件
看看這些
根據源代碼填寫(xiě)
讓我們填寫(xiě)文章開(kāi)頭和結尾
如上所述,找到開(kāi)始和結束標志
開(kāi)始:
完:
如果要在文章中過(guò)濾任何內容,請將其寫(xiě)入過(guò)濾規則,例如在文章中過(guò)濾圖片@
選擇常用規則
再次檢查img
然后決定
通過(guò)這種方式,我們過(guò)濾文本中的圖片
設置完成后,單擊“保存設置并預覽”
這樣一個(gè)采集規則是編寫(xiě)的。這很簡(jiǎn)單。有些網(wǎng)站很難寫(xiě),但我們需要更加努力
我們點(diǎn)擊保存并開(kāi)始采集-start采集網(wǎng)頁(yè),采集將在一段時(shí)間內完成
讓我們看看我們采集k7得到了什么@
這似乎是一次成功。讓我們導出數據
首先,選擇要導入的列,然后按“請選擇”在彈出窗口中選擇要導入的列發(fā)布選項。除非您不想立即發(fā)布,否則它通常是默認值。默認情況下,每批導入有30個(gè)條目。它是否被修改并不重要。附加選項通常為“排除重復標題”。至于自動(dòng)生成HTML的選項,建議不要先生成它,因為我們必須批量提取摘要和關(guān)鍵字
文章采集調用(靈動(dòng)標簽調用多表多模型(圖)模型調用文章(組圖))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 176 次瀏覽 ? 2021-09-15 20:05
靈動(dòng)標簽調用多表多模型調用文章
1、調用多模型的最新文章
[e:loop={'select * from (
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_movie where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_news where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_photo where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_flash where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_article where newstime) a order by newstime desc limit 10',10,24,1}]
[/e:loop]
帝國CMS多表調用最新信息,該演示代碼為默認數據表下全站最新10條圖片信息,自己根據需求可以附加條件,實(shí)現全站點(diǎn)擊,全站頭條,全站推薦等等.
---------------------------------------------------------------------------------
2、調用多模型的最新文章
[e:loop={'
select title,titleurl,titlepic from [!db.pre!]ecms_photo Union All
select title,titleurl,titlepic from [!db.pre!]ecms_download Union All
select title,titleurl,titlepic from [!db.pre!]ecms_news',0,24,0}]
[/e:loop]
注釋?zhuān)阂陨险{用的是(圖片模型:photo、下載模型:download、新聞模型:news)三個(gè)模型的文章
三個(gè)模型用“Union All”連接調用
若指定欄目用:where classid in(46,47,51),
若調用推薦在其后追加:and isgood=1,
若指定調用條數在其后追加:limit 10 查看全部
文章采集調用(靈動(dòng)標簽調用多表多模型(圖)模型調用文章(組圖))
靈動(dòng)標簽調用多表多模型調用文章
1、調用多模型的最新文章
[e:loop={'select * from (
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_movie where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_news where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_photo where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_flash where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_article where newstime) a order by newstime desc limit 10',10,24,1}]
[/e:loop]
帝國CMS多表調用最新信息,該演示代碼為默認數據表下全站最新10條圖片信息,自己根據需求可以附加條件,實(shí)現全站點(diǎn)擊,全站頭條,全站推薦等等.
---------------------------------------------------------------------------------
2、調用多模型的最新文章
[e:loop={'
select title,titleurl,titlepic from [!db.pre!]ecms_photo Union All
select title,titleurl,titlepic from [!db.pre!]ecms_download Union All
select title,titleurl,titlepic from [!db.pre!]ecms_news',0,24,0}]
[/e:loop]
注釋?zhuān)阂陨险{用的是(圖片模型:photo、下載模型:download、新聞模型:news)三個(gè)模型的文章
三個(gè)模型用“Union All”連接調用
若指定欄目用:where classid in(46,47,51),
若調用推薦在其后追加:and isgood=1,
若指定調用條數在其后追加:limit 10
文章采集調用(Excel教程Excel函數代碼如下()的詳細內容)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 154 次瀏覽 ? 2021-09-15 20:04
核心功能代碼如下:
以上代碼可以獲取指定網(wǎng)頁(yè)的內容。如果一切都得到了,那就容易多了
代碼如下:
'ASP獲取遠程網(wǎng)頁(yè)指定內容開(kāi)始
Dim wstr,str,url,start,over,dtime
url="http://sc.jb51.net/"
wstr=getHTTPPage(url)
body=wstr
如果要在本地保存代碼
Dim wstr,str,url,start,over,dtime
url="https://www.jb51.net/"
wstr=getHTTPPage(url)
filename="index.htm"
if wstr"" and request("action")="makeindex" then
body=wstr
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set fout = fso.CreateTextFile(server.mappath(""&filename&""))
fout.Write body
fout.close
set fout=nothing
set fso=nothing
If Err.number=0 then
response.write("首頁(yè)生成成功??!")
end if
end if
可以根據需要修改特定信息
以上是ASP獲取遠程網(wǎng)頁(yè)指定內容的實(shí)現代碼的詳細內容。有關(guān)獲取遠程網(wǎng)頁(yè)內容的更多信息,請注意其他相關(guān)文章 查看全部
文章采集調用(Excel教程Excel函數代碼如下()的詳細內容)
核心功能代碼如下:
以上代碼可以獲取指定網(wǎng)頁(yè)的內容。如果一切都得到了,那就容易多了
代碼如下:
'ASP獲取遠程網(wǎng)頁(yè)指定內容開(kāi)始
Dim wstr,str,url,start,over,dtime
url="http://sc.jb51.net/"
wstr=getHTTPPage(url)
body=wstr
如果要在本地保存代碼
Dim wstr,str,url,start,over,dtime
url="https://www.jb51.net/"
wstr=getHTTPPage(url)
filename="index.htm"
if wstr"" and request("action")="makeindex" then
body=wstr
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set fout = fso.CreateTextFile(server.mappath(""&filename&""))
fout.Write body
fout.close
set fout=nothing
set fso=nothing
If Err.number=0 then
response.write("首頁(yè)生成成功??!")
end if
end if
可以根據需要修改特定信息
以上是ASP獲取遠程網(wǎng)頁(yè)指定內容的實(shí)現代碼的詳細內容。有關(guān)獲取遠程網(wǎng)頁(yè)內容的更多信息,請注意其他相關(guān)文章
文章采集調用(孤狼微信公眾號文章采集主要功能特色介紹! )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 221 次瀏覽 ? 2021-09-13 22:13
)
獨狼數據采集平臺為微信公眾號文章提供采集,可以輕松發(fā)布到市面上主流系統,也可以定制一些冷門(mén)的網(wǎng)站接口!
一、孤狼微信公眾號文章采集主要功能
1.根據公眾號名稱(chēng)或ID指定公眾號采集,支持輸入多個(gè)公眾號,公眾號數量不限
2.多種圖片下載存儲方式(遠程調用、本地化圖片、ftp上傳),解決公眾號文章圖片防盜鏈問(wèn)題
3、強大的數據存儲功能(采集到達的數據保存在本地數據庫文件中)
4、簡(jiǎn)單配置即可輕松發(fā)布到主流網(wǎng)站或api接口
二、微信公號文章采集主要步驟
1、創(chuàng )建“添加公眾號”任務(wù)
登錄軟件,打開(kāi)左上角“自定義公眾號”,鼠標右鍵添加公眾號框,點(diǎn)擊獲取軟件自動(dòng)獲取公眾號信息,然后添加到組。
2、填寫(xiě)采集的官方賬號名或ID
填寫(xiě)基本信息如下圖:
填寫(xiě)任務(wù)名稱(chēng)和采集微信公眾號的名稱(chēng)或ID。提示:可以查看文章前后圖片的自動(dòng)過(guò)濾
使用廣告圖片功能刪除廣告(功能必須提前勾選)
使用官方賬號標簽
3、設置圖片下載(可選)
由于微信公眾號文章圖片已經(jīng)做了防盜鏈處理,采集收到的原創(chuàng )圖片無(wú)法正常顯示。如果需要圖片,需要配置圖片下載:
您可以選擇“上傳設置(通過(guò)ftp返回您的服務(wù)器)”或直接遠程調用。
4、Begin采集
圖片配置好后,可以點(diǎn)擊左上角的“采集”,采集data:
5、采集后期數據處理與發(fā)布
啟動(dòng)采集后,數據永遠是采集,文章可以預覽,顯示圖形內容,可以添加到“任務(wù)列表”頁(yè)面查看:勾選文章,選擇加入發(fā)布任務(wù)
可以分配到一個(gè)類(lèi)別或列;
在任務(wù)列表中,您可以發(fā)布:
最后選擇發(fā)布到自己的系統。如果軟件上現成的界面與你的網(wǎng)站界面匹配,直接填寫(xiě)網(wǎng)址、后臺網(wǎng)址、賬號密碼等,點(diǎn)擊登錄成功。
查看全部
文章采集調用(孤狼微信公眾號文章采集主要功能特色介紹!
)
獨狼數據采集平臺為微信公眾號文章提供采集,可以輕松發(fā)布到市面上主流系統,也可以定制一些冷門(mén)的網(wǎng)站接口!
一、孤狼微信公眾號文章采集主要功能
1.根據公眾號名稱(chēng)或ID指定公眾號采集,支持輸入多個(gè)公眾號,公眾號數量不限
2.多種圖片下載存儲方式(遠程調用、本地化圖片、ftp上傳),解決公眾號文章圖片防盜鏈問(wèn)題
3、強大的數據存儲功能(采集到達的數據保存在本地數據庫文件中)
4、簡(jiǎn)單配置即可輕松發(fā)布到主流網(wǎng)站或api接口
二、微信公號文章采集主要步驟
1、創(chuàng )建“添加公眾號”任務(wù)
登錄軟件,打開(kāi)左上角“自定義公眾號”,鼠標右鍵添加公眾號框,點(diǎn)擊獲取軟件自動(dòng)獲取公眾號信息,然后添加到組。

2、填寫(xiě)采集的官方賬號名或ID
填寫(xiě)基本信息如下圖:

填寫(xiě)任務(wù)名稱(chēng)和采集微信公眾號的名稱(chēng)或ID。提示:可以查看文章前后圖片的自動(dòng)過(guò)濾
使用廣告圖片功能刪除廣告(功能必須提前勾選)
使用官方賬號標簽
3、設置圖片下載(可選)
由于微信公眾號文章圖片已經(jīng)做了防盜鏈處理,采集收到的原創(chuàng )圖片無(wú)法正常顯示。如果需要圖片,需要配置圖片下載:

您可以選擇“上傳設置(通過(guò)ftp返回您的服務(wù)器)”或直接遠程調用。
4、Begin采集
圖片配置好后,可以點(diǎn)擊左上角的“采集”,采集data:

5、采集后期數據處理與發(fā)布
啟動(dòng)采集后,數據永遠是采集,文章可以預覽,顯示圖形內容,可以添加到“任務(wù)列表”頁(yè)面查看:勾選文章,選擇加入發(fā)布任務(wù)

可以分配到一個(gè)類(lèi)別或列;

在任務(wù)列表中,您可以發(fā)布:

最后選擇發(fā)布到自己的系統。如果軟件上現成的界面與你的網(wǎng)站界面匹配,直接填寫(xiě)網(wǎng)址、后臺網(wǎng)址、賬號密碼等,點(diǎn)擊登錄成功。
文章采集調用(高考志愿填報:文章采集調用的是去重特征嗎?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 151 次瀏覽 ? 2021-09-12 18:08
文章采集調用的是去重特征,機器一類(lèi)特征應該可以,不過(guò)要找到一個(gè)好的去重算法,能夠應對類(lèi)數目,并且快速處理相似性排序。樣本屬性太多,帶來(lái)的問(wèn)題就是復雜度增加。
可以通過(guò)其他feature。比如通過(guò)一些docautographer。
那是應該是有去重功能,但由于海量數據,你的加法求平均肯定是不行,特征選擇也不行。應該嘗試一下樸素貝葉斯等非線(xiàn)性決策模型,甚至嘗試集成方法,比如kaggle的bagging,均衡分布。
直接用關(guān)鍵詞不是挺好嗎?多個(gè)詞相似有兩種可能:1)關(guān)鍵詞相似,但是有差異,比如:“好看”和“好看”,“好看”有100個(gè)詞語(yǔ),而“好看”只有20個(gè)。2)關(guān)鍵詞相似,但是一個(gè)完全一樣,另一個(gè)只是簡(jiǎn)單的借用詞語(yǔ),不是原作者內容或觀(guān)點(diǎn)。比如:“萬(wàn)科”和“萬(wàn)科”,“中科院”和“中科院”。還有一個(gè)可能,就是其他人所說(shuō)的去重,這個(gè)就需要用到數據預處理,去除重復詞,其實(shí)訓練也挺簡(jiǎn)單,你給定一個(gè)集合x(chóng),給定一個(gè)預測維度y,實(shí)驗一下就知道。還有一個(gè)問(wèn)題是為什么不用任何特征,直接求平均,都有人告訴我是為了多層感知機之類(lèi)的去重。
感覺(jué)取詞來(lái)做特征不夠合理。如果取第一個(gè)詞key做特征,再取詞進(jìn)行分類(lèi),那么首先是單詞特征沒(méi)有,其次就是預測結果太低,達不到結合詞匯多少加權的要求。一般取整數詞長(cháng)特征,比如5cm。以“好看”做例子。取key5作為特征。5cm*00=50001。
去重之后0000000=5。分類(lèi)損失是0.5。所以首先權重換算可以不用我說(shuō)的這么麻煩,直接求平均就可以了。其次應該是詞典大小的關(guān)系,詞典越大,權重越高。建議語(yǔ)料庫要盡可能大,詞匯特征向量最好3m以上。具體可以基于文本分類(lèi)的,比如共享詞典什么的。 查看全部
文章采集調用(高考志愿填報:文章采集調用的是去重特征嗎?)
文章采集調用的是去重特征,機器一類(lèi)特征應該可以,不過(guò)要找到一個(gè)好的去重算法,能夠應對類(lèi)數目,并且快速處理相似性排序。樣本屬性太多,帶來(lái)的問(wèn)題就是復雜度增加。
可以通過(guò)其他feature。比如通過(guò)一些docautographer。
那是應該是有去重功能,但由于海量數據,你的加法求平均肯定是不行,特征選擇也不行。應該嘗試一下樸素貝葉斯等非線(xiàn)性決策模型,甚至嘗試集成方法,比如kaggle的bagging,均衡分布。
直接用關(guān)鍵詞不是挺好嗎?多個(gè)詞相似有兩種可能:1)關(guān)鍵詞相似,但是有差異,比如:“好看”和“好看”,“好看”有100個(gè)詞語(yǔ),而“好看”只有20個(gè)。2)關(guān)鍵詞相似,但是一個(gè)完全一樣,另一個(gè)只是簡(jiǎn)單的借用詞語(yǔ),不是原作者內容或觀(guān)點(diǎn)。比如:“萬(wàn)科”和“萬(wàn)科”,“中科院”和“中科院”。還有一個(gè)可能,就是其他人所說(shuō)的去重,這個(gè)就需要用到數據預處理,去除重復詞,其實(shí)訓練也挺簡(jiǎn)單,你給定一個(gè)集合x(chóng),給定一個(gè)預測維度y,實(shí)驗一下就知道。還有一個(gè)問(wèn)題是為什么不用任何特征,直接求平均,都有人告訴我是為了多層感知機之類(lèi)的去重。
感覺(jué)取詞來(lái)做特征不夠合理。如果取第一個(gè)詞key做特征,再取詞進(jìn)行分類(lèi),那么首先是單詞特征沒(méi)有,其次就是預測結果太低,達不到結合詞匯多少加權的要求。一般取整數詞長(cháng)特征,比如5cm。以“好看”做例子。取key5作為特征。5cm*00=50001。
去重之后0000000=5。分類(lèi)損失是0.5。所以首先權重換算可以不用我說(shuō)的這么麻煩,直接求平均就可以了。其次應該是詞典大小的關(guān)系,詞典越大,權重越高。建議語(yǔ)料庫要盡可能大,詞匯特征向量最好3m以上。具體可以基于文本分類(lèi)的,比如共享詞典什么的。
文章采集調用(【Python學(xué)習福利】豆瓣電影中如何多網(wǎng)頁(yè)請求?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 195 次瀏覽 ? 2021-10-10 04:00
點(diǎn)擊上方“IT共享屋”關(guān)注
回復“資料”領(lǐng)取Python學(xué)習福利
【一、項目背景】
豆瓣影業(yè)提供最新的電影介紹和影評,包括正在放映的電影的視頻查詢(xún)和購票服務(wù)。順便可以錄下想看的電影和電視劇,看,看,還可以寫(xiě)影評。它極大地方便了人們的生活。
今天以電視?。绖。槔?,批量抓取對應的電影,寫(xiě)入csv文件。用戶(hù)可以通過(guò)評分更好地選擇自己想要的電影。
【二、項目目標】
獲取對應的電影名稱(chēng)、評分、詳情鏈接,下載電影圖片,保存文件。
[三、 涉及的圖書(shū)館和 網(wǎng)站]
1、 網(wǎng)址如下:
https://movie.douban.com/j/sea ... rt%3D{}
2、 涉及的庫:requests、fake_useragent、json、csv
3、軟件:PyCharm
【四、項目分析】
1、如何請求多個(gè)頁(yè)面?
當您單擊下一頁(yè)時(shí),每增加一頁(yè),paged 將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
2. 如何獲取實(shí)際請求的地址?
在請求數據時(shí),發(fā)現頁(yè)面上沒(méi)有對應的數據。其實(shí)豆瓣是通過(guò)javascript動(dòng)態(tài)加載內容來(lái)防止采集的。
1)F12 右擊查看,在左側菜單中找到Network,和name,找到第五個(gè)數據,點(diǎn)擊Preview。
2) 點(diǎn)擊subjects,可以看到title是對應電影的名字。率是相應的分數。通過(guò)js解析subjects字典,找到需要的字段。
3. 如何訪(fǎng)問(wèn)網(wǎng)頁(yè)?
https://movie.douban.com/j/sea ... t%3D0
https://movie.douban.com/j/sea ... %3D20
https://movie.douban.com/j/sea ... %3D40
https://movie.douban.com/j/sea ... %3D60
單擊下一頁(yè)時(shí),每增加一頁(yè),該頁(yè)將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
【五、項目實(shí)施】
1、 我們定義一個(gè)類(lèi)繼承對象,然后定義init方法繼承self,再定義一個(gè)main函數main繼承self。導入所需的庫和請求 URL。
import requests,json
from fake_useragent import UserAgent
import csv
class Doban(object):
def __init__(self):
self.url = "https://movie.douban.com/j/sea ... rt%3D{}"
def main(self):
pass
if __name__ == '__main__':
Siper = Doban()
Siper.main()
2、 隨機生成UserAgent,構造請求頭,防止反爬。
for i in range(1, 50):
self.headers = {
'User-Agent': ua.random,
}
3、發(fā)送請求,獲取響應,頁(yè)面回調,方便下次請求。
def get_page(self, url):
res = requests.get(url=url, headers=self.headers)
html = res.content.decode("utf-8")
return html
4、json 解析頁(yè)面數據,獲取對應的字典。
data = json.loads(html)['subjects']
# print(data[0])
5、進(jìn)行遍歷,獲取對應的電影名,評分,鏈接到下一個(gè)詳情頁(yè)。
print(name, goblin_herf)
html2 = self.get_page(goblin_herf) # 第二個(gè)發(fā)生請求
parse_html2 = etree.HTML(html2)
r = parse_html2.xpath('//div[@class="entry"]/p/text()')
6、創(chuàng )建一個(gè)用于寫(xiě)入的csv文件,定義相應的header內容,并保存數據。
# 創(chuàng )建csv文件進(jìn)行寫(xiě)入
csv_file = open('scr.csv', 'a', encoding='gbk')
csv_writer = csv.writer(csv_file)
# 寫(xiě)入csv標題頭內容
csv_writerr.writerow(['電影', '評分', "詳情頁(yè)"])
#寫(xiě)入數據
csv_writer.writerow([id, rate, urll])
7、一個(gè)請求的圖片地址。定義圖片的名稱(chēng)并保存文檔。
html2 = requests.get(url=urll, headers=self.headers).content
dirname = "./圖/" + id + ".jpg"
with open(dirname, 'wb') as f:
f.write(html2)
print("%s 【下載成功?。。?!】" % id)
8、 調用方法來(lái)實(shí)現功能。
html = self.get_page(url)
self.parse_page(html)
9、項目?jì)?yōu)化:1)設置延時(shí)。
time.sleep(1.4)
2) 定義一個(gè)變量u,用于遍歷,表示爬取的是哪個(gè)頁(yè)面。(更清晰,更令人印象深刻)。
u = 0
self.u += 1;
【六、效果展示】
1、 點(diǎn)擊綠色三角進(jìn)入起始頁(yè)和結束頁(yè)(從第0頁(yè)開(kāi)始)。
2、 在控制臺顯示下載成功信息。
3、保存 csv 文件。
4、電影圖片顯示。
[七、總結]
1、 不建議抓取太多數據,可能造成服務(wù)器負載,簡(jiǎn)單試一下。
2、本文章針對Python爬取豆瓣應用中的難點(diǎn)和關(guān)鍵點(diǎn),以及如何防止反爬,做了一個(gè)相對的解決方案。
3、希望這個(gè)項目能幫助大家了解json解析頁(yè)面的基本流程,如何拼接字符串,如何使用format函數。
4、 本文基于Python網(wǎng)絡(luò )爬蟲(chóng),利用爬蟲(chóng)庫實(shí)現豆瓣電影及其圖片的獲取。說(shuō)到實(shí)現,總會(huì )有各種各樣的問(wèn)題。不要看最好的,努力去更深入地理解。
5、 需要本文源碼的請在下方公眾號后臺回復“豆瓣電影”獲取。
看完這篇文章你學(xué)會(huì )了嗎?請轉發(fā)并分享給更多人
IT共享之家 查看全部
文章采集調用(【Python學(xué)習福利】豆瓣電影中如何多網(wǎng)頁(yè)請求?)
點(diǎn)擊上方“IT共享屋”關(guān)注
回復“資料”領(lǐng)取Python學(xué)習福利
【一、項目背景】
豆瓣影業(yè)提供最新的電影介紹和影評,包括正在放映的電影的視頻查詢(xún)和購票服務(wù)。順便可以錄下想看的電影和電視劇,看,看,還可以寫(xiě)影評。它極大地方便了人們的生活。
今天以電視?。绖。槔?,批量抓取對應的電影,寫(xiě)入csv文件。用戶(hù)可以通過(guò)評分更好地選擇自己想要的電影。
【二、項目目標】
獲取對應的電影名稱(chēng)、評分、詳情鏈接,下載電影圖片,保存文件。
[三、 涉及的圖書(shū)館和 網(wǎng)站]
1、 網(wǎng)址如下:
https://movie.douban.com/j/sea ... rt%3D{}
2、 涉及的庫:requests、fake_useragent、json、csv
3、軟件:PyCharm
【四、項目分析】
1、如何請求多個(gè)頁(yè)面?
當您單擊下一頁(yè)時(shí),每增加一頁(yè),paged 將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
2. 如何獲取實(shí)際請求的地址?
在請求數據時(shí),發(fā)現頁(yè)面上沒(méi)有對應的數據。其實(shí)豆瓣是通過(guò)javascript動(dòng)態(tài)加載內容來(lái)防止采集的。
1)F12 右擊查看,在左側菜單中找到Network,和name,找到第五個(gè)數據,點(diǎn)擊Preview。
2) 點(diǎn)擊subjects,可以看到title是對應電影的名字。率是相應的分數。通過(guò)js解析subjects字典,找到需要的字段。
3. 如何訪(fǎng)問(wèn)網(wǎng)頁(yè)?
https://movie.douban.com/j/sea ... t%3D0
https://movie.douban.com/j/sea ... %3D20
https://movie.douban.com/j/sea ... %3D40
https://movie.douban.com/j/sea ... %3D60
單擊下一頁(yè)時(shí),每增加一頁(yè),該頁(yè)將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
【五、項目實(shí)施】
1、 我們定義一個(gè)類(lèi)繼承對象,然后定義init方法繼承self,再定義一個(gè)main函數main繼承self。導入所需的庫和請求 URL。
import requests,json
from fake_useragent import UserAgent
import csv
class Doban(object):
def __init__(self):
self.url = "https://movie.douban.com/j/sea ... rt%3D{}"
def main(self):
pass
if __name__ == '__main__':
Siper = Doban()
Siper.main()
2、 隨機生成UserAgent,構造請求頭,防止反爬。
for i in range(1, 50):
self.headers = {
'User-Agent': ua.random,
}
3、發(fā)送請求,獲取響應,頁(yè)面回調,方便下次請求。
def get_page(self, url):
res = requests.get(url=url, headers=self.headers)
html = res.content.decode("utf-8")
return html
4、json 解析頁(yè)面數據,獲取對應的字典。
data = json.loads(html)['subjects']
# print(data[0])
5、進(jìn)行遍歷,獲取對應的電影名,評分,鏈接到下一個(gè)詳情頁(yè)。
print(name, goblin_herf)
html2 = self.get_page(goblin_herf) # 第二個(gè)發(fā)生請求
parse_html2 = etree.HTML(html2)
r = parse_html2.xpath('//div[@class="entry"]/p/text()')
6、創(chuàng )建一個(gè)用于寫(xiě)入的csv文件,定義相應的header內容,并保存數據。
# 創(chuàng )建csv文件進(jìn)行寫(xiě)入
csv_file = open('scr.csv', 'a', encoding='gbk')
csv_writer = csv.writer(csv_file)
# 寫(xiě)入csv標題頭內容
csv_writerr.writerow(['電影', '評分', "詳情頁(yè)"])
#寫(xiě)入數據
csv_writer.writerow([id, rate, urll])
7、一個(gè)請求的圖片地址。定義圖片的名稱(chēng)并保存文檔。
html2 = requests.get(url=urll, headers=self.headers).content
dirname = "./圖/" + id + ".jpg"
with open(dirname, 'wb') as f:
f.write(html2)
print("%s 【下載成功?。。?!】" % id)
8、 調用方法來(lái)實(shí)現功能。
html = self.get_page(url)
self.parse_page(html)
9、項目?jì)?yōu)化:1)設置延時(shí)。
time.sleep(1.4)
2) 定義一個(gè)變量u,用于遍歷,表示爬取的是哪個(gè)頁(yè)面。(更清晰,更令人印象深刻)。
u = 0
self.u += 1;
【六、效果展示】
1、 點(diǎn)擊綠色三角進(jìn)入起始頁(yè)和結束頁(yè)(從第0頁(yè)開(kāi)始)。
2、 在控制臺顯示下載成功信息。
3、保存 csv 文件。
4、電影圖片顯示。
[七、總結]
1、 不建議抓取太多數據,可能造成服務(wù)器負載,簡(jiǎn)單試一下。
2、本文章針對Python爬取豆瓣應用中的難點(diǎn)和關(guān)鍵點(diǎn),以及如何防止反爬,做了一個(gè)相對的解決方案。
3、希望這個(gè)項目能幫助大家了解json解析頁(yè)面的基本流程,如何拼接字符串,如何使用format函數。
4、 本文基于Python網(wǎng)絡(luò )爬蟲(chóng),利用爬蟲(chóng)庫實(shí)現豆瓣電影及其圖片的獲取。說(shuō)到實(shí)現,總會(huì )有各種各樣的問(wèn)題。不要看最好的,努力去更深入地理解。
5、 需要本文源碼的請在下方公眾號后臺回復“豆瓣電影”獲取。
看完這篇文章你學(xué)會(huì )了嗎?請轉發(fā)并分享給更多人
IT共享之家
文章采集調用(調用鏈系列(2):服務(wù)端信息收集以及服務(wù)間上下文傳遞)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 184 次瀏覽 ? 2021-10-10 03:36
一、前言
調用鏈系列(1):UAVStack中貪吃蛇的解讀
上一篇文章分享了調用鏈的模型設計和模型時(shí)序圖。相信大家通過(guò)上一篇文章對調用鏈有了一個(gè)整體的了解,比如:調用鏈是什么,能做什么,整體的實(shí)現策略。
在這個(gè)文章中,我們繼續介紹調用鏈的服務(wù)端信息采集和服務(wù)間的上下文傳遞。
二、服務(wù)器信息采集
服務(wù)器端信息采集的整體流程如下圖所示。通過(guò)在應用容器(tomcat等)的啟動(dòng)過(guò)程中植入切入點(diǎn),可以在應用邏輯執行前后對請求進(jìn)行劫持。
三、切點(diǎn)植入
在介紹切入點(diǎn)之前,我們應該對servlet容器(本文以tomcat為例)處理請求的大致流程有一個(gè)全面的了解。
圖片來(lái)自網(wǎng)絡(luò )
Connector接收到一個(gè)連接并轉換成請求(Request)后,會(huì )將請求傳遞給Engine的管道(Pipeline)的閥門(mén)(ValveA)。該請求將被傳遞到引擎管道中的引擎閥門(mén)。然后請求將從 Engine Valve 傳遞到 Host 管道,并在管道中傳遞到 Host Valve 閥門(mén)。然后從Host Valve傳遞給一個(gè)Context管道,再傳遞給管道中的Context Valve。接下來(lái),請求將被傳遞到收錄在 Wrapper C 中的管道中的 Wrapper Valve,在那里它會(huì )通過(guò)一個(gè)過(guò)濾器鏈,最后發(fā)送到一個(gè) Servlet。借助tomcat的這種架構設計,我們可以通過(guò)在tomcat處理請求的生命周期中植入自己的邏輯來(lái)增強tomcat的對外能力,即:
除了巧妙地利用了tomcat容器的架構設計,中間件增強技術(shù)還使用了java Instrumentation(它為我們提供了第一次加載對象時(shí)動(dòng)態(tài)修改字節碼的能力。由于篇幅原因,不做詳細解釋?zhuān)幻靼椎目梢宰孕胁殚嗁Y料)。在 UAV 中,通過(guò) UAVServer 對外提供各種切點(diǎn)能力。
借助中間件增強技術(shù),在應用邏輯執行前后都有切點(diǎn),下一步就是在這些切點(diǎn)上執行我們自己的調用鏈邏輯。
四、調用鏈中間件增強技術(shù)的使用
上面介紹的中間件增強技術(shù)是一個(gè)框架,通過(guò)使用javaagent在tomcat代碼中動(dòng)態(tài)植入切入點(diǎn)代碼,并以UAVServer的形式對外提供能力(具體能力后面會(huì )詳細介紹文章)。輕量級調用鏈實(shí)現使用了 UAVServer 提供的 GlobalFilterHandler 能力。
GlobalFilterHandler:這里的GlobalFilterHandler是中間件增強技術(shù)中的一種能力,與傳統過(guò)濾器無(wú)關(guān)。它提供了四種外部功能:
調用鏈借助 GlobalFilterHandler 提供的前兩個(gè)能力,實(shí)現了應用處理請求前后執行調用鏈邏輯的功能。
五、輕量級調用鏈實(shí)現
具體的UML圖如下:
從UML圖中可以清楚地看出InvokeChainSupporter(調用鏈實(shí)現邏輯入口和調用鏈所需的資源初始化實(shí)現類(lèi))對中間件增強技術(shù)進(jìn)行了第二次增強。它允許用戶(hù)在其中注冊不同的處理程序,并在處理程序的 preCap 和 doCap(中間件增強技術(shù)中的邏輯執行前后的切入點(diǎn)術(shù)語(yǔ))方法之前和之后將適配器動(dòng)態(tài)編織到適配器中,以便能夠執行更多定制化適配和個(gè)性化邏輯。所有的支持者和適配器都采用反射調用方式,最大限度地減少了對中間件增強技術(shù)的依賴(lài)。
有了二次增強技術(shù),我們就可以開(kāi)始下面的調用鏈繪制工作了。
輕量級調用鏈繪制實(shí)現主要依賴(lài)于注冊在 InvokeChainSupporter 上的 ServiceSpanInvokeChainHandler。主要繪制過(guò)程如下:
我們來(lái)看看每一步都做了什么。
5.1 分析請求信息
對于像tomcat這樣的中間件容器,所有進(jìn)入tomcat的請求都會(huì )被封裝成HttpServletRequest和HttpServletResponse(以下簡(jiǎn)稱(chēng)請求和響應),最后進(jìn)入用戶(hù)的servlet。借助中間件增強技術(shù),調用鏈會(huì )在處理用戶(hù)邏輯之前攔截一次請求和響應,并分析其中是否收錄調用鏈信息。如果是,則將調用鏈信息封裝到上下文中。
5.2 邏輯導流
由于不同協(xié)議對應的調用鏈的繪制邏輯也不同,這里會(huì )根據協(xié)議類(lèi)型分配一次調用鏈。
5.3 初始化調用鏈上下文
分析調用鏈上下文中的信息:
Main span:服務(wù)中可能有多個(gè)客戶(hù)端通信或服務(wù)間通信,需要一個(gè)主span來(lái)記錄當前服務(wù)中調用鏈最后一個(gè)節點(diǎn)的信息。
5.4 調用鏈信息輸出
用戶(hù)邏輯處理結束后,調用鏈記錄器會(huì )從上下文中取出當前服務(wù)的調用鏈信息,輸出到指定的日志路徑。
5.5 服務(wù)間的上下文傳輸
不同協(xié)議調用鏈傳遞信息的方法也略有不同。具體的實(shí)現方式利用了中間件增強技術(shù)提供的另一個(gè)能力:AppFrkHook(簡(jiǎn)稱(chēng)hook,這個(gè)功能會(huì )在客戶(hù)端調用鏈實(shí)現的時(shí)候具體介紹)。它可以劫持用戶(hù)使用的客戶(hù)端技術(shù)。如果用戶(hù)使用httpclient進(jìn)行通信,則劫持httpclient并動(dòng)態(tài)編織代碼,從而達到在http通信過(guò)程中注入調用鏈上下文信息的效果。目標服務(wù)解析請求信息時(shí),解析調用鏈上下文;當調用鏈上下文邏輯被初始化時(shí),
六、總結
看完這篇文章,讀者應該對中間件增強技術(shù)的實(shí)現有了一個(gè)大致的了解,對其提供的GlobalFilterHandler能力也有了一定的了解。對于調用鏈,你應該了解繪制服務(wù)器和服務(wù)之間調用鏈的整個(gè)過(guò)程。 查看全部
文章采集調用(調用鏈系列(2):服務(wù)端信息收集以及服務(wù)間上下文傳遞)
一、前言
調用鏈系列(1):UAVStack中貪吃蛇的解讀
上一篇文章分享了調用鏈的模型設計和模型時(shí)序圖。相信大家通過(guò)上一篇文章對調用鏈有了一個(gè)整體的了解,比如:調用鏈是什么,能做什么,整體的實(shí)現策略。
在這個(gè)文章中,我們繼續介紹調用鏈的服務(wù)端信息采集和服務(wù)間的上下文傳遞。
二、服務(wù)器信息采集
服務(wù)器端信息采集的整體流程如下圖所示。通過(guò)在應用容器(tomcat等)的啟動(dòng)過(guò)程中植入切入點(diǎn),可以在應用邏輯執行前后對請求進(jìn)行劫持。

三、切點(diǎn)植入
在介紹切入點(diǎn)之前,我們應該對servlet容器(本文以tomcat為例)處理請求的大致流程有一個(gè)全面的了解。

圖片來(lái)自網(wǎng)絡(luò )
Connector接收到一個(gè)連接并轉換成請求(Request)后,會(huì )將請求傳遞給Engine的管道(Pipeline)的閥門(mén)(ValveA)。該請求將被傳遞到引擎管道中的引擎閥門(mén)。然后請求將從 Engine Valve 傳遞到 Host 管道,并在管道中傳遞到 Host Valve 閥門(mén)。然后從Host Valve傳遞給一個(gè)Context管道,再傳遞給管道中的Context Valve。接下來(lái),請求將被傳遞到收錄在 Wrapper C 中的管道中的 Wrapper Valve,在那里它會(huì )通過(guò)一個(gè)過(guò)濾器鏈,最后發(fā)送到一個(gè) Servlet。借助tomcat的這種架構設計,我們可以通過(guò)在tomcat處理請求的生命周期中植入自己的邏輯來(lái)增強tomcat的對外能力,即:
除了巧妙地利用了tomcat容器的架構設計,中間件增強技術(shù)還使用了java Instrumentation(它為我們提供了第一次加載對象時(shí)動(dòng)態(tài)修改字節碼的能力。由于篇幅原因,不做詳細解釋?zhuān)幻靼椎目梢宰孕胁殚嗁Y料)。在 UAV 中,通過(guò) UAVServer 對外提供各種切點(diǎn)能力。
借助中間件增強技術(shù),在應用邏輯執行前后都有切點(diǎn),下一步就是在這些切點(diǎn)上執行我們自己的調用鏈邏輯。
四、調用鏈中間件增強技術(shù)的使用
上面介紹的中間件增強技術(shù)是一個(gè)框架,通過(guò)使用javaagent在tomcat代碼中動(dòng)態(tài)植入切入點(diǎn)代碼,并以UAVServer的形式對外提供能力(具體能力后面會(huì )詳細介紹文章)。輕量級調用鏈實(shí)現使用了 UAVServer 提供的 GlobalFilterHandler 能力。
GlobalFilterHandler:這里的GlobalFilterHandler是中間件增強技術(shù)中的一種能力,與傳統過(guò)濾器無(wú)關(guān)。它提供了四種外部功能:
調用鏈借助 GlobalFilterHandler 提供的前兩個(gè)能力,實(shí)現了應用處理請求前后執行調用鏈邏輯的功能。
五、輕量級調用鏈實(shí)現
具體的UML圖如下:

從UML圖中可以清楚地看出InvokeChainSupporter(調用鏈實(shí)現邏輯入口和調用鏈所需的資源初始化實(shí)現類(lèi))對中間件增強技術(shù)進(jìn)行了第二次增強。它允許用戶(hù)在其中注冊不同的處理程序,并在處理程序的 preCap 和 doCap(中間件增強技術(shù)中的邏輯執行前后的切入點(diǎn)術(shù)語(yǔ))方法之前和之后將適配器動(dòng)態(tài)編織到適配器中,以便能夠執行更多定制化適配和個(gè)性化邏輯。所有的支持者和適配器都采用反射調用方式,最大限度地減少了對中間件增強技術(shù)的依賴(lài)。
有了二次增強技術(shù),我們就可以開(kāi)始下面的調用鏈繪制工作了。
輕量級調用鏈繪制實(shí)現主要依賴(lài)于注冊在 InvokeChainSupporter 上的 ServiceSpanInvokeChainHandler。主要繪制過(guò)程如下:
我們來(lái)看看每一步都做了什么。
5.1 分析請求信息
對于像tomcat這樣的中間件容器,所有進(jìn)入tomcat的請求都會(huì )被封裝成HttpServletRequest和HttpServletResponse(以下簡(jiǎn)稱(chēng)請求和響應),最后進(jìn)入用戶(hù)的servlet。借助中間件增強技術(shù),調用鏈會(huì )在處理用戶(hù)邏輯之前攔截一次請求和響應,并分析其中是否收錄調用鏈信息。如果是,則將調用鏈信息封裝到上下文中。
5.2 邏輯導流
由于不同協(xié)議對應的調用鏈的繪制邏輯也不同,這里會(huì )根據協(xié)議類(lèi)型分配一次調用鏈。
5.3 初始化調用鏈上下文
分析調用鏈上下文中的信息:
Main span:服務(wù)中可能有多個(gè)客戶(hù)端通信或服務(wù)間通信,需要一個(gè)主span來(lái)記錄當前服務(wù)中調用鏈最后一個(gè)節點(diǎn)的信息。
5.4 調用鏈信息輸出
用戶(hù)邏輯處理結束后,調用鏈記錄器會(huì )從上下文中取出當前服務(wù)的調用鏈信息,輸出到指定的日志路徑。
5.5 服務(wù)間的上下文傳輸
不同協(xié)議調用鏈傳遞信息的方法也略有不同。具體的實(shí)現方式利用了中間件增強技術(shù)提供的另一個(gè)能力:AppFrkHook(簡(jiǎn)稱(chēng)hook,這個(gè)功能會(huì )在客戶(hù)端調用鏈實(shí)現的時(shí)候具體介紹)。它可以劫持用戶(hù)使用的客戶(hù)端技術(shù)。如果用戶(hù)使用httpclient進(jìn)行通信,則劫持httpclient并動(dòng)態(tài)編織代碼,從而達到在http通信過(guò)程中注入調用鏈上下文信息的效果。目標服務(wù)解析請求信息時(shí),解析調用鏈上下文;當調用鏈上下文邏輯被初始化時(shí),
六、總結
看完這篇文章,讀者應該對中間件增強技術(shù)的實(shí)現有了一個(gè)大致的了解,對其提供的GlobalFilterHandler能力也有了一定的了解。對于調用鏈,你應該了解繪制服務(wù)器和服務(wù)之間調用鏈的整個(gè)過(guò)程。
文章采集調用(本文采集指定節點(diǎn)和“如何導出采集內容”的說(shuō)明)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 216 次瀏覽 ? 2021-10-10 03:35
前言:本文為《無(wú)分頁(yè)通用文章采集方法》的第三部分。在前兩節的基礎上,對《如何采集指定Node》和《如何導出采集的內容》進(jìn)行詳細講解。為了與上一篇保持一致,本節文章將繼續使用之前的章節標記。
接第二部分。
3.1采集指定節點(diǎn)
點(diǎn)擊“保存并啟動(dòng)采集”后,會(huì )進(jìn)入“采集指定節點(diǎn)”界面,如圖(圖34),
圖 34-采集指定節點(diǎn)
每頁(yè)采集:設置每頁(yè)需要的采集個(gè)數,根據網(wǎng)站是否有防刷新功能設置采集的間隔。
特殊選項:設置是否檢測重復圖片,默認為“檢測”。
附加選項:該選項共有3種采集模式可供選擇:第一種是“監控采集模式(檢查當前節點(diǎn)或所有節點(diǎn)是否有新內容)”。選擇后,系統只會(huì )采集指定節點(diǎn)的更新內容;第二種是“重新下載所有內容”,選擇后系統會(huì )采集指定節點(diǎn)的所有內容;第三種是“下載種子網(wǎng)站未下載的內容”,選擇后,系統只會(huì )采集指定節點(diǎn)未下載的內容,包括之前未下載和更新的內容。<//p
p設置完成并確認后,您可以點(diǎn)擊“開(kāi)始采集網(wǎng)頁(yè)”或“查看種子網(wǎng)址”。此時(shí),如果您單擊“查看種子 URL”,您將看到列表是空的。這是因為新創(chuàng )建的采集節點(diǎn)從來(lái)就不是采集,如圖(圖35)顯示,/p
pimg src='https://www.mayiziy.com/../../../uploads/18751582345767.png' alt='Dedecms采集功能的使用方法 --- 不含分頁(yè)的普通文章(三)'//p
p圖35-查看節點(diǎn)的seed URL/p
p點(diǎn)擊“開(kāi)始采集網(wǎng)頁(yè)”后,系統將啟動(dòng)采集節點(diǎn)中設置的URL,并出現相關(guān)提示,如圖36),< /@采集 p>
圖 36-采集提示消息進(jìn)行中
采集 完成后,再次點(diǎn)擊“查看種子網(wǎng)址”或點(diǎn)擊頁(yè)面右上角的“查看已下載”,可以看到已經(jīng)采集的網(wǎng)址信息,如圖在(圖37)如圖,
圖37-查看節點(diǎn)的seed URL
采集成功后,您可以根據實(shí)際需要選擇頁(yè)面右上角的“采集節點(diǎn)管理”或“導出數據”。點(diǎn)擊“導出數據”后,可以進(jìn)入“采集管理>采集內容導出”界面,如圖(圖38),
圖 38-采集內容導出
“默認導出列”:設置將采集的內容導入到
的列
“批量采集選項”:如果采集規則中已經(jīng)指定了列ID,則可以使用該函數。如果指定的列ID為0,系統會(huì )將采集導入到“默認導出列”中選擇的列中。
“發(fā)布選項”:有發(fā)布為“普通文檔”和“另存為草稿”的選項。
“每批次導入”:設置每批次導入的項目數。這個(gè)數字不能太大。
“帶選項”:這是一個(gè)多項選擇。如果不想采集重復文章標題,可以選擇“排除重復標題”;如果想直接從采集接收到的內容生成HTML,可以選擇“完成后自動(dòng)生成并導入Content HTML”;如果想讓系統自動(dòng)識別采集列表頁(yè)的標題名稱(chēng),可以選擇“使用列表索引的標題”。一般不建議勾選。
“隨機推薦”:填寫(xiě)一個(gè)數字,代表文檔的數量。推薦的文檔隨機出現在輸入的文檔數量中。如果輸入“0”,則表示不推薦。
設置完成后,可以點(diǎn)擊“確定”將下載的項目導入到選中的列中,如圖(圖39),
圖39-采集設置后的內容導出頁(yè)面
同時(shí)系統會(huì )提示導出過(guò)程,如圖(圖40),
圖40-采集內容導出時(shí)的提示信息
導出采集 內容提示“完成所有欄目列表更新”后,點(diǎn)擊“瀏覽欄目”,即可進(jìn)入網(wǎng)站的相關(guān)頁(yè)面查看采集到的文章List 及其具體內容。也可以在后臺管理界面的主菜單中點(diǎn)擊“Core”,然后點(diǎn)擊“General文章”進(jìn)入“Document List”頁(yè)面,從文章查看文章的列表@采集 ,如圖(圖41),
圖 41-文檔列表
到此為止,我已經(jīng)成功采集到達目標網(wǎng)站的文章內容。
總結,采集“普通文章無(wú)分頁(yè)”比較簡(jiǎn)單。由于本文文章是基礎教程,所以沒(méi)有太多涉及“過(guò)濾規則”。 “常用文章帶分頁(yè)”的采集方法以及過(guò)濾規則的使用將在下一篇文章介紹。
附上這篇文章的采集規則:
{dede:listconfig}
{dede:noteinfo notename="采集測試 (一)" channelid="1" macthtype="string"
refurl="" sourcelang="gb2312" cosort="asc" isref="no" exptime="10" usemore="0" /}
{dede:listrule sourcetype="batch" rssurl="http://" regxurl="(*).html"
startid="1" endid="1" addv="1" urlrule="area"
musthas=".html" nothas="" listpic="1" usemore="0"}
{dede:addurls}{/dede:addurls}
{dede:batchrule}{/dede:batchrule}
{dede:regxrule}{/dede:regxrule}
{dede:areastart}
{/dede:areastart}
{dede:areaend}
{/dede:areaend}
{/dede:listrule}
{/dede:listconfig}
{dede:itemconfig}
{dede:sppage sptype='full' sptype='full' srul='1' erul='5'}{/dede:sppage}
{dede:previewurl}{/dede:previewurl}
{dede:keywordtrim}{/dede:keywordtrim}
{dede:descriptiontrim}{/dede:descriptiontrim}
{dede:item field='title' value='' isunit='' isdown=''}
{dede:match}
[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='writer' value='' isunit='' isdown=''}
{dede:match}作者:[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='source' value='' isunit='' isdown=''}
{dede:match}來(lái)源:[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='pubdate' value='' isunit='' isdown=''}
{dede:match} 發(fā)布于:[Content]{/dede:match}
{dede:function}@me=GetMkTime(@me);{/dede:function}
{/dede:item}
{dede:item field='body' value='' isunit='1' isdown='1'}
{dede:match}
[內容]
{/de:match}
{dede:function}{/dede:function}
{/dede:item}
{/dede:itemconfig}
本文標簽:dedecms、采集、功能、用法、---、不收錄、分頁(yè)、通用、文章、前言 查看全部
文章采集調用(本文采集指定節點(diǎn)和“如何導出采集內容”的說(shuō)明)
前言:本文為《無(wú)分頁(yè)通用文章采集方法》的第三部分。在前兩節的基礎上,對《如何采集指定Node》和《如何導出采集的內容》進(jìn)行詳細講解。為了與上一篇保持一致,本節文章將繼續使用之前的章節標記。
接第二部分。
3.1采集指定節點(diǎn)
點(diǎn)擊“保存并啟動(dòng)采集”后,會(huì )進(jìn)入“采集指定節點(diǎn)”界面,如圖(圖34),

圖 34-采集指定節點(diǎn)
每頁(yè)采集:設置每頁(yè)需要的采集個(gè)數,根據網(wǎng)站是否有防刷新功能設置采集的間隔。
特殊選項:設置是否檢測重復圖片,默認為“檢測”。
附加選項:該選項共有3種采集模式可供選擇:第一種是“監控采集模式(檢查當前節點(diǎn)或所有節點(diǎn)是否有新內容)”。選擇后,系統只會(huì )采集指定節點(diǎn)的更新內容;第二種是“重新下載所有內容”,選擇后系統會(huì )采集指定節點(diǎn)的所有內容;第三種是“下載種子網(wǎng)站未下載的內容”,選擇后,系統只會(huì )采集指定節點(diǎn)未下載的內容,包括之前未下載和更新的內容。<//p
p設置完成并確認后,您可以點(diǎn)擊“開(kāi)始采集網(wǎng)頁(yè)”或“查看種子網(wǎng)址”。此時(shí),如果您單擊“查看種子 URL”,您將看到列表是空的。這是因為新創(chuàng )建的采集節點(diǎn)從來(lái)就不是采集,如圖(圖35)顯示,/p
pimg src='https://www.mayiziy.com/../../../uploads/18751582345767.png' alt='Dedecms采集功能的使用方法 --- 不含分頁(yè)的普通文章(三)'//p
p圖35-查看節點(diǎn)的seed URL/p
p點(diǎn)擊“開(kāi)始采集網(wǎng)頁(yè)”后,系統將啟動(dòng)采集節點(diǎn)中設置的URL,并出現相關(guān)提示,如圖36),< /@采集 p>



圖 36-采集提示消息進(jìn)行中
采集 完成后,再次點(diǎn)擊“查看種子網(wǎng)址”或點(diǎn)擊頁(yè)面右上角的“查看已下載”,可以看到已經(jīng)采集的網(wǎng)址信息,如圖在(圖37)如圖,

圖37-查看節點(diǎn)的seed URL
采集成功后,您可以根據實(shí)際需要選擇頁(yè)面右上角的“采集節點(diǎn)管理”或“導出數據”。點(diǎn)擊“導出數據”后,可以進(jìn)入“采集管理>采集內容導出”界面,如圖(圖38),

圖 38-采集內容導出
“默認導出列”:設置將采集的內容導入到
的列
“批量采集選項”:如果采集規則中已經(jīng)指定了列ID,則可以使用該函數。如果指定的列ID為0,系統會(huì )將采集導入到“默認導出列”中選擇的列中。
“發(fā)布選項”:有發(fā)布為“普通文檔”和“另存為草稿”的選項。
“每批次導入”:設置每批次導入的項目數。這個(gè)數字不能太大。
“帶選項”:這是一個(gè)多項選擇。如果不想采集重復文章標題,可以選擇“排除重復標題”;如果想直接從采集接收到的內容生成HTML,可以選擇“完成后自動(dòng)生成并導入Content HTML”;如果想讓系統自動(dòng)識別采集列表頁(yè)的標題名稱(chēng),可以選擇“使用列表索引的標題”。一般不建議勾選。
“隨機推薦”:填寫(xiě)一個(gè)數字,代表文檔的數量。推薦的文檔隨機出現在輸入的文檔數量中。如果輸入“0”,則表示不推薦。
設置完成后,可以點(diǎn)擊“確定”將下載的項目導入到選中的列中,如圖(圖39),

圖39-采集設置后的內容導出頁(yè)面
同時(shí)系統會(huì )提示導出過(guò)程,如圖(圖40),



圖40-采集內容導出時(shí)的提示信息
導出采集 內容提示“完成所有欄目列表更新”后,點(diǎn)擊“瀏覽欄目”,即可進(jìn)入網(wǎng)站的相關(guān)頁(yè)面查看采集到的文章List 及其具體內容。也可以在后臺管理界面的主菜單中點(diǎn)擊“Core”,然后點(diǎn)擊“General文章”進(jìn)入“Document List”頁(yè)面,從文章查看文章的列表@采集 ,如圖(圖41),

圖 41-文檔列表
到此為止,我已經(jīng)成功采集到達目標網(wǎng)站的文章內容。
總結,采集“普通文章無(wú)分頁(yè)”比較簡(jiǎn)單。由于本文文章是基礎教程,所以沒(méi)有太多涉及“過(guò)濾規則”。 “常用文章帶分頁(yè)”的采集方法以及過(guò)濾規則的使用將在下一篇文章介紹。
附上這篇文章的采集規則:
{dede:listconfig}
{dede:noteinfo notename="采集測試 (一)" channelid="1" macthtype="string"
refurl="" sourcelang="gb2312" cosort="asc" isref="no" exptime="10" usemore="0" /}
{dede:listrule sourcetype="batch" rssurl="http://" regxurl="(*).html"
startid="1" endid="1" addv="1" urlrule="area"
musthas=".html" nothas="" listpic="1" usemore="0"}
{dede:addurls}{/dede:addurls}
{dede:batchrule}{/dede:batchrule}
{dede:regxrule}{/dede:regxrule}
{dede:areastart}
{/dede:areastart}
{dede:areaend}
{/dede:areaend}
{/dede:listrule}
{/dede:listconfig}
{dede:itemconfig}
{dede:sppage sptype='full' sptype='full' srul='1' erul='5'}{/dede:sppage}
{dede:previewurl}{/dede:previewurl}
{dede:keywordtrim}{/dede:keywordtrim}
{dede:descriptiontrim}{/dede:descriptiontrim}
{dede:item field='title' value='' isunit='' isdown=''}
{dede:match}
[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='writer' value='' isunit='' isdown=''}
{dede:match}作者:[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='source' value='' isunit='' isdown=''}
{dede:match}來(lái)源:[內容]{/dede:match}
{dede:function}{/dede:function}
{/dede:item}
{dede:item field='pubdate' value='' isunit='' isdown=''}
{dede:match} 發(fā)布于:[Content]{/dede:match}
{dede:function}@me=GetMkTime(@me);{/dede:function}
{/dede:item}
{dede:item field='body' value='' isunit='1' isdown='1'}
{dede:match}
[內容]
{/de:match}
{dede:function}{/dede:function}
{/dede:item}
{/dede:itemconfig}
本文標簽:dedecms、采集、功能、用法、---、不收錄、分頁(yè)、通用、文章、前言
文章采集調用(生命不止,折騰不停,最近開(kāi)始接觸了wordpress(組圖))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 153 次瀏覽 ? 2021-09-25 15:14
生活一直在繼續。最近,我開(kāi)始聯(lián)系WordPress。我發(fā)現WordPress確實(shí)做得很好。有很多地方值得學(xué)習,而且很多地方都設置得非常巧妙。安裝WP之后,會(huì )有一個(gè)“hello to the world”文章,有點(diǎn)空,所以我想知道是否可以使用Python自動(dòng)發(fā)布WordPress采集的一些內容。那樣的話(huà),我們就開(kāi)始吧
一、所需的庫和模塊
Requests是一個(gè)模擬HTTP請求的庫。我們用它來(lái)抓取網(wǎng)頁(yè)
Lxml是一個(gè)用于解析HTML和XML的庫。我們使用它來(lái)解析網(wǎng)頁(yè)內容
Pymysql是一個(gè)MySQL數據庫。我們使用它將內容上傳到WordPress數據庫
時(shí)間是Python中內置的時(shí)間處理模塊。我們使用它來(lái)設置抓取網(wǎng)頁(yè)之間的間隔
Random是一個(gè)python內置模塊,用于生成隨機數。我們用它來(lái)生成隨機區間
Xpinyin是一個(gè)將漢字轉換成拼音的庫
二、使用pymysql向WordPress數據庫提交內容
通常,當我們使用WordPress時(shí),我們會(huì )在后臺編寫(xiě)它,然后單擊“發(fā)布”。過(guò)程如下:
瀏覽器=>;提交表格=>;php=>;數據庫
在這里,我們將跳過(guò)前面的三個(gè)步驟,直接連接到數據庫:
命令行=>;數據庫
<p>通過(guò)查看WordPress數據庫中的WP,在posts表中的字段之后,我編寫(xiě)了一條SQL語(yǔ)句并保留了三個(gè)位置:content、title和name,它們分別表示 查看全部
文章采集調用(生命不止,折騰不停,最近開(kāi)始接觸了wordpress(組圖))
生活一直在繼續。最近,我開(kāi)始聯(lián)系WordPress。我發(fā)現WordPress確實(shí)做得很好。有很多地方值得學(xué)習,而且很多地方都設置得非常巧妙。安裝WP之后,會(huì )有一個(gè)“hello to the world”文章,有點(diǎn)空,所以我想知道是否可以使用Python自動(dòng)發(fā)布WordPress采集的一些內容。那樣的話(huà),我們就開(kāi)始吧
一、所需的庫和模塊
Requests是一個(gè)模擬HTTP請求的庫。我們用它來(lái)抓取網(wǎng)頁(yè)
Lxml是一個(gè)用于解析HTML和XML的庫。我們使用它來(lái)解析網(wǎng)頁(yè)內容
Pymysql是一個(gè)MySQL數據庫。我們使用它將內容上傳到WordPress數據庫
時(shí)間是Python中內置的時(shí)間處理模塊。我們使用它來(lái)設置抓取網(wǎng)頁(yè)之間的間隔
Random是一個(gè)python內置模塊,用于生成隨機數。我們用它來(lái)生成隨機區間
Xpinyin是一個(gè)將漢字轉換成拼音的庫
二、使用pymysql向WordPress數據庫提交內容
通常,當我們使用WordPress時(shí),我們會(huì )在后臺編寫(xiě)它,然后單擊“發(fā)布”。過(guò)程如下:
瀏覽器=>;提交表格=>;php=>;數據庫
在這里,我們將跳過(guò)前面的三個(gè)步驟,直接連接到數據庫:
命令行=>;數據庫
<p>通過(guò)查看WordPress數據庫中的WP,在posts表中的字段之后,我編寫(xiě)了一條SQL語(yǔ)句并保留了三個(gè)位置:content、title和name,它們分別表示
文章采集調用(沒(méi)有內容就沒(méi)有排名嗎?你錯了,可以組合內容去排名)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 149 次瀏覽 ? 2021-09-25 15:12
采集 的排名策略有很多??傊?,大部分采集站都不會(huì )使用內容參與排名,因為采集的大部分內容都是低質(zhì)量的,所以排名無(wú)望,沒(méi)有內容就沒(méi)有排名嗎?你錯了,你可以結合內容進(jìn)行排名,看看采集站做的有多棒。
1、標簽頁(yè)
標簽頁(yè)是將大部分文章組合成一個(gè)列表,所以標簽頁(yè)被定義為一個(gè)偽原創(chuàng )頁(yè)。雖然是偽原創(chuàng )頁(yè)面,但是因為這個(gè)列表,質(zhì)量非常好。關(guān)鍵詞的內容都是和關(guān)鍵詞一致的,而一個(gè)采集網(wǎng)站的入口,至少會(huì )有幾萬(wàn)個(gè)標簽頁(yè),或多或少幾千個(gè)關(guān)鍵詞 的排名并不奇怪。
2、列表頁(yè)面
列表頁(yè)與標簽頁(yè)類(lèi)似,但是建立大量列表有點(diǎn)困難,所以很多采集站點(diǎn)可以通過(guò)創(chuàng )建自己的列表采集來(lái)形成一個(gè)高質(zhì)量的頁(yè)面頁(yè)面,并且排名方法類(lèi)似。通常采集更新,這個(gè)頁(yè)面也更新。
3、搜索頁(yè)面
搜索頁(yè)面被視為偽靜態(tài)。當用戶(hù)搜索某個(gè)關(guān)鍵詞時(shí),出現的頁(yè)面都是靜態(tài)頁(yè)面,有利于搜索引擎。當文章更新時(shí),搜索頁(yè)面也隨之更新,只要用戶(hù)進(jìn)行搜索,這個(gè)關(guān)鍵詞基本上是很容易上榜的。
4、專(zhuān)頁(yè)
通過(guò)創(chuàng )建特殊頁(yè)面,自動(dòng)調用相關(guān)文章形成列表,調用程序即可識別相關(guān)性。這時(shí)候這個(gè)頁(yè)面上關(guān)鍵詞的內容滿(mǎn)足內容要求,也形成了一個(gè)不錯的Page,排名在意料之中。
5、內容頁(yè)面
內容頁(yè)的排名策略很少見(jiàn),但是最近很多人用內容頁(yè)做排名,而且都是采集,主要是通過(guò)采集多張圖片和視頻組成一個(gè)頁(yè)面,第一張圖片視頻無(wú)法被搜索引擎識別,將網(wǎng)站的第二張多張圖片合二為一,偽原創(chuàng )的真相自然就出現了。
改變: 查看全部
文章采集調用(沒(méi)有內容就沒(méi)有排名嗎?你錯了,可以組合內容去排名)
采集 的排名策略有很多??傊?,大部分采集站都不會(huì )使用內容參與排名,因為采集的大部分內容都是低質(zhì)量的,所以排名無(wú)望,沒(méi)有內容就沒(méi)有排名嗎?你錯了,你可以結合內容進(jìn)行排名,看看采集站做的有多棒。
1、標簽頁(yè)
標簽頁(yè)是將大部分文章組合成一個(gè)列表,所以標簽頁(yè)被定義為一個(gè)偽原創(chuàng )頁(yè)。雖然是偽原創(chuàng )頁(yè)面,但是因為這個(gè)列表,質(zhì)量非常好。關(guān)鍵詞的內容都是和關(guān)鍵詞一致的,而一個(gè)采集網(wǎng)站的入口,至少會(huì )有幾萬(wàn)個(gè)標簽頁(yè),或多或少幾千個(gè)關(guān)鍵詞 的排名并不奇怪。
2、列表頁(yè)面
列表頁(yè)與標簽頁(yè)類(lèi)似,但是建立大量列表有點(diǎn)困難,所以很多采集站點(diǎn)可以通過(guò)創(chuàng )建自己的列表采集來(lái)形成一個(gè)高質(zhì)量的頁(yè)面頁(yè)面,并且排名方法類(lèi)似。通常采集更新,這個(gè)頁(yè)面也更新。
3、搜索頁(yè)面
搜索頁(yè)面被視為偽靜態(tài)。當用戶(hù)搜索某個(gè)關(guān)鍵詞時(shí),出現的頁(yè)面都是靜態(tài)頁(yè)面,有利于搜索引擎。當文章更新時(shí),搜索頁(yè)面也隨之更新,只要用戶(hù)進(jìn)行搜索,這個(gè)關(guān)鍵詞基本上是很容易上榜的。
4、專(zhuān)頁(yè)
通過(guò)創(chuàng )建特殊頁(yè)面,自動(dòng)調用相關(guān)文章形成列表,調用程序即可識別相關(guān)性。這時(shí)候這個(gè)頁(yè)面上關(guān)鍵詞的內容滿(mǎn)足內容要求,也形成了一個(gè)不錯的Page,排名在意料之中。
5、內容頁(yè)面
內容頁(yè)的排名策略很少見(jiàn),但是最近很多人用內容頁(yè)做排名,而且都是采集,主要是通過(guò)采集多張圖片和視頻組成一個(gè)頁(yè)面,第一張圖片視頻無(wú)法被搜索引擎識別,將網(wǎng)站的第二張多張圖片合二為一,偽原創(chuàng )的真相自然就出現了。
改變:
文章采集調用(【Python學(xué)習福利】豆瓣電影中如何運用多個(gè)網(wǎng)址請求)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 203 次瀏覽 ? 2021-09-25 15:10
點(diǎn)擊上方“IT共享屋”關(guān)注
回復“資料”領(lǐng)取Python學(xué)習福利
【一、項目背景】
豆瓣影業(yè)提供最新的電影介紹和影評,包括正在放映的電影的視頻查詢(xún)和購票服務(wù)。順便可以錄下想看的電影和電視劇,看,看,還可以寫(xiě)影評。它極大地方便了人們的生活。
今天以電視?。绖。槔?,批量抓取對應的電影,寫(xiě)入csv文件。用戶(hù)可以通過(guò)評分更好地選擇自己想要的電影。
【二、項目目標】
獲取對應的電影名稱(chēng)、評分、詳情鏈接,下載電影圖片,保存文件。
[三、 涉及的圖書(shū)館和 網(wǎng)站]
1、 網(wǎng)址如下:
https://movie.douban.com/j/sea ... rt%3D{}
2、 涉及的庫:requests、fake_useragent、json、csv
3、軟件:PyCharm
【四、項目分析】
1、如何請求多個(gè)頁(yè)面?
當您單擊下一頁(yè)時(shí),每增加一頁(yè),paged 將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
2. 如何獲取實(shí)際請求的地址?
在請求數據時(shí),發(fā)現頁(yè)面上沒(méi)有對應的數據。其實(shí)豆瓣是通過(guò)javascript動(dòng)態(tài)加載內容來(lái)防止采集的。
1)F12 右擊查看,在左側菜單中找到Network,和name,找到第五個(gè)數據,點(diǎn)擊Preview。
2) 點(diǎn)擊subjects,可以看到title是對應電影的名字。率是相應的分數。通過(guò)js解析subjects字典,找到需要的字段。
3. 如何訪(fǎng)問(wèn)網(wǎng)頁(yè)?
https://movie.douban.com/j/sea ... %3D60
單擊下一頁(yè)時(shí),每增加一頁(yè),該頁(yè)將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
【五、項目實(shí)施】
1、 我們定義一個(gè)類(lèi)繼承對象,然后定義init方法繼承self,再定義一個(gè)main函數main繼承self。導入所需的庫和請求 URL。
import requests,jsonfrom fake_useragent import UserAgentimport csvclass Doban(object): def __init__(self): self.url = "https://movie.douban.com/j/sea ... rt%3D{}" def main(self): passif __name__ == '__main__': Siper = Doban() Siper.main()
2、 隨機生成UserAgent,構造請求頭,防止反爬。
for i in range(1, 50): self.headers = { 'User-Agent': ua.random, }
3、發(fā)送請求,獲取響應,頁(yè)面回調,方便下次請求。
def get_page(self, url): res = requests.get(url=url, headers=self.headers) html = res.content.decode("utf-8") return html
4、json 解析頁(yè)面數據,獲取對應的字典。
data = json.loads(html)['subjects'] # print(data[0])
5、進(jìn)行遍歷,獲取對應的電影名,評分,鏈接到下一個(gè)詳情頁(yè)。
print(name, goblin_herf) html2 = self.get_page(goblin_herf) # 第二個(gè)發(fā)生請求 parse_html2 = etree.HTML(html2) r = parse_html2.xpath('//div[@]/p/text()')
6、創(chuàng )建一個(gè)用于寫(xiě)入的csv文件,定義相應的header內容,并保存數據。
# 創(chuàng )建csv文件進(jìn)行寫(xiě)入 csv_file = open('scr.csv', 'a', encoding='gbk') csv_writer = csv.writer(csv_file) # 寫(xiě)入csv標題頭內容 csv_writerr.writerow(['電影', '評分', "詳情頁(yè)"]) #寫(xiě)入數據 csv_writer.writerow([id, rate, urll])
7、一個(gè)請求的圖片地址。定義圖片的名稱(chēng)并保存文檔。
html2 = requests.get(url=urll, headers=self.headers).content dirname = "./圖/" + id + ".jpg" with open(dirname, 'wb') as f: f.write(html2) print("%s 【下載成功?。。?!】" % id)
8、 調用方法來(lái)實(shí)現功能。
html = self.get_page(url) self.parse_page(html)
9、項目?jì)?yōu)化:1)設置延時(shí)。
time.sleep(1.4)
2) 定義一個(gè)變量u,用于遍歷,表示爬取的是哪個(gè)頁(yè)面。(更清晰,更令人印象深刻)。
u = 0 self.u += 1;
[六、效果展示]
1、 點(diǎn)擊綠色三角進(jìn)入起始頁(yè)和結束頁(yè)(從第0頁(yè)開(kāi)始)。
2、 在控制臺顯示下載成功信息。
3、保存csv文件。
4、電影圖片顯示。
[七、總結]
1、 不建議抓取太多數據,可能造成服務(wù)器負載,簡(jiǎn)單試一下。
2、本文章針對Python爬豆豆應用中的難點(diǎn)和關(guān)鍵點(diǎn),以及如何防止回爬等問(wèn)題,做了一個(gè)相對的解決方案。
3、希望這個(gè)項目能幫助大家了解json解析頁(yè)面的基本流程,如何拼接字符串,如何使用format函數。
4、 本文基于Python網(wǎng)絡(luò )爬蟲(chóng),利用爬蟲(chóng)庫實(shí)現豆瓣電影及其圖片的獲取。說(shuō)到實(shí)現,總會(huì )有各種各樣的問(wèn)題。不要看最好的,努力去更深入地理解。
5、需要本文源代碼的可以在后臺回復“豆瓣電影”獲取。
看完這篇文章你學(xué)會(huì )了嗎?請轉發(fā)并分享給更多人
IT共享之家 查看全部
文章采集調用(【Python學(xué)習福利】豆瓣電影中如何運用多個(gè)網(wǎng)址請求)
點(diǎn)擊上方“IT共享屋”關(guān)注
回復“資料”領(lǐng)取Python學(xué)習福利
【一、項目背景】
豆瓣影業(yè)提供最新的電影介紹和影評,包括正在放映的電影的視頻查詢(xún)和購票服務(wù)。順便可以錄下想看的電影和電視劇,看,看,還可以寫(xiě)影評。它極大地方便了人們的生活。
今天以電視?。绖。槔?,批量抓取對應的電影,寫(xiě)入csv文件。用戶(hù)可以通過(guò)評分更好地選擇自己想要的電影。
【二、項目目標】
獲取對應的電影名稱(chēng)、評分、詳情鏈接,下載電影圖片,保存文件。
[三、 涉及的圖書(shū)館和 網(wǎng)站]
1、 網(wǎng)址如下:
https://movie.douban.com/j/sea ... rt%3D{}
2、 涉及的庫:requests、fake_useragent、json、csv
3、軟件:PyCharm
【四、項目分析】
1、如何請求多個(gè)頁(yè)面?
當您單擊下一頁(yè)時(shí),每增加一頁(yè),paged 將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
2. 如何獲取實(shí)際請求的地址?
在請求數據時(shí),發(fā)現頁(yè)面上沒(méi)有對應的數據。其實(shí)豆瓣是通過(guò)javascript動(dòng)態(tài)加載內容來(lái)防止采集的。
1)F12 右擊查看,在左側菜單中找到Network,和name,找到第五個(gè)數據,點(diǎn)擊Preview。

2) 點(diǎn)擊subjects,可以看到title是對應電影的名字。率是相應的分數。通過(guò)js解析subjects字典,找到需要的字段。

3. 如何訪(fǎng)問(wèn)網(wǎng)頁(yè)?
https://movie.douban.com/j/sea ... %3D60
單擊下一頁(yè)時(shí),每增加一頁(yè),該頁(yè)將增加 20。使用{}替換轉換后的變量,然后使用for循環(huán)遍歷URL實(shí)現多個(gè)URL請求。
【五、項目實(shí)施】
1、 我們定義一個(gè)類(lèi)繼承對象,然后定義init方法繼承self,再定義一個(gè)main函數main繼承self。導入所需的庫和請求 URL。
import requests,jsonfrom fake_useragent import UserAgentimport csvclass Doban(object): def __init__(self): self.url = "https://movie.douban.com/j/sea ... rt%3D{}" def main(self): passif __name__ == '__main__': Siper = Doban() Siper.main()
2、 隨機生成UserAgent,構造請求頭,防止反爬。
for i in range(1, 50): self.headers = { 'User-Agent': ua.random, }
3、發(fā)送請求,獲取響應,頁(yè)面回調,方便下次請求。
def get_page(self, url): res = requests.get(url=url, headers=self.headers) html = res.content.decode("utf-8") return html
4、json 解析頁(yè)面數據,獲取對應的字典。
data = json.loads(html)['subjects'] # print(data[0])
5、進(jìn)行遍歷,獲取對應的電影名,評分,鏈接到下一個(gè)詳情頁(yè)。
print(name, goblin_herf) html2 = self.get_page(goblin_herf) # 第二個(gè)發(fā)生請求 parse_html2 = etree.HTML(html2) r = parse_html2.xpath('//div[@]/p/text()')
6、創(chuàng )建一個(gè)用于寫(xiě)入的csv文件,定義相應的header內容,并保存數據。
# 創(chuàng )建csv文件進(jìn)行寫(xiě)入 csv_file = open('scr.csv', 'a', encoding='gbk') csv_writer = csv.writer(csv_file) # 寫(xiě)入csv標題頭內容 csv_writerr.writerow(['電影', '評分', "詳情頁(yè)"]) #寫(xiě)入數據 csv_writer.writerow([id, rate, urll])
7、一個(gè)請求的圖片地址。定義圖片的名稱(chēng)并保存文檔。
html2 = requests.get(url=urll, headers=self.headers).content dirname = "./圖/" + id + ".jpg" with open(dirname, 'wb') as f: f.write(html2) print("%s 【下載成功?。。?!】" % id)
8、 調用方法來(lái)實(shí)現功能。
html = self.get_page(url) self.parse_page(html)
9、項目?jì)?yōu)化:1)設置延時(shí)。
time.sleep(1.4)
2) 定義一個(gè)變量u,用于遍歷,表示爬取的是哪個(gè)頁(yè)面。(更清晰,更令人印象深刻)。
u = 0 self.u += 1;
[六、效果展示]
1、 點(diǎn)擊綠色三角進(jìn)入起始頁(yè)和結束頁(yè)(從第0頁(yè)開(kāi)始)。

2、 在控制臺顯示下載成功信息。

3、保存csv文件。

4、電影圖片顯示。

[七、總結]
1、 不建議抓取太多數據,可能造成服務(wù)器負載,簡(jiǎn)單試一下。
2、本文章針對Python爬豆豆應用中的難點(diǎn)和關(guān)鍵點(diǎn),以及如何防止回爬等問(wèn)題,做了一個(gè)相對的解決方案。
3、希望這個(gè)項目能幫助大家了解json解析頁(yè)面的基本流程,如何拼接字符串,如何使用format函數。
4、 本文基于Python網(wǎng)絡(luò )爬蟲(chóng),利用爬蟲(chóng)庫實(shí)現豆瓣電影及其圖片的獲取。說(shuō)到實(shí)現,總會(huì )有各種各樣的問(wèn)題。不要看最好的,努力去更深入地理解。
5、需要本文源代碼的可以在后臺回復“豆瓣電影”獲取。
看完這篇文章你學(xué)會(huì )了嗎?請轉發(fā)并分享給更多人
IT共享之家
文章采集調用(使用typecho程序搭建博客分享的函數代碼,博主僅需要設置)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 162 次瀏覽 ? 2021-09-24 13:05
使用 typecho 程序構建博客。如果想在網(wǎng)站頁(yè)面的某個(gè)位置展示博主想要指定的幾篇文章文章怎么辦?不懂typecho開(kāi)發(fā)的博主可以選擇直接在模板文件中添加html代碼。這顯然不夠靈活,添加、刪除和修改非常不方便。下面博客欄分享的功能代碼,博主只需要設置文章id就可以調用文章的列表顯示出來(lái),非常方便。
腳步:
1、在主題的functions.php文件中添加如下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//by boke8.net
function boke8GetIdPosts($id){
if($id){
$getid = explode(',',$id);
$db = Typecho_Db::get();
$result = $db->fetchAll($db->select()->from('table.contents')
->where('status = ?','publish')
->where('type = ?', 'post')
->where('cid in ?',$getid)
->order('cid', Typecho_Db::SORT_DESC)
);
if($result){
$i=1;
foreach($result as $val){
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);
$post_title = htmlspecialchars($val['title']);
$permalink = $val['permalink'];
echo ''.$post_title.'';
}
}
}else{
echo '請設置要調用的文章ID';
}
}
2、在要顯示的位置對應的模板文件中添加如下調用代碼文章:
1
其中1、4、6是要調用的文章id。你可以修改為你要調用的文章id。多個(gè) id 用英文逗號分隔。
除非另有說(shuō)明,文章將由博客整理發(fā)布,歡迎轉載。 查看全部
文章采集調用(使用typecho程序搭建博客分享的函數代碼,博主僅需要設置)
使用 typecho 程序構建博客。如果想在網(wǎng)站頁(yè)面的某個(gè)位置展示博主想要指定的幾篇文章文章怎么辦?不懂typecho開(kāi)發(fā)的博主可以選擇直接在模板文件中添加html代碼。這顯然不夠靈活,添加、刪除和修改非常不方便。下面博客欄分享的功能代碼,博主只需要設置文章id就可以調用文章的列表顯示出來(lái),非常方便。
腳步:
1、在主題的functions.php文件中添加如下代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//by boke8.net
function boke8GetIdPosts($id){
if($id){
$getid = explode(',',$id);
$db = Typecho_Db::get();
$result = $db->fetchAll($db->select()->from('table.contents')
->where('status = ?','publish')
->where('type = ?', 'post')
->where('cid in ?',$getid)
->order('cid', Typecho_Db::SORT_DESC)
);
if($result){
$i=1;
foreach($result as $val){
$val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);
$post_title = htmlspecialchars($val['title']);
$permalink = $val['permalink'];
echo ''.$post_title.'';
}
}
}else{
echo '請設置要調用的文章ID';
}
}
2、在要顯示的位置對應的模板文件中添加如下調用代碼文章:
1
其中1、4、6是要調用的文章id。你可以修改為你要調用的文章id。多個(gè) id 用英文逗號分隔。
除非另有說(shuō)明,文章將由博客整理發(fā)布,歡迎轉載。
文章采集調用(“量光尺”可以回答這個(gè)問(wèn)題批量下載dng圖片教程)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 173 次瀏覽 ? 2021-09-24 08:02
文章采集調用的相機選項不同,例如所調用相機的可能性為jpeg、png、jpg、alpha?;蛘邔τ谀承┨厥飧袷剑ㄈ?jpg),可能會(huì )需要對相機進(jìn)行格式轉換,所以文件需要進(jìn)行另外設置,如bmp等。(不同廠(chǎng)商相機格式可能也會(huì )略有不同)文件大小因相機而異,反正有些m43相機(相當于sonyq5)是8mb,a7(相當于a7r)是7mb。批量操作時(shí),可以先發(fā)布批量任務(wù),然后采集好圖片即可,然后批量將批量圖片下載下來(lái)放在相機指定目錄即可。
“量光尺”可以回答這個(gè)問(wèn)題批量下載dng圖片教程dng下載批量下載dng圖片步驟1,文件分類(lèi),按照照片分別命名。例如“分辨率”、“位數”等。2,用批量下載軟件來(lái)批量下載到電腦。3,電腦選好圖片后,用郵件上傳至服務(wù)器。4,根據接收郵件中dng文件的路徑,上傳圖片。5,上傳成功后,等待服務(wù)器主動(dòng)下載。
設置每個(gè)圖片的md5,然后跟位數之類(lèi)的做比對,圖片的位數是以一個(gè)二進(jìn)制最高位為標準的,所以fg100的同一個(gè)圖片可能最高位是51,
可以將所有圖片用批量下載軟件處理,以r057223606下載文件為例,我們只需要將r057223606文件下載到電腦中,然后我們運行批量下載軟件處理完成, 查看全部
文章采集調用(“量光尺”可以回答這個(gè)問(wèn)題批量下載dng圖片教程)
文章采集調用的相機選項不同,例如所調用相機的可能性為jpeg、png、jpg、alpha?;蛘邔τ谀承┨厥飧袷剑ㄈ?jpg),可能會(huì )需要對相機進(jìn)行格式轉換,所以文件需要進(jìn)行另外設置,如bmp等。(不同廠(chǎng)商相機格式可能也會(huì )略有不同)文件大小因相機而異,反正有些m43相機(相當于sonyq5)是8mb,a7(相當于a7r)是7mb。批量操作時(shí),可以先發(fā)布批量任務(wù),然后采集好圖片即可,然后批量將批量圖片下載下來(lái)放在相機指定目錄即可。
“量光尺”可以回答這個(gè)問(wèn)題批量下載dng圖片教程dng下載批量下載dng圖片步驟1,文件分類(lèi),按照照片分別命名。例如“分辨率”、“位數”等。2,用批量下載軟件來(lái)批量下載到電腦。3,電腦選好圖片后,用郵件上傳至服務(wù)器。4,根據接收郵件中dng文件的路徑,上傳圖片。5,上傳成功后,等待服務(wù)器主動(dòng)下載。
設置每個(gè)圖片的md5,然后跟位數之類(lèi)的做比對,圖片的位數是以一個(gè)二進(jìn)制最高位為標準的,所以fg100的同一個(gè)圖片可能最高位是51,
可以將所有圖片用批量下載軟件處理,以r057223606下載文件為例,我們只需要將r057223606文件下載到電腦中,然后我們運行批量下載軟件處理完成,
文章采集調用(文章采集調用的視頻及文本字幕特征識別(s標簽))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 140 次瀏覽 ? 2021-09-24 00:55
文章采集調用的cv庫d2d2d,轉為json傳遞給jd2d進(jìn)行讀取相應標簽(s標簽)的視頻及文本字幕特征識別文本識別:text-rnn,
json格式對一個(gè)video進(jìn)行文本標注
轉為txt格式在jsonread函數中讀取
用jsonread讀取字幕數據
除了使用這些字幕數據之外,也可以嘗試用txt讀取器進(jìn)行txt格式的字幕數據抓取,
可以參考下面這個(gè)函數:jsonreader字幕讀取器pivot={"s":"theroute","i":"a1","o":"theroute","v":"photo","a":1,"b":1,"c":2,"d":3,"e":1,"f":"entry","g":"home","h":"scanner","g":"websearch","t":"video","j":"image","k":"red","m":"news","n":"popular's'}。
沒(méi)聽(tīng)說(shuō)過(guò)這個(gè)庫python最為知名的庫
現在有直接讀取視頻的腳本,github一搜一大把。但是你問(wèn)的是中文字幕的話(huà),這個(gè)我不知道。自己寫(xiě)過(guò)一個(gè)中文字幕讀取腳本,用一種自己常用的方法。搜了一下,發(fā)現這種方法很簡(jiǎn)單,就不獻丑了,可以百度學(xué)習下。 查看全部
文章采集調用(文章采集調用的視頻及文本字幕特征識別(s標簽))
文章采集調用的cv庫d2d2d,轉為json傳遞給jd2d進(jìn)行讀取相應標簽(s標簽)的視頻及文本字幕特征識別文本識別:text-rnn,
json格式對一個(gè)video進(jìn)行文本標注
轉為txt格式在jsonread函數中讀取
用jsonread讀取字幕數據
除了使用這些字幕數據之外,也可以嘗試用txt讀取器進(jìn)行txt格式的字幕數據抓取,
可以參考下面這個(gè)函數:jsonreader字幕讀取器pivot={"s":"theroute","i":"a1","o":"theroute","v":"photo","a":1,"b":1,"c":2,"d":3,"e":1,"f":"entry","g":"home","h":"scanner","g":"websearch","t":"video","j":"image","k":"red","m":"news","n":"popular's'}。
沒(méi)聽(tīng)說(shuō)過(guò)這個(gè)庫python最為知名的庫
現在有直接讀取視頻的腳本,github一搜一大把。但是你問(wèn)的是中文字幕的話(huà),這個(gè)我不知道。自己寫(xiě)過(guò)一個(gè)中文字幕讀取腳本,用一種自己常用的方法。搜了一下,發(fā)現這種方法很簡(jiǎn)單,就不獻丑了,可以百度學(xué)習下。
文章采集調用(文章調用別人的服務(wù)器實(shí)現站內搜索功能的方法)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 151 次瀏覽 ? 2021-09-23 02:01
文章采集調用文檔來(lái)采集文章,這就涉及到,平時(shí)看到的,朋友圈轉發(fā)的鏈接,這些都是能采集的,或者想采集的,一般編寫(xiě)好采集代碼就可以實(shí)現,也可以把采集的頁(yè)面地址放到我的網(wǎng)站里面去實(shí)現自動(dòng)采集也行。采集工具都是采集的別人的站點(diǎn)地址,可以通過(guò)編寫(xiě)采集代碼實(shí)現自動(dòng)采集的功能。了解更多干貨文章可以關(guān)注筆者公眾號:huangling_com,每天都有更新原創(chuàng )文章,歡迎大家來(lái)轉載,也可以通過(guò)留言,交流學(xué)習。
可以使用python的urllib.request去調用別人的服務(wù)器實(shí)現站內搜索功能。想自己實(shí)現的話(huà),我建議你學(xué)習python爬蟲(chóng)。
站內搜索的話(huà),應該能直接調用或京東的網(wǎng)站,否則你就得爬數十個(gè)國內站點(diǎn)。另外,京東應該不是所有商品都放在同一個(gè)商品頁(yè)面,有些商品是放在不同頁(yè)面上的,你得通過(guò)google或百度去找到目標商品頁(yè)面。另外,按你的需求,好像很多高傭的平臺也都能爬,比如京東、客、返利網(wǎng)等等。當然如果你想要有趣的東西的話(huà),我建議你找“全能搜索引擎google搜索”來(lái)練練手。
站內搜索還是比較麻煩的因為在同一商品頁(yè)面可能有多個(gè)搜索頁(yè)面。
我倒是知道直接爬取和京東的商品頁(yè)面。直接有太多的選擇了, 查看全部
文章采集調用(文章調用別人的服務(wù)器實(shí)現站內搜索功能的方法)
文章采集調用文檔來(lái)采集文章,這就涉及到,平時(shí)看到的,朋友圈轉發(fā)的鏈接,這些都是能采集的,或者想采集的,一般編寫(xiě)好采集代碼就可以實(shí)現,也可以把采集的頁(yè)面地址放到我的網(wǎng)站里面去實(shí)現自動(dòng)采集也行。采集工具都是采集的別人的站點(diǎn)地址,可以通過(guò)編寫(xiě)采集代碼實(shí)現自動(dòng)采集的功能。了解更多干貨文章可以關(guān)注筆者公眾號:huangling_com,每天都有更新原創(chuàng )文章,歡迎大家來(lái)轉載,也可以通過(guò)留言,交流學(xué)習。
可以使用python的urllib.request去調用別人的服務(wù)器實(shí)現站內搜索功能。想自己實(shí)現的話(huà),我建議你學(xué)習python爬蟲(chóng)。
站內搜索的話(huà),應該能直接調用或京東的網(wǎng)站,否則你就得爬數十個(gè)國內站點(diǎn)。另外,京東應該不是所有商品都放在同一個(gè)商品頁(yè)面,有些商品是放在不同頁(yè)面上的,你得通過(guò)google或百度去找到目標商品頁(yè)面。另外,按你的需求,好像很多高傭的平臺也都能爬,比如京東、客、返利網(wǎng)等等。當然如果你想要有趣的東西的話(huà),我建議你找“全能搜索引擎google搜索”來(lái)練練手。
站內搜索還是比較麻煩的因為在同一商品頁(yè)面可能有多個(gè)搜索頁(yè)面。
我倒是知道直接爬取和京東的商品頁(yè)面。直接有太多的選擇了,
文章采集調用(全網(wǎng)收錄最快百度快速收錄排名系統測試當天收錄無(wú)限裂變優(yōu)化權重必備)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 184 次瀏覽 ? 2021-09-21 11:23
收錄是全網(wǎng)最快的百度f(wàn)ast收錄排名系統。有必要在試驗當天優(yōu)化收錄無(wú)限裂變的重量
導言:
這組程序的運行環(huán)境是PHP環(huán)境。在網(wǎng)站目錄下創(chuàng )建一個(gè)輔助目錄,例如XX目錄。將程序放入這個(gè)XX目錄,并配置相關(guān)設置文件,包括關(guān)鍵詞、相關(guān)性文章、模板、標題等。該程序可以自動(dòng)拆分Web鏈接并將其推送到百度24小時(shí),以加速收錄。操作非常簡(jiǎn)單,有教程,一步一步詳細介紹!添加收錄并將必要的程序排列到主站
支持軟件:
1、關(guān)鍵詞采集軟件
采集幾個(gè)與關(guān)鍵詞相關(guān)的行業(yè)被插入到該計劃中,以?xún)?yōu)化排名
@K22文章和title采集軟件
點(diǎn)擊全自動(dòng)采集行業(yè)相關(guān)性文章和標題,軟件會(huì )自動(dòng)調用文章of采集來(lái)執行文章標題和內容,以增加內容相關(guān)性
3、自動(dòng)裂變百度推送軟件
自動(dòng)無(wú)限分割網(wǎng)頁(yè)鏈接并將其推送到百度,以加快蜘蛛爬行收錄
測試效果演示。測試已經(jīng)在收錄進(jìn)行了2天,一些關(guān)鍵詞已經(jīng)排名
有了視頻教程,設置起來(lái)很方便。如果你不明白,你可以看視頻來(lái)解決它
這個(gè)程序是由一個(gè)工作室開(kāi)發(fā)的。這個(gè)網(wǎng)站花了3999元獲得它?,F在以低價(jià)賣(mài)給新老客戶(hù)
PHP程序,自行研究。我們不提供免費的技術(shù)支持。我會(huì )原諒你的
把這個(gè)論壇放到程序目錄中測試效果
2021年4月7日百度收錄5W7432
2021年4月8日百度收錄7W0098
瘋狂收錄
另一個(gè)試驗場(chǎng)地效應
看到上面的數據是不是很棒?p>
發(fā)送百度推送軟件
百度推送軟件幫助您的網(wǎng)站引導百度蜘蛛爬行,并加速收錄魔術(shù)軟件
文件名:Baidu fast收錄ranking system.rar
元寶比例:10元=100元;售價(jià):3500元
下載權限:無(wú)限或VIP會(huì )員【購買(mǎi)VIP】【充值元寶】【拉大轉盤(pán)贏(yíng)取元寶】
安全檢測,請放心下載
售價(jià):350元=3500元 查看全部
文章采集調用(全網(wǎng)收錄最快百度快速收錄排名系統測試當天收錄無(wú)限裂變優(yōu)化權重必備)
收錄是全網(wǎng)最快的百度f(wàn)ast收錄排名系統。有必要在試驗當天優(yōu)化收錄無(wú)限裂變的重量
導言:
這組程序的運行環(huán)境是PHP環(huán)境。在網(wǎng)站目錄下創(chuàng )建一個(gè)輔助目錄,例如XX目錄。將程序放入這個(gè)XX目錄,并配置相關(guān)設置文件,包括關(guān)鍵詞、相關(guān)性文章、模板、標題等。該程序可以自動(dòng)拆分Web鏈接并將其推送到百度24小時(shí),以加速收錄。操作非常簡(jiǎn)單,有教程,一步一步詳細介紹!添加收錄并將必要的程序排列到主站
支持軟件:
1、關(guān)鍵詞采集軟件
采集幾個(gè)與關(guān)鍵詞相關(guān)的行業(yè)被插入到該計劃中,以?xún)?yōu)化排名
@K22文章和title采集軟件
點(diǎn)擊全自動(dòng)采集行業(yè)相關(guān)性文章和標題,軟件會(huì )自動(dòng)調用文章of采集來(lái)執行文章標題和內容,以增加內容相關(guān)性
3、自動(dòng)裂變百度推送軟件
自動(dòng)無(wú)限分割網(wǎng)頁(yè)鏈接并將其推送到百度,以加快蜘蛛爬行收錄
測試效果演示。測試已經(jīng)在收錄進(jìn)行了2天,一些關(guān)鍵詞已經(jīng)排名
有了視頻教程,設置起來(lái)很方便。如果你不明白,你可以看視頻來(lái)解決它
這個(gè)程序是由一個(gè)工作室開(kāi)發(fā)的。這個(gè)網(wǎng)站花了3999元獲得它?,F在以低價(jià)賣(mài)給新老客戶(hù)
PHP程序,自行研究。我們不提供免費的技術(shù)支持。我會(huì )原諒你的





把這個(gè)論壇放到程序目錄中測試效果

2021年4月7日百度收錄5W7432

2021年4月8日百度收錄7W0098

瘋狂收錄

另一個(gè)試驗場(chǎng)地效應



看到上面的數據是不是很棒?p>
發(fā)送百度推送軟件
百度推送軟件幫助您的網(wǎng)站引導百度蜘蛛爬行,并加速收錄魔術(shù)軟件

文件名:Baidu fast收錄ranking system.rar
元寶比例:10元=100元;售價(jià):3500元
下載權限:無(wú)限或VIP會(huì )員【購買(mǎi)VIP】【充值元寶】【拉大轉盤(pán)贏(yíng)取元寶】
安全檢測,請放心下載
售價(jià):350元=3500元
文章采集調用(引用計數策略和垃圾收集策略都屬于資源的自動(dòng)化管理)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 193 次瀏覽 ? 2021-09-21 05:01
源鏈接:
從本質(zhì)上講,引用計數策略和垃圾采集策略都屬于資源的自動(dòng)管理。所謂的自動(dòng)管理是指邏輯層不知道資源何時(shí)釋放,而是依靠底層庫來(lái)維持資源的生命周期
手動(dòng)管理可以準確地了解資源的生命周期,并在準確的位置回收資源。在C++中,析構函數指定用于刪除的資源,編譯器生成的代碼自動(dòng)析構函數基類(lèi)和成員變量
因此,為C++編寫(xiě)垃圾采集器與手動(dòng)管理資源并不沖突。幾乎所有大型C++項目都使用自動(dòng)化管理,但它使用引用計數策略,而不是垃圾采集。也就是說(shuō),長(cháng)期以來(lái),我們采用C++或C語(yǔ)言,將人工管理和自動(dòng)管理相結合來(lái)構建系統。無(wú)論是使用引用計數還是垃圾采集,我們仍然可以在軟件實(shí)現的細節中管理手動(dòng)管理
為什么使用自動(dòng)資源生命周期管理
讓我們看一下面向對象。如果一切都是一個(gè)物體,那么每個(gè)物體都應該對自己的生命負責。我們可以直接準確地確定死亡時(shí)間。不幸的是,很多東西都不是純對象。最重要的是對象容器。除了它們自己的屬性外,它們還維護對一組類(lèi)似對象的引用
一個(gè)對象可以被多個(gè)容器引用,這使得容器不同于貓和狗的對象實(shí)體。因為容器指的是一個(gè)事物,它并不意味著(zhù)它是容器的一部分(有時(shí)可以,有時(shí)不能)。當我們想把整個(gè)世界分成物體,所有原子都分成各個(gè)層次的物體時(shí),我們會(huì )發(fā)現,物體無(wú)法提取的概念總數為零。引用而不是擁有是不可避免的
面向對象的本質(zhì)是從許多對象中提取共性,并將它們一起處理。這樣,各種容器的使用是不可避免的
同樣,該對象不知道他是否可以宣布死亡。除非您知道自己與其他對象的關(guān)系(此關(guān)系不是對象)。資源可以是對象,而自動(dòng)管理就是管理這些對象和對象之間的關(guān)系
引用計數是最容易實(shí)現的解決方案:記錄對象被引用的次數,而不具體記錄引用對象的人。這樣,建立和取消引用的成本就降低了。然而,也有得失。在引用計數的過(guò)程中,我們也丟失了重要的信息:誰(shuí)引用了我們自己。因此,在處理間接引用時(shí),引用計數的成本更高
物體死亡的判斷是物體是否與世界有直接或間接的聯(lián)系。因此,即使一個(gè)對象被另一個(gè)對象直接引用,該對象也可能不存在。為了解決這個(gè)問(wèn)題,使用引用計數的系統必須在與世界斷開(kāi)連接時(shí)通知與其關(guān)聯(lián)的對象。目標銷(xiāo)毀成本的增加是參考計數策略的短板
物體的破壞頻率取決于物體的平均壽命。一方面,對象的生存時(shí)間受對象粒度的影響。對象粒度越細,對象的平均生存時(shí)間越短(雖然表面上沒(méi)有直接聯(lián)系,但在實(shí)際設計中往往會(huì )導致這種結果);另一方面,我們通常將容器和引用關(guān)系實(shí)現為一個(gè)對象(概念上,它不應該是一個(gè)對象)。例如,許多自動(dòng)維護引用計數的智能指針是一個(gè)小容器,其中收錄對對象的唯一引用,并且它是作為一個(gè)小對象實(shí)現的
通常,對象本身的性質(zhì)不會(huì )隨其在內存空間中的位置而改變。但是,引用關(guān)系(通常用指針實(shí)現)與內存地址有關(guān)。C++缺少用于在內存中移動(dòng)對象的語(yǔ)義表達式。等效的方法是在一個(gè)新的內存塊中復制和構造一個(gè)新對象,并銷(xiāo)毀原創(chuàng )對象
另一方面,在程序的運行序列中,由函數調用引起的堆棧上的嵌套作用域也可以視為容器。機器指令通過(guò)這些作用域,臨時(shí)構造的對象引用(智能指針)被放置在這些作用域中。函數調用越頻繁,創(chuàng )建和銷(xiāo)毀這些作用域的頻率就越高
因此,C++必須依賴(lài)大量的內聯(lián)函數來(lái)讓編譯器知道更多的上下文信息,從而減少創(chuàng )建和銷(xiāo)毀小對象(智能指針)的負擔。STL庫也必須優(yōu)化。例如,在STL端口中,pod類(lèi)型被視為特例。不幸的是,智能指針不是pod,這使得編譯器足夠智能,可以在執行序列中合并引用的加減,這太困難了(考慮到多線(xiàn)程因素,除非編譯器知道線(xiàn)程信息,否則幾乎不可能實(shí)現)
在實(shí)現面向對象編程方面,C++比C更方便。其中之一是,當描述一個(gè)對象是另一個(gè)對象的一部分時(shí),可以通過(guò)構造和析構函數機制自動(dòng)維護相關(guān)部分的生命周期。但它在語(yǔ)言中未能解決的是,當兩者之間只有一個(gè)參照關(guān)系時(shí),如何處理生命周期。對于前者,我們幾乎只有簡(jiǎn)潔明了的解決方案;后者可以根據實(shí)際需要有多種選擇,而C++在語(yǔ)言級別上沒(méi)有提供一致的解決方案。不幸的是,C++始終能夠提供一個(gè)簡(jiǎn)潔且易于使用的通用GC庫。我們都喜歡比較容易實(shí)現的參考計數方案。這一結果與具體實(shí)現的復雜性有關(guān)。畢竟,在實(shí)現GC時(shí),C缺乏必要的語(yǔ)言支持(C++是在實(shí)現級別從C開(kāi)發(fā)的)
讓我們看看垃圾采集。更成熟的算法基于標記移除(或標記排序)或其變體。簡(jiǎn)而言之,采集器框架記錄對象之間的關(guān)系(存儲這些聯(lián)系信息的位置并不重要。它可以位于對象的內存布局空間中,也可以位于獨立的位置。關(guān)鍵是采集器可以訪(fǎng)問(wèn)這些信息)。確定世界的根,定期從此根遍歷世界,標記關(guān)聯(lián)的對象,最后回收未標記的對象
從算法的角度來(lái)看,建立對象之間連接的時(shí)間開(kāi)銷(xiāo)和參考計數的時(shí)間開(kāi)銷(xiāo)在數量級上是相同的,兩者都是o(1))。然而,在實(shí)際實(shí)施中,前者的成本通常較高??臻g成本也略高,但在數量級上沒(méi)有差別
銷(xiāo)毀GC管理的對象的成本要低得多。它不需要通知與其關(guān)聯(lián)的對象
這就是為什么許多使用GC的軟件有時(shí)比使用引用計數的軟件更高效的原因
然而,GC在標記過(guò)程中需要額外的時(shí)間成本。完成一個(gè)完整的清潔過(guò)程必須穿越世界上每一個(gè)有生命的物體。成本為O(n),n隨著(zhù)對象總數的增加而增加。因此,我們應該減少GC管理的對象數量。在這方面,手工管理仍然是有意義的。也就是說(shuō),當一個(gè)對象顯然是另一個(gè)對象的一部分時(shí),可以考慮手動(dòng)管理
另一個(gè)缺點(diǎn)是,在實(shí)現時(shí),我們經(jīng)常將對象之間的關(guān)聯(lián)信息放在對象本身的內存布局空間中。在這個(gè)世界上遍歷對象意味著(zhù)訪(fǎng)問(wèn)所有對象的內存。當虛擬內存空間大于實(shí)際物理內存空間時(shí),表示頁(yè)面交換。我認為,在很大程度上,Java或c#等語(yǔ)言是一起使用的。構建的龐大系統有時(shí)運行緩慢,這是根本原因。當然,這些是可以改進(jìn)的。這不是算法本身的問(wèn)題
可以說(shuō),GC(垃圾采集)將RC(引用計數)中短期對象的銷(xiāo)毀成本轉移到一次性標記移除過(guò)程中。這是邏輯處理和資源管理的正交分解。隨著(zhù)硬件的進(jìn)步(如多核開(kāi)發(fā)),這種分解問(wèn)題將更容易提高性能,但是,這種優(yōu)勢在小型軟件或獨立模塊中并不明顯。相反,GC本身的復雜性遠遠高于RC,這將成為它的弱點(diǎn)
對于不需要面向對象軟件,甚至不需要自動(dòng)資源管理的軟件,GC或RC是無(wú)用的
我做的簡(jiǎn)單垃圾采集器只是想在為C或C++語(yǔ)言構建軟件時(shí)做一些簡(jiǎn)單的嘗試并做出更多的選擇
從本質(zhì)上講,引用計數策略和垃圾采集策略都屬于資源的自動(dòng)管理。所謂自動(dòng)管理是指邏輯層不知道資源何時(shí)釋放,而是依賴(lài)底層庫來(lái)維護資源的生命周期
在C++中,析構函數指定用于刪除的資源,編譯器生成的代碼自動(dòng)構造基類(lèi)和成員變量
因此,為C++編寫(xiě)垃圾采集器與手動(dòng)資源管理沒(méi)有沖突。自動(dòng)化管理在一個(gè)系統中使用 查看全部
文章采集調用(引用計數策略和垃圾收集策略都屬于資源的自動(dòng)化管理)
源鏈接:
從本質(zhì)上講,引用計數策略和垃圾采集策略都屬于資源的自動(dòng)管理。所謂的自動(dòng)管理是指邏輯層不知道資源何時(shí)釋放,而是依靠底層庫來(lái)維持資源的生命周期
手動(dòng)管理可以準確地了解資源的生命周期,并在準確的位置回收資源。在C++中,析構函數指定用于刪除的資源,編譯器生成的代碼自動(dòng)析構函數基類(lèi)和成員變量
因此,為C++編寫(xiě)垃圾采集器與手動(dòng)管理資源并不沖突。幾乎所有大型C++項目都使用自動(dòng)化管理,但它使用引用計數策略,而不是垃圾采集。也就是說(shuō),長(cháng)期以來(lái),我們采用C++或C語(yǔ)言,將人工管理和自動(dòng)管理相結合來(lái)構建系統。無(wú)論是使用引用計數還是垃圾采集,我們仍然可以在軟件實(shí)現的細節中管理手動(dòng)管理
為什么使用自動(dòng)資源生命周期管理
讓我們看一下面向對象。如果一切都是一個(gè)物體,那么每個(gè)物體都應該對自己的生命負責。我們可以直接準確地確定死亡時(shí)間。不幸的是,很多東西都不是純對象。最重要的是對象容器。除了它們自己的屬性外,它們還維護對一組類(lèi)似對象的引用
一個(gè)對象可以被多個(gè)容器引用,這使得容器不同于貓和狗的對象實(shí)體。因為容器指的是一個(gè)事物,它并不意味著(zhù)它是容器的一部分(有時(shí)可以,有時(shí)不能)。當我們想把整個(gè)世界分成物體,所有原子都分成各個(gè)層次的物體時(shí),我們會(huì )發(fā)現,物體無(wú)法提取的概念總數為零。引用而不是擁有是不可避免的
面向對象的本質(zhì)是從許多對象中提取共性,并將它們一起處理。這樣,各種容器的使用是不可避免的
同樣,該對象不知道他是否可以宣布死亡。除非您知道自己與其他對象的關(guān)系(此關(guān)系不是對象)。資源可以是對象,而自動(dòng)管理就是管理這些對象和對象之間的關(guān)系
引用計數是最容易實(shí)現的解決方案:記錄對象被引用的次數,而不具體記錄引用對象的人。這樣,建立和取消引用的成本就降低了。然而,也有得失。在引用計數的過(guò)程中,我們也丟失了重要的信息:誰(shuí)引用了我們自己。因此,在處理間接引用時(shí),引用計數的成本更高
物體死亡的判斷是物體是否與世界有直接或間接的聯(lián)系。因此,即使一個(gè)對象被另一個(gè)對象直接引用,該對象也可能不存在。為了解決這個(gè)問(wèn)題,使用引用計數的系統必須在與世界斷開(kāi)連接時(shí)通知與其關(guān)聯(lián)的對象。目標銷(xiāo)毀成本的增加是參考計數策略的短板
物體的破壞頻率取決于物體的平均壽命。一方面,對象的生存時(shí)間受對象粒度的影響。對象粒度越細,對象的平均生存時(shí)間越短(雖然表面上沒(méi)有直接聯(lián)系,但在實(shí)際設計中往往會(huì )導致這種結果);另一方面,我們通常將容器和引用關(guān)系實(shí)現為一個(gè)對象(概念上,它不應該是一個(gè)對象)。例如,許多自動(dòng)維護引用計數的智能指針是一個(gè)小容器,其中收錄對對象的唯一引用,并且它是作為一個(gè)小對象實(shí)現的
通常,對象本身的性質(zhì)不會(huì )隨其在內存空間中的位置而改變。但是,引用關(guān)系(通常用指針實(shí)現)與內存地址有關(guān)。C++缺少用于在內存中移動(dòng)對象的語(yǔ)義表達式。等效的方法是在一個(gè)新的內存塊中復制和構造一個(gè)新對象,并銷(xiāo)毀原創(chuàng )對象
另一方面,在程序的運行序列中,由函數調用引起的堆棧上的嵌套作用域也可以視為容器。機器指令通過(guò)這些作用域,臨時(shí)構造的對象引用(智能指針)被放置在這些作用域中。函數調用越頻繁,創(chuàng )建和銷(xiāo)毀這些作用域的頻率就越高
因此,C++必須依賴(lài)大量的內聯(lián)函數來(lái)讓編譯器知道更多的上下文信息,從而減少創(chuàng )建和銷(xiāo)毀小對象(智能指針)的負擔。STL庫也必須優(yōu)化。例如,在STL端口中,pod類(lèi)型被視為特例。不幸的是,智能指針不是pod,這使得編譯器足夠智能,可以在執行序列中合并引用的加減,這太困難了(考慮到多線(xiàn)程因素,除非編譯器知道線(xiàn)程信息,否則幾乎不可能實(shí)現)
在實(shí)現面向對象編程方面,C++比C更方便。其中之一是,當描述一個(gè)對象是另一個(gè)對象的一部分時(shí),可以通過(guò)構造和析構函數機制自動(dòng)維護相關(guān)部分的生命周期。但它在語(yǔ)言中未能解決的是,當兩者之間只有一個(gè)參照關(guān)系時(shí),如何處理生命周期。對于前者,我們幾乎只有簡(jiǎn)潔明了的解決方案;后者可以根據實(shí)際需要有多種選擇,而C++在語(yǔ)言級別上沒(méi)有提供一致的解決方案。不幸的是,C++始終能夠提供一個(gè)簡(jiǎn)潔且易于使用的通用GC庫。我們都喜歡比較容易實(shí)現的參考計數方案。這一結果與具體實(shí)現的復雜性有關(guān)。畢竟,在實(shí)現GC時(shí),C缺乏必要的語(yǔ)言支持(C++是在實(shí)現級別從C開(kāi)發(fā)的)
讓我們看看垃圾采集。更成熟的算法基于標記移除(或標記排序)或其變體。簡(jiǎn)而言之,采集器框架記錄對象之間的關(guān)系(存儲這些聯(lián)系信息的位置并不重要。它可以位于對象的內存布局空間中,也可以位于獨立的位置。關(guān)鍵是采集器可以訪(fǎng)問(wèn)這些信息)。確定世界的根,定期從此根遍歷世界,標記關(guān)聯(lián)的對象,最后回收未標記的對象
從算法的角度來(lái)看,建立對象之間連接的時(shí)間開(kāi)銷(xiāo)和參考計數的時(shí)間開(kāi)銷(xiāo)在數量級上是相同的,兩者都是o(1))。然而,在實(shí)際實(shí)施中,前者的成本通常較高??臻g成本也略高,但在數量級上沒(méi)有差別
銷(xiāo)毀GC管理的對象的成本要低得多。它不需要通知與其關(guān)聯(lián)的對象
這就是為什么許多使用GC的軟件有時(shí)比使用引用計數的軟件更高效的原因
然而,GC在標記過(guò)程中需要額外的時(shí)間成本。完成一個(gè)完整的清潔過(guò)程必須穿越世界上每一個(gè)有生命的物體。成本為O(n),n隨著(zhù)對象總數的增加而增加。因此,我們應該減少GC管理的對象數量。在這方面,手工管理仍然是有意義的。也就是說(shuō),當一個(gè)對象顯然是另一個(gè)對象的一部分時(shí),可以考慮手動(dòng)管理
另一個(gè)缺點(diǎn)是,在實(shí)現時(shí),我們經(jīng)常將對象之間的關(guān)聯(lián)信息放在對象本身的內存布局空間中。在這個(gè)世界上遍歷對象意味著(zhù)訪(fǎng)問(wèn)所有對象的內存。當虛擬內存空間大于實(shí)際物理內存空間時(shí),表示頁(yè)面交換。我認為,在很大程度上,Java或c#等語(yǔ)言是一起使用的。構建的龐大系統有時(shí)運行緩慢,這是根本原因。當然,這些是可以改進(jìn)的。這不是算法本身的問(wèn)題
可以說(shuō),GC(垃圾采集)將RC(引用計數)中短期對象的銷(xiāo)毀成本轉移到一次性標記移除過(guò)程中。這是邏輯處理和資源管理的正交分解。隨著(zhù)硬件的進(jìn)步(如多核開(kāi)發(fā)),這種分解問(wèn)題將更容易提高性能,但是,這種優(yōu)勢在小型軟件或獨立模塊中并不明顯。相反,GC本身的復雜性遠遠高于RC,這將成為它的弱點(diǎn)
對于不需要面向對象軟件,甚至不需要自動(dòng)資源管理的軟件,GC或RC是無(wú)用的
我做的簡(jiǎn)單垃圾采集器只是想在為C或C++語(yǔ)言構建軟件時(shí)做一些簡(jiǎn)單的嘗試并做出更多的選擇
從本質(zhì)上講,引用計數策略和垃圾采集策略都屬于資源的自動(dòng)管理。所謂自動(dòng)管理是指邏輯層不知道資源何時(shí)釋放,而是依賴(lài)底層庫來(lái)維護資源的生命周期
在C++中,析構函數指定用于刪除的資源,編譯器生成的代碼自動(dòng)構造基類(lèi)和成員變量
因此,為C++編寫(xiě)垃圾采集器與手動(dòng)資源管理沒(méi)有沖突。自動(dòng)化管理在一個(gè)系統中使用
文章采集調用(Java?清潔工程師BrianGoetz探究了弱引用(weakreferences)問(wèn)題)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 148 次瀏覽 ? 2021-09-19 16:07
在Java理論與實(shí)踐的前一期文章中,Java? 清理工程師Brian Goetz探索弱引用,它允許您警告垃圾采集器您希望維護對對象的引用,而不阻止對象被垃圾采集。在本期文章中,他將解釋另一種形式的引用對象,軟引用,以幫助垃圾采集器管理內存使用并消除潛在的內存泄漏
垃圾采集可以防止Java程序內存泄漏,至少對于“內存泄漏”的狹義定義來(lái)說(shuō)是這樣,但這并不意味著(zhù)我們可以完全忽略Java程序中的對象生存期問(wèn)題。當我們沒(méi)有對對象生命周期給予足夠的關(guān)注或打破了管理對象生命周期的標準機制時(shí),Java程序中經(jīng)常會(huì )發(fā)生內存泄漏。例如,上次我們看到,在嘗試將元數據與臨時(shí)對象關(guān)聯(lián)時(shí),未能劃分對象的生命周期可能會(huì )導致意外的對象保留。還有其他類(lèi)似的情況會(huì )忽略或破壞對象生命周期管理,并導致內存泄漏
對象分離
清單1中的leakychecksum類(lèi)說(shuō)明了一種形式的內存泄漏,有時(shí)稱(chēng)為對象游蕩,其中使用getfilechecksum()方法計算文件內容的校驗和。getfilechecksum()方法將文件內容讀入緩沖區以計算校驗和。更直觀(guān)的實(shí)現只是在getfilechecksum()中將緩沖區作為局部變量分配,但是這個(gè)版本比那個(gè)版本更“智能”,而不是在實(shí)例字段中緩存緩沖區以減少內存流失。這種“優(yōu)化”通常不會(huì )帶來(lái)預期的效益;對象分配比許多人預期的要便宜。(還要注意,將緩沖區從局部變量提升到實(shí)例變量會(huì )使類(lèi)在沒(méi)有額外同步的情況下不再是線(xiàn)程安全的。直觀(guān)的實(shí)現不需要將getfilechecksum()聲明為已同步,并且在同時(shí)調用時(shí)將提供更好的可伸縮性。)
清單1.顯示了“對象分離”類(lèi)
//BADCODE-DONOTE公式
publicclassLeakyChecksum{
privatebyte[]字節數組
PublicSynchronizedEntGetFileChecksum(StringfileName){
intlen=getFileSize(文件名)
if(bytearray==null | | bytearray.Length)管理。后一個(gè)選項通常更好,因為它為垃圾采集器帶來(lái)更少的工作,并允許在特別需要內存時(shí)以更少的工作回收整個(gè)緩存。弱引用有時(shí)被錯誤地用于替換軟引用來(lái)構建緩存,但這將導致緩存性能差。實(shí)際上,弱引用會(huì )在圖像變弱后(通常在再次使用緩存對象之前)迅速清除它們嗎?因為小型垃圾采集經(jīng)常運行
對于性能?chē)乐匾蕾?lài)緩存的應用程序,軟引用是一種無(wú)用的手段。它確實(shí)無(wú)法取代復雜的緩存框架,該框架可以提供靈活的終止、復制和事務(wù)緩存。但是,作為一種“廉價(jià)且骯臟”的緩存機制,降低價(jià)格非常有吸引力
與弱引用一樣,還可以使用關(guān)聯(lián)的引用隊列創(chuàng )建軟引用,該隊列在垃圾回收器清除時(shí)進(jìn)入隊列。引用隊列對于軟引用沒(méi)有弱引用有用,但它們可以用于發(fā)出應用程序內存開(kāi)始耗盡的管理警報
垃圾采集器如何處理引用
弱引用和軟引用都擴展了抽象引用類(lèi)(幻影引用也是如此,稍后將在文章中描述)。引用對象由垃圾回收器以特殊方式處理。當垃圾回收器在跟蹤堆期間遇到引用對象時(shí),它不會(huì )標記或跟蹤引用對象,而是將引用放置在已知活動(dòng)引用對象的隊列上。在跟蹤之后,垃圾回收器會(huì )識別軟訪(fǎng)問(wèn)對象嗎?除軟引用外,這些對象上沒(méi)有強引用。垃圾回收器根據當前采集回收的內存總量和其他策略注意事項確定此時(shí)是否需要清除軟引用。如果要清除的軟引用具有相應的引用隊列,則y將進(jìn)入隊列。剩余的軟訪(fǎng)問(wèn)對象(未清除的對象)將被視為根集,堆跟蹤將繼續使用這些新根,以便可以標記通過(guò)活動(dòng)軟引用訪(fǎng)問(wèn)的對象
處理軟引用后,將標識弱可及對象的集合?此類(lèi)對象上沒(méi)有強引用或軟引用。這些對象將被清除并排隊。所有引用類(lèi)型在排隊之前都會(huì )被清除,因此將進(jìn)行事后處理。清除的線(xiàn)程將永遠無(wú)法訪(fǎng)問(wèn)引用對象,但t僅指向引用對象。因此,當引用與引用隊列一起使用時(shí),通常需要細分適當的引用類(lèi)型,并在設計中直接使用它(如weakhashmap,其map.entry擴展了WeakReference)或存儲對需要清除的實(shí)體的引用
參考處理的性能成本
引用對象會(huì )給垃圾采集過(guò)程帶來(lái)一些額外的成本。對于每個(gè)垃圾采集,必須構造一個(gè)活動(dòng)引用對象的列表,并且必須適當地處理每個(gè)引用,這會(huì )增加每個(gè)采集的每個(gè)引用的一些開(kāi)銷(xiāo),而不管此時(shí)是否采集引用引用對象本身接受垃圾采集,并且可以在引用對象之前進(jìn)行采集,在這種情況下,它們不會(huì )添加到隊列中
基于數組的集合
當使用數組實(shí)現堆?;颦h(huán)形緩沖區等數據結構時(shí),會(huì )出現另一種形式的對象分離在該方法中,在頂部指針遞減后,元素仍然保留對將彈出堆棧的對象的引用。這意味著(zhù)對該對象的引用仍然可以被程序訪(fǎng)問(wèn)(即使程序實(shí)際上不會(huì )使用該引用),它防止對象被垃圾采集,直到該位置被future push()重用為止
在基于數組的集合中列出3.對象
publicclassLeakyStack{
privateObject[]元素=新對象[MAX_元素]
privateintsize=0
publicvoidpush(Objecto){elements[size++]=o;}
publicObjectpop(){
如果(大小==0)
thrownewmptystackexception()
否則{
Objectresult=元素[--size]
//元素[大小+1]=空
返回結果
}
}
}
結論
與弱引用一樣,軟引用通過(guò)利用垃圾采集器在做出緩存采集決策時(shí)的幫助,有助于防止應用程序中的對象漂移。只有當應用程序能夠容忍大量軟引用對象時(shí),軟引用才適用
參考資料:
您可以在developerWorks全球網(wǎng)站上參考本文的英文原文
“Java理論與實(shí)踐:用弱引用阻止內存泄漏”:上一期《Java理論與實(shí)踐》介紹了類(lèi)似的軟引用
“關(guān)注性能:調優(yōu)垃圾回收”:kirkpepperdine和JackShirazi證明,即使是緩慢的內存泄漏最終也會(huì )給垃圾回收器帶來(lái)巨大壓力
引用對象和垃圾采集:本文由sun在引用對象添加到類(lèi)庫后不久撰寫(xiě),描述垃圾采集器如何處理引用對象
Java理論與實(shí)踐:Brian Goetz的完整系列
Java技術(shù)專(zhuān)區:數百篇關(guān)于Java編程文章各個(gè)方面的文章@
獲得產(chǎn)品和技術(shù)
Jtune:這個(gè)免費的Jtune工具利用GC日志,以圖形方式顯示堆大小、GC持續時(shí)間和其他有用的內存管理數據 查看全部
文章采集調用(Java?清潔工程師BrianGoetz探究了弱引用(weakreferences)問(wèn)題)
在Java理論與實(shí)踐的前一期文章中,Java? 清理工程師Brian Goetz探索弱引用,它允許您警告垃圾采集器您希望維護對對象的引用,而不阻止對象被垃圾采集。在本期文章中,他將解釋另一種形式的引用對象,軟引用,以幫助垃圾采集器管理內存使用并消除潛在的內存泄漏
垃圾采集可以防止Java程序內存泄漏,至少對于“內存泄漏”的狹義定義來(lái)說(shuō)是這樣,但這并不意味著(zhù)我們可以完全忽略Java程序中的對象生存期問(wèn)題。當我們沒(méi)有對對象生命周期給予足夠的關(guān)注或打破了管理對象生命周期的標準機制時(shí),Java程序中經(jīng)常會(huì )發(fā)生內存泄漏。例如,上次我們看到,在嘗試將元數據與臨時(shí)對象關(guān)聯(lián)時(shí),未能劃分對象的生命周期可能會(huì )導致意外的對象保留。還有其他類(lèi)似的情況會(huì )忽略或破壞對象生命周期管理,并導致內存泄漏
對象分離
清單1中的leakychecksum類(lèi)說(shuō)明了一種形式的內存泄漏,有時(shí)稱(chēng)為對象游蕩,其中使用getfilechecksum()方法計算文件內容的校驗和。getfilechecksum()方法將文件內容讀入緩沖區以計算校驗和。更直觀(guān)的實(shí)現只是在getfilechecksum()中將緩沖區作為局部變量分配,但是這個(gè)版本比那個(gè)版本更“智能”,而不是在實(shí)例字段中緩存緩沖區以減少內存流失。這種“優(yōu)化”通常不會(huì )帶來(lái)預期的效益;對象分配比許多人預期的要便宜。(還要注意,將緩沖區從局部變量提升到實(shí)例變量會(huì )使類(lèi)在沒(méi)有額外同步的情況下不再是線(xiàn)程安全的。直觀(guān)的實(shí)現不需要將getfilechecksum()聲明為已同步,并且在同時(shí)調用時(shí)將提供更好的可伸縮性。)
清單1.顯示了“對象分離”類(lèi)
//BADCODE-DONOTE公式
publicclassLeakyChecksum{
privatebyte[]字節數組
PublicSynchronizedEntGetFileChecksum(StringfileName){
intlen=getFileSize(文件名)
if(bytearray==null | | bytearray.Length)管理。后一個(gè)選項通常更好,因為它為垃圾采集器帶來(lái)更少的工作,并允許在特別需要內存時(shí)以更少的工作回收整個(gè)緩存。弱引用有時(shí)被錯誤地用于替換軟引用來(lái)構建緩存,但這將導致緩存性能差。實(shí)際上,弱引用會(huì )在圖像變弱后(通常在再次使用緩存對象之前)迅速清除它們嗎?因為小型垃圾采集經(jīng)常運行
對于性能?chē)乐匾蕾?lài)緩存的應用程序,軟引用是一種無(wú)用的手段。它確實(shí)無(wú)法取代復雜的緩存框架,該框架可以提供靈活的終止、復制和事務(wù)緩存。但是,作為一種“廉價(jià)且骯臟”的緩存機制,降低價(jià)格非常有吸引力
與弱引用一樣,還可以使用關(guān)聯(lián)的引用隊列創(chuàng )建軟引用,該隊列在垃圾回收器清除時(shí)進(jìn)入隊列。引用隊列對于軟引用沒(méi)有弱引用有用,但它們可以用于發(fā)出應用程序內存開(kāi)始耗盡的管理警報
垃圾采集器如何處理引用
弱引用和軟引用都擴展了抽象引用類(lèi)(幻影引用也是如此,稍后將在文章中描述)。引用對象由垃圾回收器以特殊方式處理。當垃圾回收器在跟蹤堆期間遇到引用對象時(shí),它不會(huì )標記或跟蹤引用對象,而是將引用放置在已知活動(dòng)引用對象的隊列上。在跟蹤之后,垃圾回收器會(huì )識別軟訪(fǎng)問(wèn)對象嗎?除軟引用外,這些對象上沒(méi)有強引用。垃圾回收器根據當前采集回收的內存總量和其他策略注意事項確定此時(shí)是否需要清除軟引用。如果要清除的軟引用具有相應的引用隊列,則y將進(jìn)入隊列。剩余的軟訪(fǎng)問(wèn)對象(未清除的對象)將被視為根集,堆跟蹤將繼續使用這些新根,以便可以標記通過(guò)活動(dòng)軟引用訪(fǎng)問(wèn)的對象
處理軟引用后,將標識弱可及對象的集合?此類(lèi)對象上沒(méi)有強引用或軟引用。這些對象將被清除并排隊。所有引用類(lèi)型在排隊之前都會(huì )被清除,因此將進(jìn)行事后處理。清除的線(xiàn)程將永遠無(wú)法訪(fǎng)問(wèn)引用對象,但t僅指向引用對象。因此,當引用與引用隊列一起使用時(shí),通常需要細分適當的引用類(lèi)型,并在設計中直接使用它(如weakhashmap,其map.entry擴展了WeakReference)或存儲對需要清除的實(shí)體的引用
參考處理的性能成本
引用對象會(huì )給垃圾采集過(guò)程帶來(lái)一些額外的成本。對于每個(gè)垃圾采集,必須構造一個(gè)活動(dòng)引用對象的列表,并且必須適當地處理每個(gè)引用,這會(huì )增加每個(gè)采集的每個(gè)引用的一些開(kāi)銷(xiāo),而不管此時(shí)是否采集引用引用對象本身接受垃圾采集,并且可以在引用對象之前進(jìn)行采集,在這種情況下,它們不會(huì )添加到隊列中
基于數組的集合
當使用數組實(shí)現堆?;颦h(huán)形緩沖區等數據結構時(shí),會(huì )出現另一種形式的對象分離在該方法中,在頂部指針遞減后,元素仍然保留對將彈出堆棧的對象的引用。這意味著(zhù)對該對象的引用仍然可以被程序訪(fǎng)問(wèn)(即使程序實(shí)際上不會(huì )使用該引用),它防止對象被垃圾采集,直到該位置被future push()重用為止
在基于數組的集合中列出3.對象
publicclassLeakyStack{
privateObject[]元素=新對象[MAX_元素]
privateintsize=0
publicvoidpush(Objecto){elements[size++]=o;}
publicObjectpop(){
如果(大小==0)
thrownewmptystackexception()
否則{
Objectresult=元素[--size]
//元素[大小+1]=空
返回結果
}
}
}
結論
與弱引用一樣,軟引用通過(guò)利用垃圾采集器在做出緩存采集決策時(shí)的幫助,有助于防止應用程序中的對象漂移。只有當應用程序能夠容忍大量軟引用對象時(shí),軟引用才適用
參考資料:
您可以在developerWorks全球網(wǎng)站上參考本文的英文原文
“Java理論與實(shí)踐:用弱引用阻止內存泄漏”:上一期《Java理論與實(shí)踐》介紹了類(lèi)似的軟引用
“關(guān)注性能:調優(yōu)垃圾回收”:kirkpepperdine和JackShirazi證明,即使是緩慢的內存泄漏最終也會(huì )給垃圾回收器帶來(lái)巨大壓力
引用對象和垃圾采集:本文由sun在引用對象添加到類(lèi)庫后不久撰寫(xiě),描述垃圾采集器如何處理引用對象
Java理論與實(shí)踐:Brian Goetz的完整系列
Java技術(shù)專(zhuān)區:數百篇關(guān)于Java編程文章各個(gè)方面的文章@
獲得產(chǎn)品和技術(shù)
Jtune:這個(gè)免費的Jtune工具利用GC日志,以圖形方式顯示堆大小、GC持續時(shí)間和其他有用的內存管理數據
文章采集調用(【干貨】強引用、軟引用和幻象引用有什么區別?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 202 次瀏覽 ? 2021-09-19 16:05
強參考、軟參考、弱參考和幻影參考之間有什么區別
1.definition
強引用是最常見(jiàn)的對象引用。只要有一個(gè)指向某個(gè)對象的強引用,它就可以指示該對象仍然是“活動(dòng)的”,并且垃圾采集器不會(huì )接觸該對象。對于普通對象,如果沒(méi)有其他引用關(guān)系,只要它超出引用的范圍或顯式地將相應的(強)引用分配給null,就可以對其進(jìn)行垃圾采集。當然,具體的回收時(shí)間取決于垃圾采集策略
特點(diǎn):在我們典型的代碼中,Obj=newobject()是一個(gè)很強的引用。與關(guān)鍵字new創(chuàng )建的對象關(guān)聯(lián)的引用是強引用。當JVM內存空間不足時(shí),JVM寧愿拋出OfMemoryError runtime error(OOM),使程序異常終止,也不愿通過(guò)任意回收具有強引用的“活動(dòng)”對象來(lái)解決內存不足的問(wèn)題。對于普通對象,如果沒(méi)有其他引用關(guān)系,只要它超出引用的范圍或顯式地將相應的(強)引用分配給null,就可以對其進(jìn)行垃圾采集。具體的回收時(shí)間取決于垃圾采集策略
軟引用是一種相對較強和較弱的引用,它可以使對象免于某些垃圾采集。只有當JVM認為內存不足時(shí),才會(huì )嘗試回收軟引用指向的對象。JVM確保在拋出outofmemoryerror之前清除軟引用指向的對象。軟引用通常用于實(shí)現內存敏感緩存。如果有空閑內存,可以臨時(shí)保留緩存,并在內存不足時(shí)進(jìn)行清理,以確保在使用緩存時(shí)不會(huì )耗盡內存
特點(diǎn):軟參考通過(guò)軟參考類(lèi)實(shí)現。軟參考文獻的生命周期短于強參考文獻。只有當JVM認為內存不足時(shí),才會(huì )嘗試回收軟引用指向的對象:也就是說(shuō),JVM將確保在拋出outofmemoryerror之前清除軟引用指向的對象。軟引用可以與引用隊列一起使用。如果軟引用引用的對象被垃圾采集器回收,Java虛擬機將把軟引用添加到關(guān)聯(lián)的引用隊列中。稍后,我們可以調用ReferenceQueue的poll()方法來(lái)檢查它所關(guān)心的對象是否被回收。如果隊列為空,則返回null;否則,該方法將返回隊列前面的引用對象
應用場(chǎng)景:軟引用通常用于實(shí)現對內存敏感的緩存。如果仍有可用內存,您可以暫時(shí)保留緩存,并在內存不足時(shí)將其清除,以確保緩存在使用時(shí)不會(huì )耗盡內存
弱引用不會(huì )免除對象的垃圾采集,但只提供了一種訪(fǎng)問(wèn)處于弱引用狀態(tài)的對象的方法。這可以用于構建沒(méi)有特定約束的關(guān)系。例如,維護非強制映射關(guān)系。如果試圖獲取對象時(shí)該對象仍然存在,請使用它,否則請重新實(shí)例化它。它也是許多緩存實(shí)現的一個(gè)選項
弱引用是通過(guò)WeakReference類(lèi)實(shí)現的。弱引用的生命周期比軟引用短。當垃圾采集器線(xiàn)程掃描其管轄下的內存區域時(shí),一旦找到弱引用的對象,它將回收其內存,無(wú)論當前內存空間是否足夠。由于垃圾采集器是一個(gè)低優(yōu)先級線(xiàn)程,因此不需要快速回收弱引用對象。弱引用可以與引用隊列一起使用。如果弱引用引用的對象被垃圾采集,Java虛擬機將把弱引用添加到關(guān)聯(lián)的引用隊列中
應用場(chǎng)景:弱應用程序也可用于內存敏感緩存
幻影引用有時(shí)會(huì )轉換為虛擬引用,您無(wú)法通過(guò)虛擬引用訪(fǎng)問(wèn)對象?;糜耙弥惶峁┝艘环N機制來(lái)確保對象在最終確定后可以執行某些操作。例如,它通常用于執行所謂的事后清理機制(post-mortem cleaning mechanism)、在我的專(zhuān)欄文章中介紹的Java平臺的清理機制,還有一些使用幻影引用來(lái)監視對象的創(chuàng )建和銷(xiāo)毀
特點(diǎn):虛擬引用也稱(chēng)為phantomreference,通過(guò)phantomreference類(lèi)實(shí)現。無(wú)法通過(guò)虛擬引用訪(fǎng)問(wèn)對象的任何屬性或函數?;糜耙弥皇翘峁┝艘环N機制來(lái)確保對象在最終確定后執行某些操作。如果一個(gè)對象只收錄虛擬引用,垃圾采集器可以隨時(shí)將其回收,就像它沒(méi)有引用一樣。虛擬引用必須與ReferenceQueue結合使用。當垃圾采集器準備回收對象時(shí),如果它發(fā)現它仍然有一個(gè)虛擬引用,它將在回收對象的內存之前將虛擬引用添加到關(guān)聯(lián)的引用隊列中
ReferenceQueue=newreferencequeue()
PhantomReference pr=新的PhantomReference(對象、隊列)
通過(guò)判斷虛擬引用是否已添加到引用隊列,程序可以知道引用對象是否將被垃圾采集。如果程序發(fā)現已將虛擬引用添加到引用隊列中,它可以在回收引用對象的內存之前執行一些程序操作
應用場(chǎng)景:它可以用來(lái)跟蹤垃圾采集器回收的對象的活動(dòng)。當垃圾采集器回收與虛擬引用關(guān)聯(lián)的對象時(shí),它將收到系統通知
2.對象可訪(fǎng)問(wèn)性分析
3.Reference
所有引用類(lèi)型都是抽象類(lèi)java.lang.ref.reference的子類(lèi)。您可能會(huì )注意到,它提供了一個(gè)get()方法:
除了幻影引用(因為get總是返回null),如果對象沒(méi)有被銷(xiāo)毀,那么可以通過(guò)get方法獲得原創(chuàng )對象。這意味著(zhù)使用軟引用和弱引用,我們可以將被訪(fǎng)問(wèn)對象重新指向強引用,即人為地改變對象的可訪(fǎng)問(wèn)性狀態(tài)!這就是為什么我在上圖中的一些地方畫(huà)了雙向箭頭
因此,對于軟引用和弱引用,垃圾采集器可能存在二次確認問(wèn)題,以確保處于弱引用狀態(tài)的對象不會(huì )更改為強引用
但是你認為這里可能有什么問(wèn)題嗎
是的,如果我們錯誤地維護強引用(例如,分配給靜態(tài)變量),對象可能沒(méi)有機會(huì )更改回類(lèi)似于弱引用的可訪(fǎng)問(wèn)性狀態(tài),從而導致內存泄漏。因此,檢查弱引用指向對象是否被垃圾采集也是診斷是否存在特定內存泄漏的一種方法。如果我們的框架使用弱引用并懷疑存在內存泄漏,我們可以從這個(gè)角度進(jìn)行檢查
4.ReferenceQueue
當我們創(chuàng )建各種引用并將它們與相應的對象關(guān)聯(lián)時(shí),我們可以選擇是否關(guān)聯(lián)引用隊列。JVM將在特定時(shí)間引用隊列。我們可以從隊列中獲取相關(guān)后續邏輯的引用(remove方法實(shí)際上意味著(zhù)在這里獲取它)。特別是對于phantom引用,get方法只返回null。如果未指定引用隊列,則它基本上沒(méi)有意義。請看下面的示例代碼。使用引用隊列,我們可以在對象處于相應狀態(tài)時(shí)執行后處理邏輯(對于phantom reference,它已完成并處于phantom Reach狀態(tài))
Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference p = new PhantomReference(counter, refQueue);
counter = null;
System.gc();
try {
// Remove是一個(gè)阻塞方法,可以指定timeout,或者選擇一直阻塞
Reference ref = refQueue.remove(1000L);
if (ref != null) {
// do something
}
} catch (InterruptedException e) {
// Handle it
}
5.顯式影響軟引用垃圾采集
軟引用通常在最后一次引用之后保留一段時(shí)間。默認值是基于剩余堆空間(以M字節為單位)計算的。來(lái)自Java1.3.1首先,提供了-XX:softreflrupolicymspermb參數。我們可以在毫秒內設置它。例如,以下示例設置為3秒(3000毫秒)
-XX:SoftRefLRUPolicyMSPerMB=3000
事實(shí)上,剩余空間將受到不同JVM模式的影響。對于客戶(hù)端模式,如通常的windows 32位JDK,剩余空間用于計算當前堆中的可用大小,因此更傾向于循環(huán)使用;對于服務(wù)器模式JVM,它是根據-Xmx指定的最大值計算的
本質(zhì)上,這種行為仍然是一個(gè)黑盒,具體取決于JVM實(shí)現。即使上述參數在新版本的JDK上也可能無(wú)效。此外,客戶(hù)端模式下的JDK已逐漸退出歷史舞臺。因此,當我們應用時(shí),我們可以參考類(lèi)似的設置,但不要太依賴(lài)它
6.diagnose JVM引用
如果您懷疑應用程序存在由引用(或finalize)引起的回收問(wèn)題,那么有許多工具或選項可供選擇。例如,hotspot JVM本身提供了一個(gè)清晰的選項(printreferencegc)來(lái)獲取相關(guān)信息
注意:JDK 9廣泛地重構JVM和垃圾采集日志。Printgctimestamps和printreferencegc不再存在。我將在本專(zhuān)欄后面的垃圾采集主題中更系統地解釋它們
7.Reachability籬笆
可以達到強參考的效果 查看全部
文章采集調用(【干貨】強引用、軟引用和幻象引用有什么區別?)
強參考、軟參考、弱參考和幻影參考之間有什么區別
1.definition
強引用是最常見(jiàn)的對象引用。只要有一個(gè)指向某個(gè)對象的強引用,它就可以指示該對象仍然是“活動(dòng)的”,并且垃圾采集器不會(huì )接觸該對象。對于普通對象,如果沒(méi)有其他引用關(guān)系,只要它超出引用的范圍或顯式地將相應的(強)引用分配給null,就可以對其進(jìn)行垃圾采集。當然,具體的回收時(shí)間取決于垃圾采集策略
特點(diǎn):在我們典型的代碼中,Obj=newobject()是一個(gè)很強的引用。與關(guān)鍵字new創(chuàng )建的對象關(guān)聯(lián)的引用是強引用。當JVM內存空間不足時(shí),JVM寧愿拋出OfMemoryError runtime error(OOM),使程序異常終止,也不愿通過(guò)任意回收具有強引用的“活動(dòng)”對象來(lái)解決內存不足的問(wèn)題。對于普通對象,如果沒(méi)有其他引用關(guān)系,只要它超出引用的范圍或顯式地將相應的(強)引用分配給null,就可以對其進(jìn)行垃圾采集。具體的回收時(shí)間取決于垃圾采集策略
軟引用是一種相對較強和較弱的引用,它可以使對象免于某些垃圾采集。只有當JVM認為內存不足時(shí),才會(huì )嘗試回收軟引用指向的對象。JVM確保在拋出outofmemoryerror之前清除軟引用指向的對象。軟引用通常用于實(shí)現內存敏感緩存。如果有空閑內存,可以臨時(shí)保留緩存,并在內存不足時(shí)進(jìn)行清理,以確保在使用緩存時(shí)不會(huì )耗盡內存
特點(diǎn):軟參考通過(guò)軟參考類(lèi)實(shí)現。軟參考文獻的生命周期短于強參考文獻。只有當JVM認為內存不足時(shí),才會(huì )嘗試回收軟引用指向的對象:也就是說(shuō),JVM將確保在拋出outofmemoryerror之前清除軟引用指向的對象。軟引用可以與引用隊列一起使用。如果軟引用引用的對象被垃圾采集器回收,Java虛擬機將把軟引用添加到關(guān)聯(lián)的引用隊列中。稍后,我們可以調用ReferenceQueue的poll()方法來(lái)檢查它所關(guān)心的對象是否被回收。如果隊列為空,則返回null;否則,該方法將返回隊列前面的引用對象
應用場(chǎng)景:軟引用通常用于實(shí)現對內存敏感的緩存。如果仍有可用內存,您可以暫時(shí)保留緩存,并在內存不足時(shí)將其清除,以確保緩存在使用時(shí)不會(huì )耗盡內存
弱引用不會(huì )免除對象的垃圾采集,但只提供了一種訪(fǎng)問(wèn)處于弱引用狀態(tài)的對象的方法。這可以用于構建沒(méi)有特定約束的關(guān)系。例如,維護非強制映射關(guān)系。如果試圖獲取對象時(shí)該對象仍然存在,請使用它,否則請重新實(shí)例化它。它也是許多緩存實(shí)現的一個(gè)選項
弱引用是通過(guò)WeakReference類(lèi)實(shí)現的。弱引用的生命周期比軟引用短。當垃圾采集器線(xiàn)程掃描其管轄下的內存區域時(shí),一旦找到弱引用的對象,它將回收其內存,無(wú)論當前內存空間是否足夠。由于垃圾采集器是一個(gè)低優(yōu)先級線(xiàn)程,因此不需要快速回收弱引用對象。弱引用可以與引用隊列一起使用。如果弱引用引用的對象被垃圾采集,Java虛擬機將把弱引用添加到關(guān)聯(lián)的引用隊列中
應用場(chǎng)景:弱應用程序也可用于內存敏感緩存
幻影引用有時(shí)會(huì )轉換為虛擬引用,您無(wú)法通過(guò)虛擬引用訪(fǎng)問(wèn)對象?;糜耙弥惶峁┝艘环N機制來(lái)確保對象在最終確定后可以執行某些操作。例如,它通常用于執行所謂的事后清理機制(post-mortem cleaning mechanism)、在我的專(zhuān)欄文章中介紹的Java平臺的清理機制,還有一些使用幻影引用來(lái)監視對象的創(chuàng )建和銷(xiāo)毀
特點(diǎn):虛擬引用也稱(chēng)為phantomreference,通過(guò)phantomreference類(lèi)實(shí)現。無(wú)法通過(guò)虛擬引用訪(fǎng)問(wèn)對象的任何屬性或函數?;糜耙弥皇翘峁┝艘环N機制來(lái)確保對象在最終確定后執行某些操作。如果一個(gè)對象只收錄虛擬引用,垃圾采集器可以隨時(shí)將其回收,就像它沒(méi)有引用一樣。虛擬引用必須與ReferenceQueue結合使用。當垃圾采集器準備回收對象時(shí),如果它發(fā)現它仍然有一個(gè)虛擬引用,它將在回收對象的內存之前將虛擬引用添加到關(guān)聯(lián)的引用隊列中
ReferenceQueue=newreferencequeue()
PhantomReference pr=新的PhantomReference(對象、隊列)
通過(guò)判斷虛擬引用是否已添加到引用隊列,程序可以知道引用對象是否將被垃圾采集。如果程序發(fā)現已將虛擬引用添加到引用隊列中,它可以在回收引用對象的內存之前執行一些程序操作
應用場(chǎng)景:它可以用來(lái)跟蹤垃圾采集器回收的對象的活動(dòng)。當垃圾采集器回收與虛擬引用關(guān)聯(lián)的對象時(shí),它將收到系統通知
2.對象可訪(fǎng)問(wèn)性分析

3.Reference



所有引用類(lèi)型都是抽象類(lèi)java.lang.ref.reference的子類(lèi)。您可能會(huì )注意到,它提供了一個(gè)get()方法:
除了幻影引用(因為get總是返回null),如果對象沒(méi)有被銷(xiāo)毀,那么可以通過(guò)get方法獲得原創(chuàng )對象。這意味著(zhù)使用軟引用和弱引用,我們可以將被訪(fǎng)問(wèn)對象重新指向強引用,即人為地改變對象的可訪(fǎng)問(wèn)性狀態(tài)!這就是為什么我在上圖中的一些地方畫(huà)了雙向箭頭
因此,對于軟引用和弱引用,垃圾采集器可能存在二次確認問(wèn)題,以確保處于弱引用狀態(tài)的對象不會(huì )更改為強引用
但是你認為這里可能有什么問(wèn)題嗎
是的,如果我們錯誤地維護強引用(例如,分配給靜態(tài)變量),對象可能沒(méi)有機會(huì )更改回類(lèi)似于弱引用的可訪(fǎng)問(wèn)性狀態(tài),從而導致內存泄漏。因此,檢查弱引用指向對象是否被垃圾采集也是診斷是否存在特定內存泄漏的一種方法。如果我們的框架使用弱引用并懷疑存在內存泄漏,我們可以從這個(gè)角度進(jìn)行檢查
4.ReferenceQueue
當我們創(chuàng )建各種引用并將它們與相應的對象關(guān)聯(lián)時(shí),我們可以選擇是否關(guān)聯(lián)引用隊列。JVM將在特定時(shí)間引用隊列。我們可以從隊列中獲取相關(guān)后續邏輯的引用(remove方法實(shí)際上意味著(zhù)在這里獲取它)。特別是對于phantom引用,get方法只返回null。如果未指定引用隊列,則它基本上沒(méi)有意義。請看下面的示例代碼。使用引用隊列,我們可以在對象處于相應狀態(tài)時(shí)執行后處理邏輯(對于phantom reference,它已完成并處于phantom Reach狀態(tài))
Object counter = new Object();
ReferenceQueue refQueue = new ReferenceQueue();
PhantomReference p = new PhantomReference(counter, refQueue);
counter = null;
System.gc();
try {
// Remove是一個(gè)阻塞方法,可以指定timeout,或者選擇一直阻塞
Reference ref = refQueue.remove(1000L);
if (ref != null) {
// do something
}
} catch (InterruptedException e) {
// Handle it
}
5.顯式影響軟引用垃圾采集
軟引用通常在最后一次引用之后保留一段時(shí)間。默認值是基于剩余堆空間(以M字節為單位)計算的。來(lái)自Java1.3.1首先,提供了-XX:softreflrupolicymspermb參數。我們可以在毫秒內設置它。例如,以下示例設置為3秒(3000毫秒)
-XX:SoftRefLRUPolicyMSPerMB=3000
事實(shí)上,剩余空間將受到不同JVM模式的影響。對于客戶(hù)端模式,如通常的windows 32位JDK,剩余空間用于計算當前堆中的可用大小,因此更傾向于循環(huán)使用;對于服務(wù)器模式JVM,它是根據-Xmx指定的最大值計算的
本質(zhì)上,這種行為仍然是一個(gè)黑盒,具體取決于JVM實(shí)現。即使上述參數在新版本的JDK上也可能無(wú)效。此外,客戶(hù)端模式下的JDK已逐漸退出歷史舞臺。因此,當我們應用時(shí),我們可以參考類(lèi)似的設置,但不要太依賴(lài)它
6.diagnose JVM引用
如果您懷疑應用程序存在由引用(或finalize)引起的回收問(wèn)題,那么有許多工具或選項可供選擇。例如,hotspot JVM本身提供了一個(gè)清晰的選項(printreferencegc)來(lái)獲取相關(guān)信息
注意:JDK 9廣泛地重構JVM和垃圾采集日志。Printgctimestamps和printreferencegc不再存在。我將在本專(zhuān)欄后面的垃圾采集主題中更系統地解釋它們
7.Reachability籬笆
可以達到強參考的效果
文章采集調用(文章采集調用mysql的話(huà),你可以不使用瀏覽器)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 156 次瀏覽 ? 2021-09-19 07:03
文章采集調用mysql的話(huà),你可以不使用瀏覽器或者其他采集軟件,可以直接用mysqlscript采集,給大家整理了一下資料,
一、安裝mysql+cython環(huán)境在安裝之前,我們要配置好mysql。
二、通過(guò)mysql調用cython的api非常簡(jiǎn)單直接,參照官方文檔,即可實(shí)現。
#建立表createtable`abc`(`id`int(1
1)notnullauto_increment,`username`varchar(3
0)notnulldefaultnull,`password`varchar(3
0)notnulldefaultnull,`page`int(1
1)notnulldefaultnull);
三、mysql的參數配置a:數據庫名b:binpath通常設置為:/tmp/mysql/bin這樣我們的cython就能訪(fǎng)問(wèn)到mysql了.你還可以在更多的配置方式上進(jìn)行探索。mysql數據庫的配置例如,我們可以進(jìn)一步配置數據庫id在這個(gè)例子中代表的是id到username到page的這個(gè)列--c:/opt/cython/local/bin/mysql-c:/opt/cython/local/bin/mysql---d:c:/opt/cython/local/bin/mysql-e:。 查看全部
文章采集調用(文章采集調用mysql的話(huà),你可以不使用瀏覽器)
文章采集調用mysql的話(huà),你可以不使用瀏覽器或者其他采集軟件,可以直接用mysqlscript采集,給大家整理了一下資料,
一、安裝mysql+cython環(huán)境在安裝之前,我們要配置好mysql。
二、通過(guò)mysql調用cython的api非常簡(jiǎn)單直接,參照官方文檔,即可實(shí)現。
#建立表createtable`abc`(`id`int(1
1)notnullauto_increment,`username`varchar(3
0)notnulldefaultnull,`password`varchar(3
0)notnulldefaultnull,`page`int(1
1)notnulldefaultnull);
三、mysql的參數配置a:數據庫名b:binpath通常設置為:/tmp/mysql/bin這樣我們的cython就能訪(fǎng)問(wèn)到mysql了.你還可以在更多的配置方式上進(jìn)行探索。mysql數據庫的配置例如,我們可以進(jìn)一步配置數據庫id在這個(gè)例子中代表的是id到username到page的這個(gè)列--c:/opt/cython/local/bin/mysql-c:/opt/cython/local/bin/mysql---d:c:/opt/cython/local/bin/mysql-e:。
文章采集調用(換個(gè)網(wǎng)站你什么都做不了,這個(gè)教程是最詳盡的教程)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 133 次瀏覽 ? 2021-09-17 07:05
·我看到很多網(wǎng)友對織夢(mèng)(Dedecms)采集教程感到頭疼。事實(shí)上,官方教程太籠統了,什么也沒(méi)說(shuō)。你不能在網(wǎng)站做任何事情。本教程是最詳細的教程。你一眼就能學(xué)會(huì )
首先,打開(kāi)織夢(mèng)background并單擊采集-采集節點(diǎn)管理-添加新節點(diǎn)
這里我們以采集普通文章為例。我們選擇普通文章然后確認
我們進(jìn)入了采集的設置頁(yè)面,并填寫(xiě)了節點(diǎn)名稱(chēng),即為新節點(diǎn)命名。你可以在這里填寫(xiě)任何名字
然后打開(kāi)所需采集的文章列表頁(yè)面。在這里,我們以織夢(mèng)官方網(wǎng)站為例打開(kāi)此頁(yè)面。右鍵單擊以查看源文件
在字符集之后查找目標頁(yè)代碼
頁(yè)面和其他頁(yè)面的基本信息通常并不重要。填寫(xiě)后,請參見(jiàn)圖
現在,讓我們填寫(xiě)URL獲取規則列表
請看文章列表第一頁(yè)上的地址
比較第二頁(yè)上的地址
我們發(fā)現它們除了49外,后面的數字是不同的,其他的都是一樣的,所以我們可以這樣寫(xiě)
?。?).html
只需將1替換為(*),因為這里只有2頁(yè),所以讓我們填寫(xiě)從1到2的增量。當然是1。2-1... 等于1
我們到此為止
可能您的一些采集列表沒(méi)有規則,因此您必須手動(dòng)指定列表URL,如圖所示
每行寫(xiě)一頁(yè)地址
當列表規則完成后,我們開(kāi)始編寫(xiě)文章URL匹配規則并返回文章list頁(yè)面
右鍵單擊以查看源文件,并在區域的開(kāi)頭找到HTML,這是搜索文章列表開(kāi)頭的符號
我們可以很容易地在圖中找到“新聞列表”。從這里開(kāi)始,列表上的是文章
讓我們在列表的末尾找到文章HTML
就是這樣,一個(gè)很容易找到的標志
如果鏈接收錄圖片:
不要將采集處理為縮略圖。根據您的需要選擇
重新篩選區域網(wǎng)址:
?。ㄊ褂谜齽t表達式)
必須包括:(優(yōu)先于后者)
不能收錄:
打開(kāi)源文件時(shí),您可以清楚地看到文章鏈接以結尾。HTML
因此,我們必須填寫(xiě)。收錄后的HTML。如果有些清單很麻煩,我們也可以填寫(xiě)那些不能包括在內的清單
我們點(diǎn)擊保存設置進(jìn)入下一步,我們可以看到我們獲得的文章網(wǎng)站
看到這一點(diǎn)是對的。我們保存信息并進(jìn)入下一步設置內容字段獲取規則
讓我們看看文章是否有分頁(yè),然后隨機輸入一個(gè)文章。。我們看到這里有文章沒(méi)有分頁(yè)
所以這里我們默認
現在讓我們來(lái)查找文章標題等等。只需輸入一篇文章文章并右鍵單擊即可查看源文件
看看這些
根據源代碼填寫(xiě)
讓我們填寫(xiě)文章開(kāi)頭和結尾
如上所述,找到開(kāi)始和結束標志
開(kāi)始:
完:
如果要在文章中過(guò)濾任何內容,請將其寫(xiě)入過(guò)濾規則,例如在文章中過(guò)濾圖片@
選擇常用規則
再次檢查img
然后決定
通過(guò)這種方式,我們過(guò)濾文本中的圖片
設置完成后,單擊“保存設置并預覽”
這樣一個(gè)采集規則是編寫(xiě)的。這很簡(jiǎn)單。有些網(wǎng)站很難寫(xiě),但我們需要更加努力
我們點(diǎn)擊保存并開(kāi)始采集-start采集網(wǎng)頁(yè),采集將在一段時(shí)間內完成
讓我們看看我們采集k7得到了什么@
這似乎是一次成功。讓我們導出數據
首先,選擇要導入的列,然后按“請選擇”在彈出窗口中選擇要導入的列發(fā)布選項。除非您不想立即發(fā)布,否則它通常是默認值。默認情況下,每批導入有30個(gè)條目。它是否被修改并不重要。附加選項通常為“排除重復標題”。至于自動(dòng)生成HTML的選項,建議不要先生成它,因為我們必須批量提取摘要和關(guān)鍵字 查看全部
文章采集調用(換個(gè)網(wǎng)站你什么都做不了,這個(gè)教程是最詳盡的教程)
·我看到很多網(wǎng)友對織夢(mèng)(Dedecms)采集教程感到頭疼。事實(shí)上,官方教程太籠統了,什么也沒(méi)說(shuō)。你不能在網(wǎng)站做任何事情。本教程是最詳細的教程。你一眼就能學(xué)會(huì )
首先,打開(kāi)織夢(mèng)background并單擊采集-采集節點(diǎn)管理-添加新節點(diǎn)
這里我們以采集普通文章為例。我們選擇普通文章然后確認
我們進(jìn)入了采集的設置頁(yè)面,并填寫(xiě)了節點(diǎn)名稱(chēng),即為新節點(diǎn)命名。你可以在這里填寫(xiě)任何名字
然后打開(kāi)所需采集的文章列表頁(yè)面。在這里,我們以織夢(mèng)官方網(wǎng)站為例打開(kāi)此頁(yè)面。右鍵單擊以查看源文件
在字符集之后查找目標頁(yè)代碼
頁(yè)面和其他頁(yè)面的基本信息通常并不重要。填寫(xiě)后,請參見(jiàn)圖
現在,讓我們填寫(xiě)URL獲取規則列表
請看文章列表第一頁(yè)上的地址
比較第二頁(yè)上的地址
我們發(fā)現它們除了49外,后面的數字是不同的,其他的都是一樣的,所以我們可以這樣寫(xiě)
?。?).html
只需將1替換為(*),因為這里只有2頁(yè),所以讓我們填寫(xiě)從1到2的增量。當然是1。2-1... 等于1
我們到此為止
可能您的一些采集列表沒(méi)有規則,因此您必須手動(dòng)指定列表URL,如圖所示
每行寫(xiě)一頁(yè)地址
當列表規則完成后,我們開(kāi)始編寫(xiě)文章URL匹配規則并返回文章list頁(yè)面
右鍵單擊以查看源文件,并在區域的開(kāi)頭找到HTML,這是搜索文章列表開(kāi)頭的符號
我們可以很容易地在圖中找到“新聞列表”。從這里開(kāi)始,列表上的是文章
讓我們在列表的末尾找到文章HTML
就是這樣,一個(gè)很容易找到的標志
如果鏈接收錄圖片:
不要將采集處理為縮略圖。根據您的需要選擇
重新篩選區域網(wǎng)址:
?。ㄊ褂谜齽t表達式)
必須包括:(優(yōu)先于后者)
不能收錄:
打開(kāi)源文件時(shí),您可以清楚地看到文章鏈接以結尾。HTML
因此,我們必須填寫(xiě)。收錄后的HTML。如果有些清單很麻煩,我們也可以填寫(xiě)那些不能包括在內的清單
我們點(diǎn)擊保存設置進(jìn)入下一步,我們可以看到我們獲得的文章網(wǎng)站
看到這一點(diǎn)是對的。我們保存信息并進(jìn)入下一步設置內容字段獲取規則
讓我們看看文章是否有分頁(yè),然后隨機輸入一個(gè)文章。。我們看到這里有文章沒(méi)有分頁(yè)
所以這里我們默認
現在讓我們來(lái)查找文章標題等等。只需輸入一篇文章文章并右鍵單擊即可查看源文件
看看這些
根據源代碼填寫(xiě)
讓我們填寫(xiě)文章開(kāi)頭和結尾
如上所述,找到開(kāi)始和結束標志
開(kāi)始:
完:
如果要在文章中過(guò)濾任何內容,請將其寫(xiě)入過(guò)濾規則,例如在文章中過(guò)濾圖片@
選擇常用規則
再次檢查img
然后決定
通過(guò)這種方式,我們過(guò)濾文本中的圖片
設置完成后,單擊“保存設置并預覽”
這樣一個(gè)采集規則是編寫(xiě)的。這很簡(jiǎn)單。有些網(wǎng)站很難寫(xiě),但我們需要更加努力
我們點(diǎn)擊保存并開(kāi)始采集-start采集網(wǎng)頁(yè),采集將在一段時(shí)間內完成
讓我們看看我們采集k7得到了什么@
這似乎是一次成功。讓我們導出數據
首先,選擇要導入的列,然后按“請選擇”在彈出窗口中選擇要導入的列發(fā)布選項。除非您不想立即發(fā)布,否則它通常是默認值。默認情況下,每批導入有30個(gè)條目。它是否被修改并不重要。附加選項通常為“排除重復標題”。至于自動(dòng)生成HTML的選項,建議不要先生成它,因為我們必須批量提取摘要和關(guān)鍵字
文章采集調用(靈動(dòng)標簽調用多表多模型(圖)模型調用文章(組圖))
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 176 次瀏覽 ? 2021-09-15 20:05
靈動(dòng)標簽調用多表多模型調用文章
1、調用多模型的最新文章
[e:loop={'select * from (
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_movie where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_news where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_photo where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_flash where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_article where newstime) a order by newstime desc limit 10',10,24,1}]
[/e:loop]
帝國CMS多表調用最新信息,該演示代碼為默認數據表下全站最新10條圖片信息,自己根據需求可以附加條件,實(shí)現全站點(diǎn)擊,全站頭條,全站推薦等等.
---------------------------------------------------------------------------------
2、調用多模型的最新文章
[e:loop={'
select title,titleurl,titlepic from [!db.pre!]ecms_photo Union All
select title,titleurl,titlepic from [!db.pre!]ecms_download Union All
select title,titleurl,titlepic from [!db.pre!]ecms_news',0,24,0}]
[/e:loop]
注釋?zhuān)阂陨险{用的是(圖片模型:photo、下載模型:download、新聞模型:news)三個(gè)模型的文章
三個(gè)模型用“Union All”連接調用
若指定欄目用:where classid in(46,47,51),
若調用推薦在其后追加:and isgood=1,
若指定調用條數在其后追加:limit 10 查看全部
文章采集調用(靈動(dòng)標簽調用多表多模型(圖)模型調用文章(組圖))
靈動(dòng)標簽調用多表多模型調用文章
1、調用多模型的最新文章
[e:loop={'select * from (
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_movie where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_news where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_photo where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_flash where newstime union
select id,classid,titleurl,filename,title,newstime,titlepic from phome_ecms_article where newstime) a order by newstime desc limit 10',10,24,1}]
[/e:loop]
帝國CMS多表調用最新信息,該演示代碼為默認數據表下全站最新10條圖片信息,自己根據需求可以附加條件,實(shí)現全站點(diǎn)擊,全站頭條,全站推薦等等.
---------------------------------------------------------------------------------
2、調用多模型的最新文章
[e:loop={'
select title,titleurl,titlepic from [!db.pre!]ecms_photo Union All
select title,titleurl,titlepic from [!db.pre!]ecms_download Union All
select title,titleurl,titlepic from [!db.pre!]ecms_news',0,24,0}]
[/e:loop]
注釋?zhuān)阂陨险{用的是(圖片模型:photo、下載模型:download、新聞模型:news)三個(gè)模型的文章
三個(gè)模型用“Union All”連接調用
若指定欄目用:where classid in(46,47,51),
若調用推薦在其后追加:and isgood=1,
若指定調用條數在其后追加:limit 10
文章采集調用(Excel教程Excel函數代碼如下()的詳細內容)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 154 次瀏覽 ? 2021-09-15 20:04
核心功能代碼如下:
以上代碼可以獲取指定網(wǎng)頁(yè)的內容。如果一切都得到了,那就容易多了
代碼如下:
'ASP獲取遠程網(wǎng)頁(yè)指定內容開(kāi)始
Dim wstr,str,url,start,over,dtime
url="http://sc.jb51.net/"
wstr=getHTTPPage(url)
body=wstr
如果要在本地保存代碼
Dim wstr,str,url,start,over,dtime
url="https://www.jb51.net/"
wstr=getHTTPPage(url)
filename="index.htm"
if wstr"" and request("action")="makeindex" then
body=wstr
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set fout = fso.CreateTextFile(server.mappath(""&filename&""))
fout.Write body
fout.close
set fout=nothing
set fso=nothing
If Err.number=0 then
response.write("首頁(yè)生成成功??!")
end if
end if
可以根據需要修改特定信息
以上是ASP獲取遠程網(wǎng)頁(yè)指定內容的實(shí)現代碼的詳細內容。有關(guān)獲取遠程網(wǎng)頁(yè)內容的更多信息,請注意其他相關(guān)文章 查看全部
文章采集調用(Excel教程Excel函數代碼如下()的詳細內容)
核心功能代碼如下:
以上代碼可以獲取指定網(wǎng)頁(yè)的內容。如果一切都得到了,那就容易多了
代碼如下:
'ASP獲取遠程網(wǎng)頁(yè)指定內容開(kāi)始
Dim wstr,str,url,start,over,dtime
url="http://sc.jb51.net/"
wstr=getHTTPPage(url)
body=wstr
如果要在本地保存代碼
Dim wstr,str,url,start,over,dtime
url="https://www.jb51.net/"
wstr=getHTTPPage(url)
filename="index.htm"
if wstr"" and request("action")="makeindex" then
body=wstr
Set fso = Server.CreateObject("Scripting.FileSystemObject")
Set fout = fso.CreateTextFile(server.mappath(""&filename&""))
fout.Write body
fout.close
set fout=nothing
set fso=nothing
If Err.number=0 then
response.write("首頁(yè)生成成功??!")
end if
end if
可以根據需要修改特定信息
以上是ASP獲取遠程網(wǎng)頁(yè)指定內容的實(shí)現代碼的詳細內容。有關(guān)獲取遠程網(wǎng)頁(yè)內容的更多信息,請注意其他相關(guān)文章
文章采集調用(孤狼微信公眾號文章采集主要功能特色介紹! )
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 221 次瀏覽 ? 2021-09-13 22:13
)
獨狼數據采集平臺為微信公眾號文章提供采集,可以輕松發(fā)布到市面上主流系統,也可以定制一些冷門(mén)的網(wǎng)站接口!
一、孤狼微信公眾號文章采集主要功能
1.根據公眾號名稱(chēng)或ID指定公眾號采集,支持輸入多個(gè)公眾號,公眾號數量不限
2.多種圖片下載存儲方式(遠程調用、本地化圖片、ftp上傳),解決公眾號文章圖片防盜鏈問(wèn)題
3、強大的數據存儲功能(采集到達的數據保存在本地數據庫文件中)
4、簡(jiǎn)單配置即可輕松發(fā)布到主流網(wǎng)站或api接口
二、微信公號文章采集主要步驟
1、創(chuàng )建“添加公眾號”任務(wù)
登錄軟件,打開(kāi)左上角“自定義公眾號”,鼠標右鍵添加公眾號框,點(diǎn)擊獲取軟件自動(dòng)獲取公眾號信息,然后添加到組。
2、填寫(xiě)采集的官方賬號名或ID
填寫(xiě)基本信息如下圖:
填寫(xiě)任務(wù)名稱(chēng)和采集微信公眾號的名稱(chēng)或ID。提示:可以查看文章前后圖片的自動(dòng)過(guò)濾
使用廣告圖片功能刪除廣告(功能必須提前勾選)
使用官方賬號標簽
3、設置圖片下載(可選)
由于微信公眾號文章圖片已經(jīng)做了防盜鏈處理,采集收到的原創(chuàng )圖片無(wú)法正常顯示。如果需要圖片,需要配置圖片下載:
您可以選擇“上傳設置(通過(guò)ftp返回您的服務(wù)器)”或直接遠程調用。
4、Begin采集
圖片配置好后,可以點(diǎn)擊左上角的“采集”,采集data:
5、采集后期數據處理與發(fā)布
啟動(dòng)采集后,數據永遠是采集,文章可以預覽,顯示圖形內容,可以添加到“任務(wù)列表”頁(yè)面查看:勾選文章,選擇加入發(fā)布任務(wù)
可以分配到一個(gè)類(lèi)別或列;
在任務(wù)列表中,您可以發(fā)布:
最后選擇發(fā)布到自己的系統。如果軟件上現成的界面與你的網(wǎng)站界面匹配,直接填寫(xiě)網(wǎng)址、后臺網(wǎng)址、賬號密碼等,點(diǎn)擊登錄成功。
查看全部
文章采集調用(孤狼微信公眾號文章采集主要功能特色介紹!
)
獨狼數據采集平臺為微信公眾號文章提供采集,可以輕松發(fā)布到市面上主流系統,也可以定制一些冷門(mén)的網(wǎng)站接口!
一、孤狼微信公眾號文章采集主要功能
1.根據公眾號名稱(chēng)或ID指定公眾號采集,支持輸入多個(gè)公眾號,公眾號數量不限
2.多種圖片下載存儲方式(遠程調用、本地化圖片、ftp上傳),解決公眾號文章圖片防盜鏈問(wèn)題
3、強大的數據存儲功能(采集到達的數據保存在本地數據庫文件中)
4、簡(jiǎn)單配置即可輕松發(fā)布到主流網(wǎng)站或api接口
二、微信公號文章采集主要步驟
1、創(chuàng )建“添加公眾號”任務(wù)
登錄軟件,打開(kāi)左上角“自定義公眾號”,鼠標右鍵添加公眾號框,點(diǎn)擊獲取軟件自動(dòng)獲取公眾號信息,然后添加到組。

2、填寫(xiě)采集的官方賬號名或ID
填寫(xiě)基本信息如下圖:

填寫(xiě)任務(wù)名稱(chēng)和采集微信公眾號的名稱(chēng)或ID。提示:可以查看文章前后圖片的自動(dòng)過(guò)濾
使用廣告圖片功能刪除廣告(功能必須提前勾選)
使用官方賬號標簽
3、設置圖片下載(可選)
由于微信公眾號文章圖片已經(jīng)做了防盜鏈處理,采集收到的原創(chuàng )圖片無(wú)法正常顯示。如果需要圖片,需要配置圖片下載:

您可以選擇“上傳設置(通過(guò)ftp返回您的服務(wù)器)”或直接遠程調用。
4、Begin采集
圖片配置好后,可以點(diǎn)擊左上角的“采集”,采集data:

5、采集后期數據處理與發(fā)布
啟動(dòng)采集后,數據永遠是采集,文章可以預覽,顯示圖形內容,可以添加到“任務(wù)列表”頁(yè)面查看:勾選文章,選擇加入發(fā)布任務(wù)

可以分配到一個(gè)類(lèi)別或列;

在任務(wù)列表中,您可以發(fā)布:

最后選擇發(fā)布到自己的系統。如果軟件上現成的界面與你的網(wǎng)站界面匹配,直接填寫(xiě)網(wǎng)址、后臺網(wǎng)址、賬號密碼等,點(diǎn)擊登錄成功。
文章采集調用(高考志愿填報:文章采集調用的是去重特征嗎?)
采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 151 次瀏覽 ? 2021-09-12 18:08
文章采集調用的是去重特征,機器一類(lèi)特征應該可以,不過(guò)要找到一個(gè)好的去重算法,能夠應對類(lèi)數目,并且快速處理相似性排序。樣本屬性太多,帶來(lái)的問(wèn)題就是復雜度增加。
可以通過(guò)其他feature。比如通過(guò)一些docautographer。
那是應該是有去重功能,但由于海量數據,你的加法求平均肯定是不行,特征選擇也不行。應該嘗試一下樸素貝葉斯等非線(xiàn)性決策模型,甚至嘗試集成方法,比如kaggle的bagging,均衡分布。
直接用關(guān)鍵詞不是挺好嗎?多個(gè)詞相似有兩種可能:1)關(guān)鍵詞相似,但是有差異,比如:“好看”和“好看”,“好看”有100個(gè)詞語(yǔ),而“好看”只有20個(gè)。2)關(guān)鍵詞相似,但是一個(gè)完全一樣,另一個(gè)只是簡(jiǎn)單的借用詞語(yǔ),不是原作者內容或觀(guān)點(diǎn)。比如:“萬(wàn)科”和“萬(wàn)科”,“中科院”和“中科院”。還有一個(gè)可能,就是其他人所說(shuō)的去重,這個(gè)就需要用到數據預處理,去除重復詞,其實(shí)訓練也挺簡(jiǎn)單,你給定一個(gè)集合x(chóng),給定一個(gè)預測維度y,實(shí)驗一下就知道。還有一個(gè)問(wèn)題是為什么不用任何特征,直接求平均,都有人告訴我是為了多層感知機之類(lèi)的去重。
感覺(jué)取詞來(lái)做特征不夠合理。如果取第一個(gè)詞key做特征,再取詞進(jìn)行分類(lèi),那么首先是單詞特征沒(méi)有,其次就是預測結果太低,達不到結合詞匯多少加權的要求。一般取整數詞長(cháng)特征,比如5cm。以“好看”做例子。取key5作為特征。5cm*00=50001。
去重之后0000000=5。分類(lèi)損失是0.5。所以首先權重換算可以不用我說(shuō)的這么麻煩,直接求平均就可以了。其次應該是詞典大小的關(guān)系,詞典越大,權重越高。建議語(yǔ)料庫要盡可能大,詞匯特征向量最好3m以上。具體可以基于文本分類(lèi)的,比如共享詞典什么的。 查看全部
文章采集調用(高考志愿填報:文章采集調用的是去重特征嗎?)
文章采集調用的是去重特征,機器一類(lèi)特征應該可以,不過(guò)要找到一個(gè)好的去重算法,能夠應對類(lèi)數目,并且快速處理相似性排序。樣本屬性太多,帶來(lái)的問(wèn)題就是復雜度增加。
可以通過(guò)其他feature。比如通過(guò)一些docautographer。
那是應該是有去重功能,但由于海量數據,你的加法求平均肯定是不行,特征選擇也不行。應該嘗試一下樸素貝葉斯等非線(xiàn)性決策模型,甚至嘗試集成方法,比如kaggle的bagging,均衡分布。
直接用關(guān)鍵詞不是挺好嗎?多個(gè)詞相似有兩種可能:1)關(guān)鍵詞相似,但是有差異,比如:“好看”和“好看”,“好看”有100個(gè)詞語(yǔ),而“好看”只有20個(gè)。2)關(guān)鍵詞相似,但是一個(gè)完全一樣,另一個(gè)只是簡(jiǎn)單的借用詞語(yǔ),不是原作者內容或觀(guān)點(diǎn)。比如:“萬(wàn)科”和“萬(wàn)科”,“中科院”和“中科院”。還有一個(gè)可能,就是其他人所說(shuō)的去重,這個(gè)就需要用到數據預處理,去除重復詞,其實(shí)訓練也挺簡(jiǎn)單,你給定一個(gè)集合x(chóng),給定一個(gè)預測維度y,實(shí)驗一下就知道。還有一個(gè)問(wèn)題是為什么不用任何特征,直接求平均,都有人告訴我是為了多層感知機之類(lèi)的去重。
感覺(jué)取詞來(lái)做特征不夠合理。如果取第一個(gè)詞key做特征,再取詞進(jìn)行分類(lèi),那么首先是單詞特征沒(méi)有,其次就是預測結果太低,達不到結合詞匯多少加權的要求。一般取整數詞長(cháng)特征,比如5cm。以“好看”做例子。取key5作為特征。5cm*00=50001。
去重之后0000000=5。分類(lèi)損失是0.5。所以首先權重換算可以不用我說(shuō)的這么麻煩,直接求平均就可以了。其次應該是詞典大小的關(guān)系,詞典越大,權重越高。建議語(yǔ)料庫要盡可能大,詞匯特征向量最好3m以上。具體可以基于文本分類(lèi)的,比如共享詞典什么的。


