亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何獲取JS生成的JS和網(wǎng)頁(yè)內容和服務(wù)端?)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 54 次瀏覽 ? 2022-01-21 01:00 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何獲取JS生成的JS和網(wǎng)頁(yè)內容和服務(wù)端?)
  最近需要在一個(gè)網(wǎng)站中下載一批數據。但是輸入一個(gè)查詢(xún),返回30000到40000個(gè)結果,每次只能導出500個(gè),而且每次都要輸入下載項的范圍!就這樣點(diǎn)擊下載,我不要命了。所以我想自動(dòng)化這個(gè)過(guò)程。
  我的需求主要是兩點(diǎn):1.要求自動(dòng)化程度高。最好有一個(gè)成熟的界面,直接模擬瀏覽器的鼠標和鍵盤(pán)動(dòng)作,比如輸入文本框、選擇下拉列表、單選按鈕、復選框、點(diǎn)擊按鈕等。2.效率不高。因為我想要的數據量比較少。3. python下的框架。因為我通常主要使用python。
  對網(wǎng)站技術(shù)了解不多,對網(wǎng)站只有兩個(gè)經(jīng)驗:自己開(kāi)發(fā)了一個(gè)很簡(jiǎn)單的Android客戶(hù)端,用python的scrapy框架寫(xiě)了一個(gè)爬蟲(chóng)自動(dòng)爬取新聞. 所以了解客戶(hù)端和服務(wù)器的一些基本交互方法,了解如何分析網(wǎng)頁(yè)源代碼,了解xpath語(yǔ)法。
  當我第一次開(kāi)始解決這個(gè)問(wèn)題時(shí),我什至不知道要搜索什么。知乎的這個(gè)文章提供了很多有用的信息:“Python爬蟲(chóng)如何獲取JS生成的URL和網(wǎng)頁(yè)內容?” 隨之權衡了很多方法,最終選擇了Selenium。主要優(yōu)點(diǎn)是學(xué)習成本最小,代碼實(shí)現速度快。缺點(diǎn)是爬取效率低。如果您想成為富有成效的朋友,您將不得不花一些時(shí)間學(xué)習更復雜的工具包。
  網(wǎng)站技術(shù)
  如果要自動(dòng)爬取網(wǎng)頁(yè),需要了解一些基礎知識,這樣做會(huì )比較快。這里簡(jiǎn)單介紹一下相關(guān)知識。
  1. 請求/響應
  request 是客戶(hù)端向服務(wù)器發(fā)出的請求。輸入一個(gè) URL 對應一個(gè)請求動(dòng)作,這是最直觀(guān)的。爬取靜態(tài)網(wǎng)頁(yè)的內容,只需要知道網(wǎng)址即可。但是,當前的許多網(wǎng)頁(yè)都是動(dòng)態(tài)的。指向或點(diǎn)擊網(wǎng)頁(yè)中的某些元素也會(huì )觸發(fā)請求動(dòng)作,從而使網(wǎng)頁(yè)可以動(dòng)態(tài)更新部分內容,而這些內容不能直接從靜態(tài)網(wǎng)頁(yè)中獲取。這種技術(shù)叫做AJAX,但我對它了解不多。這里的問(wèn)題是我們可能甚至不知道 URL 是什么,所以我們需要一些可以處理動(dòng)態(tài)內容的高級接口。
  response 是服務(wù)器返回給客戶(hù)端的內容。如果要獲取靜態(tài)網(wǎng)頁(yè)內容,直接從請求中獲取即可。
  
  2. 分析網(wǎng)頁(yè)源碼
  如果我們想抓取網(wǎng)頁(yè)上的某一部分信息,我們需要知道如何定位它。這里需要 HTML 和 XPATH 知識。不知道的可以去w3school在線(xiàn)教程:
  查看網(wǎng)頁(yè)的源代碼,將鼠標指針指向網(wǎng)頁(yè)的任意位置,或指向目標元素。右鍵單擊并從下拉列表中選擇“檢查元素”。下面是我右鍵“百度”顯示的網(wǎng)頁(yè)源代碼,是HTML格式的,我們可以看到對應的HTML代碼。要提取它,我們可能需要 div//@[class="head_wrapper"]//input[@type="submit"] 的語(yǔ)句,它是 XPATH 語(yǔ)法,易于掌握。知道如何分析網(wǎng)頁(yè),我們更進(jìn)一步。
  
  3. 網(wǎng)頁(yè)基本元素操作
  前進(jìn)、后退、刷新、打開(kāi)新標簽、輸入網(wǎng)址等;
  文本框輸入、選擇下拉列表、單選按鈕、復選框、點(diǎn)擊按鈕等。
  我這里只需要模擬這么多操作,可以參考對應的selenium接口。
  4. Selenium 簡(jiǎn)介
  底線(xiàn):Selenium 是用于 Web 應用程序的自動(dòng)化測試工具集。
  很多話(huà):Selenium 誕生于 2004 年,當時(shí) ThoughtWorks 的 Jason Huggins 正在測試一個(gè)內部應用程序。作為一個(gè)聰明人,他意識到他的時(shí)間應該比手動(dòng)測試每個(gè)更改更有價(jià)值。他開(kāi)發(fā)了一個(gè)驅動(dòng)頁(yè)面交互的 Javascript 庫,允許多個(gè)瀏覽器自動(dòng)返回測試結果。該庫最終成為 Selenium 的核心,它是 Selenium RC(遠程控制)和 Selenium IDE 所有功能的基礎。
  實(shí)戰練習1.分析數據采集過(guò)程
  我的數據采集過(guò)程如下:
  在A(yíng)頁(yè)輸入查詢(xún)語(yǔ)句,點(diǎn)擊提交;瀏覽器自動(dòng)打開(kāi)新頁(yè)面,跳轉到新頁(yè)面B,在文本框中輸入下載項的范圍;單擊導出彈出一個(gè)彈出窗口,然后單擊下拉列表,單選按鈕,選取框進(jìn)行一些選擇,然后單擊下載。然后瀏覽器開(kāi)始下載文件。
  頁(yè)面 A
  
  B頁(yè)
  
  2. 爬取過(guò)程 A. 安裝 Selenium
  Selenium 支持多種瀏覽器,我選擇 google chrome。下載鏈接:。同時(shí),當然要在python中安裝selenium。從命令行輸入 pip install senenium 進(jìn)行安裝。
  B、配置環(huán)境變量
  這一步需要將chromedriver的保存路徑配置到操作系統的環(huán)境變量中,這樣selenium才能找到chromedriver。windows下配置環(huán)境變量PATH,linux或者mac可以選擇在.bash_rc中配置。配置方法很多,百度一下。
  我用的是mac,不知道為什么配置不行!后來(lái)發(fā)現只有在代碼中設置了才有效。
  C. 核心代碼(python)
  # 設置下載路徑,配置ChromeOptions的路徑。
  chromeoptions = webdriver.ChromeOptions()
  首選項 = {'profile.default_content_settings.popups':0,'download.default_directory': query_dir}
  chromeoptions.add_experimental_option('prefs', prefs)
  # 設置環(huán)境變量并啟動(dòng)瀏覽器。
  chromedriver = CHROMEDRIVER_DIR # 設置為你自己的路徑
  os.environ["webdriver.chrome.driver"] = chromedriver
  驅動(dòng)程序 = webdriver.Chrome(executable_path=chromedriver,chrome_options=chromeoptions)
  # 設置不可見(jiàn)等待時(shí)間,因為點(diǎn)擊網(wǎng)站后,可以返回一段時(shí)間的內容。如果不等待,就會(huì )報超時(shí)異常。
  driver.implicitly_wait(IMPLICIT_WAIT_TIME)
  # 請求頁(yè)面A
  司機.get("")
  # 在頁(yè)面A的兩個(gè)文本框中輸入并提交。
  
  driver.find_element_by_name('D').clear()
  driver.find_element_by_name('D').send_keys('mesz')
  driver.find_element_by_name('SEARCH').clear()
  driver.find_element_by_name('SEARCH').send_keys(str_search_query)
  driver.find_element_by_name('ovid').click()
  # 跳轉到新窗口并關(guān)注該窗口。
  current_window_handle = driver.current_window_handle
  for hdl in driver.window_handles: # selenium 總是有兩個(gè)句柄
  如果 hdl != current_window_handle:
  new_window_handle = hdl
  driver.switch_to.window(new_window_handle)
  driver.implicitly_wait(IMPLICIT_WAIT_TIME)
  # 獲取網(wǎng)頁(yè)。首先獲取返回的條目總數,然后提取文本框輸入下載條目的范圍,例如1-500。然后單擊導出。
  
  # 注意:等待頁(yè)面加載完畢再計算下載次數
  search_ret_num = WebDriverWait(驅動(dòng)程序, EXPLICIT_WAIT_TIME, EXPLICIT_WAIT_INTERVAL).until(EC.presence_of_element_located((By.XPATH,'//*[@id="searchaid-numbers"]')))
  search_ret_num =int(re.findall(r'\d+', search_ret_num.text.encode('utf-8'))[0])
  list_range = chunks_by_element(范圍(1, search_ret_num+1), DOWNLOAD_NUM_PER_TIME)
  對于 list_range 中的項目:
  download_range = driver.find_element_by_xpath('//*[@id="titles-display"]//input[@title="Range"]')
  下載范圍.clear()
  download_range.send_keys('{}-{}'.format(item[0], item[-1]))
  # 點(diǎn)擊導出
  export = driver.find_element_by_xpath('//*[@id="titles-display"]//input[@value="Export"]')
  導出.click()
  # 獲取彈出窗口。進(jìn)行一些設置。
  
  driver.switch_to.alert
  WebDriverWait(驅動(dòng)程序, EXPLICIT_WAIT_TIME, EXPLICIT_WAIT_INTERVAL).until(EC.presence_of_element_located((By.XPATH,'//div[@id="export-citation-popup"]')))
  # 設置下載文件的一些配置
  export_to_options = driver.find_element_by_xpath('//select[@id="export-citation-export-to-options"]')
  export_to_options.find_element_by_xpath('//option[@value="xml"]').click()# XML
  # 設置引文內容電臺
  citation_options = driver.find_element_by_xpath('//ul[@id="export-citation-options"]')
  citation_options.find_element_by_xpath('//input[@value="ALL"]').click()# 完整參考
  # 設置收錄復選框
  citation_include = driver.find_element_by_xpath('//div[@id="export-citation-include"]')
  ifcitation_include.find_element_by_xpath('//input[@name="externalResolverLink"]').is_selected():# 鏈接到外部解析器
  citation_include.find_element_by_xpath('//input[@name="externalResolverLink"]').click()
  ifcitation_include.find_element_by_xpath('//input[@name="jumpstartLink"]').is_selected():# 收錄網(wǎng)址
  citation_include.find_element_by_xpath('//input[@name="jumpstartLink"]').click()
  ifcitation_include.find_element_by_xpath('//input[@name="saveStrategy"]').is_selected():# 搜索歷史
  citation_include.find_element_by_xpath('//input[@name="saveStrategy"]').click()
  # 點(diǎn)擊下載。
  下載 = driver.find_element_by_xpath('//div[@class="export-citation-buttons"]')
  下載.click()
  最后:
  sleep(30)#等待最后一個(gè)文件下載完成
  # driver.implicitly_wait(30) # 不行!
  driver.quit()
  返回
  3. 提示
  A. 每次啟動(dòng)瀏覽器時(shí),桌面上都會(huì )彈出一個(gè)瀏覽器。您可以清楚地看到自動(dòng)化過(guò)程是怎樣的??磥?lái) selenium 真的為 Web 程序的自動(dòng)化測試做好了準備。另外,在爬取過(guò)程中要注意保持屏幕打開(kāi)。如果它進(jìn)入睡眠或屏幕保護程序,也會(huì )拋出異常。
  B、在模擬網(wǎng)頁(yè)操作時(shí),網(wǎng)頁(yè)跳轉是很常見(jiàn)的場(chǎng)景。所以要注意網(wǎng)頁(yè)響應時(shí)間。Selenium 在繼續執行代碼之前不會(huì )等待網(wǎng)頁(yè)響應完成,而是直接執行。兩者應該是不同的過(guò)程。這里可以選擇設置隱式等待和顯式等待。在其他操作中,隱式等待起決定性作用,在WebDriverWait中..顯式等待起主要作用,但需要注意的是,最長(cháng)等待時(shí)間取決于兩者中的較大者,如果隱式等待時(shí)間>顯式等待時(shí)間,代碼的最長(cháng)等待時(shí)間等于隱式等待時(shí)間。
  C. 設置下載路徑時(shí),一開(kāi)始沒(méi)有任何效果。懷疑是“download.default_directory”這個(gè)key寫(xiě)錯了,于是通過(guò)查看網(wǎng)頁(yè)源碼找到了key,還是一樣。問(wèn)題出在其他地方。不過(guò)提醒了我以后在代碼中使用字典進(jìn)行相關(guān)配置的時(shí)候,看源碼就能猜出來(lái)。
  
  D.我以為至少需要兩三天才能實(shí)現整個(gè)過(guò)程,因為我真的不明白。從頭到尾完成這項研究只需不到一天的時(shí)間。大概是因為入手之前找了很久,反復比較之后,才找到了最得心應手的工具。
  E. 整理完之后在github上搜了一圈,發(fā)現了一個(gè)神器。對于想要爬取大量?jì)热莸呐笥?,如果不想浪費時(shí)間過(guò)多學(xué)習web應用的底層知識,可以結合使用Selenium+scrapy。scrapy可以負責搜索網(wǎng)頁(yè),selenium負責處理每個(gè)網(wǎng)頁(yè)上的內容,尤其是動(dòng)態(tài)內容。下次如果我需要它,我打算使用這個(gè)想法!
  F. 分享一句話(huà)?!瓣P(guān)于爬蟲(chóng),獲取經(jīng)驗最快的方法是:學(xué)會(huì )寫(xiě)網(wǎng)站,你知道網(wǎng)站發(fā)送請求是什么,那么你就知道怎么爬網(wǎng)站了!” 很簡(jiǎn)單的。,但是這么簡(jiǎn)單的一句話(huà)卻給了我很大的啟發(fā)。之前太難了,一直卡在scrapy爬靜態(tài)網(wǎng)頁(yè)的水平。像 cookie 這樣的技術(shù)也曾被閱讀和遺忘過(guò)一次?,F在看來(lái)是因為網(wǎng)站的整體流程還沒(méi)有理清清楚。另一方面,我也害怕那些復雜的網(wǎng)站技術(shù)術(shù)語(yǔ)。其實(shí)只要在網(wǎng)上查查相關(guān)概念,就會(huì )慢慢打通。
  G. 最后,完全不懂編程的人可以使用一些可視化爬蟲(chóng)工具。這里有一些介紹: 。懂編程又想提高效率的人需要參考其他工具。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何獲取JS生成的JS和網(wǎng)頁(yè)內容和服務(wù)端?)
  最近需要在一個(gè)網(wǎng)站中下載一批數據。但是輸入一個(gè)查詢(xún),返回30000到40000個(gè)結果,每次只能導出500個(gè),而且每次都要輸入下載項的范圍!就這樣點(diǎn)擊下載,我不要命了。所以我想自動(dòng)化這個(gè)過(guò)程。
  我的需求主要是兩點(diǎn):1.要求自動(dòng)化程度高。最好有一個(gè)成熟的界面,直接模擬瀏覽器的鼠標和鍵盤(pán)動(dòng)作,比如輸入文本框、選擇下拉列表、單選按鈕、復選框、點(diǎn)擊按鈕等。2.效率不高。因為我想要的數據量比較少。3. python下的框架。因為我通常主要使用python。
  對網(wǎng)站技術(shù)了解不多,對網(wǎng)站只有兩個(gè)經(jīng)驗:自己開(kāi)發(fā)了一個(gè)很簡(jiǎn)單的Android客戶(hù)端,用python的scrapy框架寫(xiě)了一個(gè)爬蟲(chóng)自動(dòng)爬取新聞. 所以了解客戶(hù)端和服務(wù)器的一些基本交互方法,了解如何分析網(wǎng)頁(yè)源代碼,了解xpath語(yǔ)法。
  當我第一次開(kāi)始解決這個(gè)問(wèn)題時(shí),我什至不知道要搜索什么。知乎的這個(gè)文章提供了很多有用的信息:“Python爬蟲(chóng)如何獲取JS生成的URL和網(wǎng)頁(yè)內容?” 隨之權衡了很多方法,最終選擇了Selenium。主要優(yōu)點(diǎn)是學(xué)習成本最小,代碼實(shí)現速度快。缺點(diǎn)是爬取效率低。如果您想成為富有成效的朋友,您將不得不花一些時(shí)間學(xué)習更復雜的工具包。
  網(wǎng)站技術(shù)
  如果要自動(dòng)爬取網(wǎng)頁(yè),需要了解一些基礎知識,這樣做會(huì )比較快。這里簡(jiǎn)單介紹一下相關(guān)知識。
  1. 請求/響應
  request 是客戶(hù)端向服務(wù)器發(fā)出的請求。輸入一個(gè) URL 對應一個(gè)請求動(dòng)作,這是最直觀(guān)的。爬取靜態(tài)網(wǎng)頁(yè)的內容,只需要知道網(wǎng)址即可。但是,當前的許多網(wǎng)頁(yè)都是動(dòng)態(tài)的。指向或點(diǎn)擊網(wǎng)頁(yè)中的某些元素也會(huì )觸發(fā)請求動(dòng)作,從而使網(wǎng)頁(yè)可以動(dòng)態(tài)更新部分內容,而這些內容不能直接從靜態(tài)網(wǎng)頁(yè)中獲取。這種技術(shù)叫做AJAX,但我對它了解不多。這里的問(wèn)題是我們可能甚至不知道 URL 是什么,所以我們需要一些可以處理動(dòng)態(tài)內容的高級接口。
  response 是服務(wù)器返回給客戶(hù)端的內容。如果要獲取靜態(tài)網(wǎng)頁(yè)內容,直接從請求中獲取即可。
  
  2. 分析網(wǎng)頁(yè)源碼
  如果我們想抓取網(wǎng)頁(yè)上的某一部分信息,我們需要知道如何定位它。這里需要 HTML 和 XPATH 知識。不知道的可以去w3school在線(xiàn)教程:
  查看網(wǎng)頁(yè)的源代碼,將鼠標指針指向網(wǎng)頁(yè)的任意位置,或指向目標元素。右鍵單擊并從下拉列表中選擇“檢查元素”。下面是我右鍵“百度”顯示的網(wǎng)頁(yè)源代碼,是HTML格式的,我們可以看到對應的HTML代碼。要提取它,我們可能需要 div//@[class="head_wrapper"]//input[@type="submit"] 的語(yǔ)句,它是 XPATH 語(yǔ)法,易于掌握。知道如何分析網(wǎng)頁(yè),我們更進(jìn)一步。
  
  3. 網(wǎng)頁(yè)基本元素操作
  前進(jìn)、后退、刷新、打開(kāi)新標簽、輸入網(wǎng)址等;
  文本框輸入、選擇下拉列表、單選按鈕、復選框、點(diǎn)擊按鈕等。
  我這里只需要模擬這么多操作,可以參考對應的selenium接口。
  4. Selenium 簡(jiǎn)介
  底線(xiàn):Selenium 是用于 Web 應用程序的自動(dòng)化測試工具集。
  很多話(huà):Selenium 誕生于 2004 年,當時(shí) ThoughtWorks 的 Jason Huggins 正在測試一個(gè)內部應用程序。作為一個(gè)聰明人,他意識到他的時(shí)間應該比手動(dòng)測試每個(gè)更改更有價(jià)值。他開(kāi)發(fā)了一個(gè)驅動(dòng)頁(yè)面交互的 Javascript 庫,允許多個(gè)瀏覽器自動(dòng)返回測試結果。該庫最終成為 Selenium 的核心,它是 Selenium RC(遠程控制)和 Selenium IDE 所有功能的基礎。
  實(shí)戰練習1.分析數據采集過(guò)程
  我的數據采集過(guò)程如下:
  在A(yíng)頁(yè)輸入查詢(xún)語(yǔ)句,點(diǎn)擊提交;瀏覽器自動(dòng)打開(kāi)新頁(yè)面,跳轉到新頁(yè)面B,在文本框中輸入下載項的范圍;單擊導出彈出一個(gè)彈出窗口,然后單擊下拉列表,單選按鈕,選取框進(jìn)行一些選擇,然后單擊下載。然后瀏覽器開(kāi)始下載文件。
  頁(yè)面 A
  
  B頁(yè)
  
  2. 爬取過(guò)程 A. 安裝 Selenium
  Selenium 支持多種瀏覽器,我選擇 google chrome。下載鏈接:。同時(shí),當然要在python中安裝selenium。從命令行輸入 pip install senenium 進(jìn)行安裝。
  B、配置環(huán)境變量
  這一步需要將chromedriver的保存路徑配置到操作系統的環(huán)境變量中,這樣selenium才能找到chromedriver。windows下配置環(huán)境變量PATH,linux或者mac可以選擇在.bash_rc中配置。配置方法很多,百度一下。
  我用的是mac,不知道為什么配置不行!后來(lái)發(fā)現只有在代碼中設置了才有效。
  C. 核心代碼(python)
  # 設置下載路徑,配置ChromeOptions的路徑。
  chromeoptions = webdriver.ChromeOptions()
  首選項 = {'profile.default_content_settings.popups':0,'download.default_directory': query_dir}
  chromeoptions.add_experimental_option('prefs', prefs)
  # 設置環(huán)境變量并啟動(dòng)瀏覽器。
  chromedriver = CHROMEDRIVER_DIR # 設置為你自己的路徑
  os.environ["webdriver.chrome.driver"] = chromedriver
  驅動(dòng)程序 = webdriver.Chrome(executable_path=chromedriver,chrome_options=chromeoptions)
  # 設置不可見(jiàn)等待時(shí)間,因為點(diǎn)擊網(wǎng)站后,可以返回一段時(shí)間的內容。如果不等待,就會(huì )報超時(shí)異常。
  driver.implicitly_wait(IMPLICIT_WAIT_TIME)
  # 請求頁(yè)面A
  司機.get("")
  # 在頁(yè)面A的兩個(gè)文本框中輸入并提交。
  
  driver.find_element_by_name('D').clear()
  driver.find_element_by_name('D').send_keys('mesz')
  driver.find_element_by_name('SEARCH').clear()
  driver.find_element_by_name('SEARCH').send_keys(str_search_query)
  driver.find_element_by_name('ovid').click()
  # 跳轉到新窗口并關(guān)注該窗口。
  current_window_handle = driver.current_window_handle
  for hdl in driver.window_handles: # selenium 總是有兩個(gè)句柄
  如果 hdl != current_window_handle:
  new_window_handle = hdl
  driver.switch_to.window(new_window_handle)
  driver.implicitly_wait(IMPLICIT_WAIT_TIME)
  # 獲取網(wǎng)頁(yè)。首先獲取返回的條目總數,然后提取文本框輸入下載條目的范圍,例如1-500。然后單擊導出。
  
  # 注意:等待頁(yè)面加載完畢再計算下載次數
  search_ret_num = WebDriverWait(驅動(dòng)程序, EXPLICIT_WAIT_TIME, EXPLICIT_WAIT_INTERVAL).until(EC.presence_of_element_located((By.XPATH,'//*[@id="searchaid-numbers"]')))
  search_ret_num =int(re.findall(r'\d+', search_ret_num.text.encode('utf-8'))[0])
  list_range = chunks_by_element(范圍(1, search_ret_num+1), DOWNLOAD_NUM_PER_TIME)
  對于 list_range 中的項目:
  download_range = driver.find_element_by_xpath('//*[@id="titles-display"]//input[@title="Range"]')
  下載范圍.clear()
  download_range.send_keys('{}-{}'.format(item[0], item[-1]))
  # 點(diǎn)擊導出
  export = driver.find_element_by_xpath('//*[@id="titles-display"]//input[@value="Export"]')
  導出.click()
  # 獲取彈出窗口。進(jìn)行一些設置。
  
  driver.switch_to.alert
  WebDriverWait(驅動(dòng)程序, EXPLICIT_WAIT_TIME, EXPLICIT_WAIT_INTERVAL).until(EC.presence_of_element_located((By.XPATH,'//div[@id="export-citation-popup"]')))
  # 設置下載文件的一些配置
  export_to_options = driver.find_element_by_xpath('//select[@id="export-citation-export-to-options"]')
  export_to_options.find_element_by_xpath('//option[@value="xml"]').click()# XML
  # 設置引文內容電臺
  citation_options = driver.find_element_by_xpath('//ul[@id="export-citation-options"]')
  citation_options.find_element_by_xpath('//input[@value="ALL"]').click()# 完整參考
  # 設置收錄復選框
  citation_include = driver.find_element_by_xpath('//div[@id="export-citation-include"]')
  ifcitation_include.find_element_by_xpath('//input[@name="externalResolverLink"]').is_selected():# 鏈接到外部解析器
  citation_include.find_element_by_xpath('//input[@name="externalResolverLink"]').click()
  ifcitation_include.find_element_by_xpath('//input[@name="jumpstartLink"]').is_selected():# 收錄網(wǎng)址
  citation_include.find_element_by_xpath('//input[@name="jumpstartLink"]').click()
  ifcitation_include.find_element_by_xpath('//input[@name="saveStrategy"]').is_selected():# 搜索歷史
  citation_include.find_element_by_xpath('//input[@name="saveStrategy"]').click()
  # 點(diǎn)擊下載。
  下載 = driver.find_element_by_xpath('//div[@class="export-citation-buttons"]')
  下載.click()
  最后:
  sleep(30)#等待最后一個(gè)文件下載完成
  # driver.implicitly_wait(30) # 不行!
  driver.quit()
  返回
  3. 提示
  A. 每次啟動(dòng)瀏覽器時(shí),桌面上都會(huì )彈出一個(gè)瀏覽器。您可以清楚地看到自動(dòng)化過(guò)程是怎樣的??磥?lái) selenium 真的為 Web 程序的自動(dòng)化測試做好了準備。另外,在爬取過(guò)程中要注意保持屏幕打開(kāi)。如果它進(jìn)入睡眠或屏幕保護程序,也會(huì )拋出異常。
  B、在模擬網(wǎng)頁(yè)操作時(shí),網(wǎng)頁(yè)跳轉是很常見(jiàn)的場(chǎng)景。所以要注意網(wǎng)頁(yè)響應時(shí)間。Selenium 在繼續執行代碼之前不會(huì )等待網(wǎng)頁(yè)響應完成,而是直接執行。兩者應該是不同的過(guò)程。這里可以選擇設置隱式等待和顯式等待。在其他操作中,隱式等待起決定性作用,在WebDriverWait中..顯式等待起主要作用,但需要注意的是,最長(cháng)等待時(shí)間取決于兩者中的較大者,如果隱式等待時(shí)間>顯式等待時(shí)間,代碼的最長(cháng)等待時(shí)間等于隱式等待時(shí)間。
  C. 設置下載路徑時(shí),一開(kāi)始沒(méi)有任何效果。懷疑是“download.default_directory”這個(gè)key寫(xiě)錯了,于是通過(guò)查看網(wǎng)頁(yè)源碼找到了key,還是一樣。問(wèn)題出在其他地方。不過(guò)提醒了我以后在代碼中使用字典進(jìn)行相關(guān)配置的時(shí)候,看源碼就能猜出來(lái)。
  
  D.我以為至少需要兩三天才能實(shí)現整個(gè)過(guò)程,因為我真的不明白。從頭到尾完成這項研究只需不到一天的時(shí)間。大概是因為入手之前找了很久,反復比較之后,才找到了最得心應手的工具。
  E. 整理完之后在github上搜了一圈,發(fā)現了一個(gè)神器。對于想要爬取大量?jì)热莸呐笥?,如果不想浪費時(shí)間過(guò)多學(xué)習web應用的底層知識,可以結合使用Selenium+scrapy。scrapy可以負責搜索網(wǎng)頁(yè),selenium負責處理每個(gè)網(wǎng)頁(yè)上的內容,尤其是動(dòng)態(tài)內容。下次如果我需要它,我打算使用這個(gè)想法!
  F. 分享一句話(huà)?!瓣P(guān)于爬蟲(chóng),獲取經(jīng)驗最快的方法是:學(xué)會(huì )寫(xiě)網(wǎng)站,你知道網(wǎng)站發(fā)送請求是什么,那么你就知道怎么爬網(wǎng)站了!” 很簡(jiǎn)單的。,但是這么簡(jiǎn)單的一句話(huà)卻給了我很大的啟發(fā)。之前太難了,一直卡在scrapy爬靜態(tài)網(wǎng)頁(yè)的水平。像 cookie 這樣的技術(shù)也曾被閱讀和遺忘過(guò)一次?,F在看來(lái)是因為網(wǎng)站的整體流程還沒(méi)有理清清楚。另一方面,我也害怕那些復雜的網(wǎng)站技術(shù)術(shù)語(yǔ)。其實(shí)只要在網(wǎng)上查查相關(guān)概念,就會(huì )慢慢打通。
  G. 最后,完全不懂編程的人可以使用一些可視化爬蟲(chóng)工具。這里有一些介紹: 。懂編程又想提高效率的人需要參考其他工具。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解策略實(shí)戰作者(組圖)作者)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-01-20 15:18 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解策略實(shí)戰作者(組圖)作者)
  阿里云>云棲社區>主題圖>C>c爬蟲(chóng)源碼
  
  推薦活動(dòng):
  更多優(yōu)惠>
  當前話(huà)題:c網(wǎng)絡(luò )爬蟲(chóng)源碼加入采集
  相關(guān)話(huà)題:
  c網(wǎng)絡(luò )爬蟲(chóng)源碼相關(guān)博客看更多博文
  C# 網(wǎng)絡(luò )爬蟲(chóng)
  
  
  作者:Street Corner Box 712 查看評論:05 年前
  公司的編輯需要爬取網(wǎng)頁(yè)的內容,讓我幫我做一個(gè)簡(jiǎn)單的爬取工具。這是抓取網(wǎng)頁(yè)的內容??磥?lái)這對大家來(lái)說(shuō)并不難,不過(guò)這里有一些小的改動(dòng),代碼提供,請參考 1 private string GetHttpWebRequest(string url) 2 { 3 Ht
  閱讀全文
  C#HttpHelper爬蟲(chóng)源碼分享--蘇飛版
  
  
  作者:蘇飛2071 瀏覽評論:03年前
  簡(jiǎn)介 C#HttpHelper實(shí)現了C#HttpWebRequest爬取時(shí)忽略編碼、忽略證書(shū)、忽略cookie的功能,實(shí)現代理的功能。有了它,您可以發(fā)出 Get 和 Post 請求,并且可以輕松設置 cookie、證書(shū)、代理和編碼。你不用擔心這個(gè)問(wèn)題,因為類(lèi)會(huì )自動(dòng)為你識別頁(yè)面
  閱讀全文
  Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解攻略實(shí)戰
  
  
  作者:薇薇8128 瀏覽評論:04年前
  作者:薇薇,請注明出處。我們經(jīng)常會(huì )寫(xiě)一些網(wǎng)絡(luò )爬蟲(chóng),想必大家都會(huì )有一種感覺(jué),雖然寫(xiě)爬蟲(chóng)不難,但是反爬很難處理,因為大部分網(wǎng)站都有自己的反爬機制,所以我們將更加難以抓取這些數據。但是,對于每一種反爬機制,我們其實(shí)都會(huì )有相應的解決方案。作為一個(gè)爬蟲(chóng),我們,
  閱讀全文
  C#網(wǎng)絡(luò )爬蟲(chóng)--多線(xiàn)程增強版
  
  
  作者:街角盒飯 688 次瀏覽評論:05 年前
  上次給公司的一個(gè)女生做爬蟲(chóng),不是很精致。這次是用在公司的項目中,所以做了一些改動(dòng)。該函數添加了一個(gè)URL圖片采集,下載,線(xiàn)程處理接口URL圖片下載等。說(shuō)說(shuō)思路:總理在初始網(wǎng)站采集圖片去獲取初始網(wǎng)站的所有內容到初始網(wǎng)站 采集 鏈接并將 采集 的鏈接放入隊列以繼續 采集 圖片
  閱讀全文
  Python網(wǎng)絡(luò )爬蟲(chóng)抓取極品姐姐的視頻并保存到文件
  
  
  作者:keitwotest1060 瀏覽評論:04年前
  項目描述 用Python寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)爬取Best Sister的視頻并保存到文件中使用工具示例 Python2.7.X,pycharm如何使用創(chuàng )建視頻爬取Best Sister in pycharm .py 文件,并在當前目錄下創(chuàng )建video文件夾,用于存放采集到的視頻文件,編寫(xiě)代碼,運行
  閱讀全文
  一篇文章文章教你用Python網(wǎng)絡(luò )爬蟲(chóng)搞定差旅攻略
  
  
  作者:python進(jìn)階13人查看評論:01年前
  [一、項目背景] 趣游網(wǎng)提供原創(chuàng )實(shí)用的出境游指南、攻略、旅游社區和問(wèn)答平臺,以及智能旅游規劃解決方案,以及簽證、保險、機票、酒店在線(xiàn)預訂、租車(chē)等增值服務(wù)。僑游“鼓勵和幫助中國游客以自己的視角和方式體驗世界”。今天就教大家如何獲取僑友網(wǎng)的城市信息。
  閱讀全文
  Java版網(wǎng)絡(luò )爬蟲(chóng)基礎(轉)
  
  
  作者:developerguy851 瀏覽評論:06年前
  網(wǎng)絡(luò )爬蟲(chóng)不僅可以爬取網(wǎng)站網(wǎng)頁(yè)和圖片,甚至可以實(shí)現搶票、網(wǎng)上購買(mǎi)、機票查詢(xún)。這幾天看了一些基礎知識,記錄下來(lái)。網(wǎng)頁(yè)之間的關(guān)系可以看成一個(gè)大圖,圖的遍歷可以分為深度優(yōu)先和廣度優(yōu)先。網(wǎng)絡(luò )爬蟲(chóng)采取的廣度優(yōu)先方式總結如下:2個(gè)數組,一個(gè)
  閱讀全文
  一篇文章文章教你使用Python網(wǎng)絡(luò )爬蟲(chóng)爬取評論區百度貼吧圖片和視頻
  
  
  作者:python進(jìn)階26人查看評論:01年前
  [一、項目背景]百度貼吧是全球最大的中文交流平臺。你是不是和我一樣,有時(shí)候看到評論區的圖片就想下載?或者觀(guān)看視頻并想下載?今天小編帶大家通過(guò)搜索關(guān)鍵詞,在評論區獲取圖片和視頻。[二、項目目標]實(shí)現貼吧獲取的圖片或視頻將保存在
  閱讀全文 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解策略實(shí)戰作者(組圖)作者)
  阿里云>云棲社區>主題圖>C>c爬蟲(chóng)源碼
  
  推薦活動(dòng):
  更多優(yōu)惠>
  當前話(huà)題:c網(wǎng)絡(luò )爬蟲(chóng)源碼加入采集
  相關(guān)話(huà)題:
  c網(wǎng)絡(luò )爬蟲(chóng)源碼相關(guān)博客看更多博文
  C# 網(wǎng)絡(luò )爬蟲(chóng)
  
  
  作者:Street Corner Box 712 查看評論:05 年前
  公司的編輯需要爬取網(wǎng)頁(yè)的內容,讓我幫我做一個(gè)簡(jiǎn)單的爬取工具。這是抓取網(wǎng)頁(yè)的內容??磥?lái)這對大家來(lái)說(shuō)并不難,不過(guò)這里有一些小的改動(dòng),代碼提供,請參考 1 private string GetHttpWebRequest(string url) 2 { 3 Ht
  閱讀全文
  C#HttpHelper爬蟲(chóng)源碼分享--蘇飛版
  
  
  作者:蘇飛2071 瀏覽評論:03年前
  簡(jiǎn)介 C#HttpHelper實(shí)現了C#HttpWebRequest爬取時(shí)忽略編碼、忽略證書(shū)、忽略cookie的功能,實(shí)現代理的功能。有了它,您可以發(fā)出 Get 和 Post 請求,并且可以輕松設置 cookie、證書(shū)、代理和編碼。你不用擔心這個(gè)問(wèn)題,因為類(lèi)會(huì )自動(dòng)為你識別頁(yè)面
  閱讀全文
  Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解攻略實(shí)戰
  
  
  作者:薇薇8128 瀏覽評論:04年前
  作者:薇薇,請注明出處。我們經(jīng)常會(huì )寫(xiě)一些網(wǎng)絡(luò )爬蟲(chóng),想必大家都會(huì )有一種感覺(jué),雖然寫(xiě)爬蟲(chóng)不難,但是反爬很難處理,因為大部分網(wǎng)站都有自己的反爬機制,所以我們將更加難以抓取這些數據。但是,對于每一種反爬機制,我們其實(shí)都會(huì )有相應的解決方案。作為一個(gè)爬蟲(chóng),我們,
  閱讀全文
  C#網(wǎng)絡(luò )爬蟲(chóng)--多線(xiàn)程增強版
  
  
  作者:街角盒飯 688 次瀏覽評論:05 年前
  上次給公司的一個(gè)女生做爬蟲(chóng),不是很精致。這次是用在公司的項目中,所以做了一些改動(dòng)。該函數添加了一個(gè)URL圖片采集,下載,線(xiàn)程處理接口URL圖片下載等。說(shuō)說(shuō)思路:總理在初始網(wǎng)站采集圖片去獲取初始網(wǎng)站的所有內容到初始網(wǎng)站 采集 鏈接并將 采集 的鏈接放入隊列以繼續 采集 圖片
  閱讀全文
  Python網(wǎng)絡(luò )爬蟲(chóng)抓取極品姐姐的視頻并保存到文件
  
  
  作者:keitwotest1060 瀏覽評論:04年前
  項目描述 用Python寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)爬取Best Sister的視頻并保存到文件中使用工具示例 Python2.7.X,pycharm如何使用創(chuàng )建視頻爬取Best Sister in pycharm .py 文件,并在當前目錄下創(chuàng )建video文件夾,用于存放采集到的視頻文件,編寫(xiě)代碼,運行
  閱讀全文
  一篇文章文章教你用Python網(wǎng)絡(luò )爬蟲(chóng)搞定差旅攻略
  
  
  作者:python進(jìn)階13人查看評論:01年前
  [一、項目背景] 趣游網(wǎng)提供原創(chuàng )實(shí)用的出境游指南、攻略、旅游社區和問(wèn)答平臺,以及智能旅游規劃解決方案,以及簽證、保險、機票、酒店在線(xiàn)預訂、租車(chē)等增值服務(wù)。僑游“鼓勵和幫助中國游客以自己的視角和方式體驗世界”。今天就教大家如何獲取僑友網(wǎng)的城市信息。
  閱讀全文
  Java版網(wǎng)絡(luò )爬蟲(chóng)基礎(轉)
  
  
  作者:developerguy851 瀏覽評論:06年前
  網(wǎng)絡(luò )爬蟲(chóng)不僅可以爬取網(wǎng)站網(wǎng)頁(yè)和圖片,甚至可以實(shí)現搶票、網(wǎng)上購買(mǎi)、機票查詢(xún)。這幾天看了一些基礎知識,記錄下來(lái)。網(wǎng)頁(yè)之間的關(guān)系可以看成一個(gè)大圖,圖的遍歷可以分為深度優(yōu)先和廣度優(yōu)先。網(wǎng)絡(luò )爬蟲(chóng)采取的廣度優(yōu)先方式總結如下:2個(gè)數組,一個(gè)
  閱讀全文
  一篇文章文章教你使用Python網(wǎng)絡(luò )爬蟲(chóng)爬取評論區百度貼吧圖片和視頻
  
  
  作者:python進(jìn)階26人查看評論:01年前
  [一、項目背景]百度貼吧是全球最大的中文交流平臺。你是不是和我一樣,有時(shí)候看到評論區的圖片就想下載?或者觀(guān)看視頻并想下載?今天小編帶大家通過(guò)搜索關(guān)鍵詞,在評論區獲取圖片和視頻。[二、項目目標]實(shí)現貼吧獲取的圖片或視頻將保存在
  閱讀全文

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(以文章首頁(yè)爬取數據的首頁(yè)方法數據類(lèi)型及類(lèi)型)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 48 次瀏覽 ? 2022-01-16 16:01 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(以文章首頁(yè)爬取數據的首頁(yè)方法數據類(lèi)型及類(lèi)型)
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據,而且是從不同的,唯一的抓取途徑。還可以做到自動(dòng)翻頁(yè)?還能直接或間接爬到某種信息?這些網(wǎng)站應該都是通過(guò)共享logo實(shí)現抓取的,使用flask-redis的interface進(jìn)行封裝。
  cookie我是猜的,因為javascript只能獲取某一特定瀏覽器上的數據。而這個(gè)功能在手機瀏覽器上,有更完美的封裝。html5里的grid布局就可以覆蓋.useragent。那么問(wèn)題來(lái)了,抓取非ie瀏覽器不就得了。
  什么是首頁(yè)?網(wǎng)站的入口,無(wú)論是wap、flash還是http,都必須在“首頁(yè)”上放置頁(yè)面標簽,而首頁(yè)無(wú)非兩種格式:網(wǎng)站首頁(yè)和文章首頁(yè)。文章首頁(yè)只是網(wǎng)站中頁(yè)面的補充,目的為使讀者不至于從網(wǎng)站跳轉而無(wú)法繼續訪(fǎng)問(wèn)網(wǎng)站本身。下面的爬蟲(chóng)就是以文章首頁(yè)爬取數據。為了編寫(xiě)方便,urllib.request、urllib.request.urlretrieve等同樣用于這種場(chǎng)景,可以根據接口的數據結構靈活實(shí)現爬取json。
  首頁(yè)抓取方法數據類(lèi)型1、地址2、標簽名a標簽:/useragent是tx在googleanalytics上面對當前我國互聯(lián)網(wǎng)用戶(hù)分析調研得出的pythonurlretrieve提供的接口。在python中常用。#headers頭部urllib.request.headers.setretrieve("request_uri",url,verify=false)#聲明請求頭headers頭部自定義urlurllib.request.headers.setretrieve("request_uri","",verify=false)#聲明請求頭urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.alias_default)#聲明請求頭urllib.request.headers.setretrieve("data_string",tx.noagent.transform.text)#聲明請求頭urllib.request.headers.setretrieve("category","",verify=false)#聲明請求頭urllib.request.headers.setretrieve("category","",verify=false)urllib.request.headers.setretrieve("data_text",tx.noagent.transform.text)//網(wǎng)頁(yè)簡(jiǎn)易使用urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.text)urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.text)//web瀏覽器根據url抓取元素urllib.request.headers.setretrieve("cookie",tx.noagent.cookie)python抓取cookie部分的代碼importrequestsfrombs4importbeaut。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(以文章首頁(yè)爬取數據的首頁(yè)方法數據類(lèi)型及類(lèi)型)
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據,而且是從不同的,唯一的抓取途徑。還可以做到自動(dòng)翻頁(yè)?還能直接或間接爬到某種信息?這些網(wǎng)站應該都是通過(guò)共享logo實(shí)現抓取的,使用flask-redis的interface進(jìn)行封裝。
  cookie我是猜的,因為javascript只能獲取某一特定瀏覽器上的數據。而這個(gè)功能在手機瀏覽器上,有更完美的封裝。html5里的grid布局就可以覆蓋.useragent。那么問(wèn)題來(lái)了,抓取非ie瀏覽器不就得了。
  什么是首頁(yè)?網(wǎng)站的入口,無(wú)論是wap、flash還是http,都必須在“首頁(yè)”上放置頁(yè)面標簽,而首頁(yè)無(wú)非兩種格式:網(wǎng)站首頁(yè)和文章首頁(yè)。文章首頁(yè)只是網(wǎng)站中頁(yè)面的補充,目的為使讀者不至于從網(wǎng)站跳轉而無(wú)法繼續訪(fǎng)問(wèn)網(wǎng)站本身。下面的爬蟲(chóng)就是以文章首頁(yè)爬取數據。為了編寫(xiě)方便,urllib.request、urllib.request.urlretrieve等同樣用于這種場(chǎng)景,可以根據接口的數據結構靈活實(shí)現爬取json。
  首頁(yè)抓取方法數據類(lèi)型1、地址2、標簽名a標簽:/useragent是tx在googleanalytics上面對當前我國互聯(lián)網(wǎng)用戶(hù)分析調研得出的pythonurlretrieve提供的接口。在python中常用。#headers頭部urllib.request.headers.setretrieve("request_uri",url,verify=false)#聲明請求頭headers頭部自定義urlurllib.request.headers.setretrieve("request_uri","",verify=false)#聲明請求頭urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.alias_default)#聲明請求頭urllib.request.headers.setretrieve("data_string",tx.noagent.transform.text)#聲明請求頭urllib.request.headers.setretrieve("category","",verify=false)#聲明請求頭urllib.request.headers.setretrieve("category","",verify=false)urllib.request.headers.setretrieve("data_text",tx.noagent.transform.text)//網(wǎng)頁(yè)簡(jiǎn)易使用urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.text)urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.text)//web瀏覽器根據url抓取元素urllib.request.headers.setretrieve("cookie",tx.noagent.cookie)python抓取cookie部分的代碼importrequestsfrombs4importbeaut。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(新手練習爬蟲(chóng)不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,拿走不謝!)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 55 次瀏覽 ? 2022-01-14 09:13 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(新手練習爬蟲(chóng)不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,拿走不謝!)
  最近暑假快到了,很多朋友都在找暑期實(shí)習吧?前幾天,朋友的小弟暑假想找個(gè)實(shí)習來(lái)鍛煉自己,但面對網(wǎng)上千篇一律的實(shí)習招聘信息,不知所措。然后我的朋友給我發(fā)了一條“請求幫助”的消息。得知大致情況后,我立即用爬蟲(chóng)爬取了練習網(wǎng)的信息,并將數據結果發(fā)送過(guò)去,分分鐘解決了問(wèn)題。請我吃飯會(huì )不會(huì )太過(guò)分了?
  
  本爬蟲(chóng)實(shí)戰教程不僅適合新手練習爬蟲(chóng),也適合需要找實(shí)習資料的朋友!
  希望看完這篇文章,能夠清楚的知道整個(gè)爬蟲(chóng)流程,并且能夠獨立完成,二來(lái)可以通過(guò)自己的爬蟲(chóng)實(shí)戰得到自己想要的信息。
  好吧,事不宜遲,讓我們開(kāi)始吧!
  內容主要分為兩部分:
  頁(yè)面分析爬蟲(chóng)步驟詳解
  一、目標頁(yè)面分析
  首先,我們應該知道我們的爬蟲(chóng)目標是什么,對吧?俗話(huà)說(shuō),知己知彼,百戰不殆。我們已經(jīng)知道我們要爬的頁(yè)面是“實(shí)習網(wǎng)”,所以我們首先要到實(shí)習網(wǎng)看看有什么數據。
  實(shí)習網(wǎng)址:
  頁(yè)面如下:
  
  比如我們要找的職位就是“品牌運營(yíng)”職位的數據。因此,您可以直接在網(wǎng)頁(yè)的搜索框中輸入品牌運營(yíng)。您會(huì )注意到網(wǎng)址已更改!
  
  注:我們要抓取的頁(yè)面是這個(gè)頁(yè)面:品牌運營(yíng)
  在我們的爬取頁(yè)面中,我們需要觀(guān)察那里有哪些數據,一個(gè)頁(yè)面中有幾條數據。這點(diǎn)很重要,跟后面的代碼編寫(xiě)有關(guān),可以幫你檢查頁(yè)面上的所有信息是否都被爬取了。
  
  此時(shí),我們要注意的是,我們所在的頁(yè)面是“一級頁(yè)面”。在瀏覽過(guò)程中,我們隨機點(diǎn)擊一個(gè)帖子進(jìn)入后,會(huì )顯示“二級頁(yè)面”。這時(shí)候你也會(huì )發(fā)現url又出現了。改變了。
  比如我們點(diǎn)擊一??個(gè)品牌運營(yíng)實(shí)踐,二級頁(yè)面會(huì )自動(dòng)跳轉到這個(gè),生成一個(gè)新的鏈接。如圖所示:
  
  如何抓取頁(yè)面上的信息?
  在分析過(guò)程中,我們發(fā)現有的信息在一級頁(yè)面,有的在二級頁(yè)面。
  在一級頁(yè)面,我們可以得到什么信息?如圖所示:
  
  一共有五個(gè)有效數據:職位、公司名稱(chēng)、學(xué)歷、薪水、地址
  在二級頁(yè)面中,我們來(lái)看看可以獲得哪些有效數據、字段和刻度。如果覺(jué)得階段很重要,也可以納入爬蟲(chóng)的范圍,但我個(gè)人認為這不影響實(shí)習。畢竟,它不是在尋找正式的工作。影響不會(huì )很大,但是招聘的實(shí)習生數量比較重要。這里沒(méi)有顯示新兵的數量,也無(wú)法在圖片上顯示。以后可以添加。
  
  此時(shí),我們一共需要抓取7個(gè)數據,加上“人數”,一共8個(gè)數據,就是我們爬蟲(chóng)最終的目標數據。
  抓取“靜態(tài)”網(wǎng)頁(yè)
  下面分析一下什么是靜態(tài)網(wǎng)頁(yè),什么是動(dòng)態(tài)網(wǎng)頁(yè)。對于靜態(tài)網(wǎng)頁(yè),隨著(zhù)html代碼的生成,頁(yè)面的內容和顯示效果基本不會(huì )改變——除非你修改了頁(yè)面代碼。動(dòng)態(tài)網(wǎng)頁(yè)并非如此。雖然頁(yè)面代碼沒(méi)有改變,但是顯示的內容會(huì )隨著(zhù)時(shí)間、環(huán)境或數據庫操作的結果而改變。
  它們的區別在于靜態(tài)網(wǎng)頁(yè)中的數據是一勞永逸的,也就是說(shuō)一次性給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數據是隨著(zhù)頁(yè)面的逐步加載而逐漸呈現出來(lái)的,也就是說(shuō),如果使用靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù),是無(wú)法獲取其中所有數據的。
  值得強調的是,動(dòng)態(tài)網(wǎng)頁(yè)不應與頁(yè)面內容是否動(dòng)態(tài)相混淆。這里所說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)動(dòng)態(tài)效果沒(méi)有直接關(guān)系。動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文本內容或收錄各種動(dòng)畫(huà)內容。這些只是特定于網(wǎng)頁(yè)。內容的呈現形式,無(wú)論網(wǎng)頁(yè)是否具有動(dòng)態(tài)效果,只要是動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè),都可以稱(chēng)為動(dòng)態(tài)網(wǎng)頁(yè)。
  點(diǎn)擊“鼠標右鍵”,點(diǎn)擊“查看網(wǎng)頁(yè)源代碼”,最終效果如圖(部分截圖):
  
  這是最終反饋給您的數據。如果你發(fā)現你想要的數據都在里面,那么就可以說(shuō)是靜態(tài)頁(yè)面,否則就認為是“動(dòng)態(tài)頁(yè)面”。
  今天這里的案例是一個(gè)靜態(tài)網(wǎng)頁(yè)。
  眾所周知,在編寫(xiě)代碼之前,我們必須知道我們使用哪些方法、庫和模塊來(lái)幫助您解析數據。常用的數據解析方法有:re正則表達式、xpath、beatifulsoup、pyquery等。
  我們需要用到的是xpath解析方法來(lái)分析定位數據。
  二、爬蟲(chóng)代碼說(shuō)明
  導入相關(guān)庫
  爬取的第一步是考慮在爬取過(guò)程中需要哪些庫。您必須知道python是一種依賴(lài)于許多庫的語(yǔ)言。沒(méi)有庫的 Python 是不完整的。
  import pandas as pd # 用于數據存儲
import requests # 用于請求網(wǎng)頁(yè)
import chardet # 用于修改編碼
import re # 用于提取數據
from lxml import etree # 解析數據的庫
import time # 可以粗糙模擬人為請求網(wǎng)頁(yè)的速度
import warnings # 忽略代碼運行時(shí)候的警告信息
warnings.filterwarnings("ignore")
  2、請求一級頁(yè)面的源碼
  url = 'https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)['encoding'] ②
html = etree.HTML(rqg.text)
  這里要注意①和②兩個(gè)地方。①處有兩個(gè)參數,一個(gè)是headers,一個(gè)是verify。其中headers是一種防反爬的措施,它使瀏覽器認為爬蟲(chóng)不是爬蟲(chóng),而是人們使用瀏覽器正常請求網(wǎng)頁(yè)。verify 是忽略安全證書(shū)提示。某些網(wǎng)頁(yè)會(huì )被視為不安全網(wǎng)頁(yè),并會(huì )提示您。只要記住這個(gè)參數。
  在②處,我們已經(jīng)獲得了網(wǎng)頁(yè)的源代碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和你電腦的解析方式,可能存在不一致,返回的結果會(huì )導致亂碼。此時(shí)需要修改編碼方式。chardet 庫可以幫助您自動(dòng)檢測網(wǎng)頁(yè)源代碼的編碼。(一個(gè)非常有用的三方庫chardet檢測文檔編碼)
  3、解析一級頁(yè)面中的信息
  # 1. 公司名
company_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 崗位名
job_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath('//div[@class="job-pannel-two"]//a/text()')
# 4. 學(xué)歷
degree_list = html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')
# 5. 薪資
salary_list = html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')
salary_list = [i.strip() for i in salary_list]
# 獲取二級頁(yè)面的鏈接
deep_url_list = html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
此時(shí),你可以看到,我直接采用xpath一個(gè)個(gè)去解析一級頁(yè)面中的數據分析。在代碼末尾,可以看到:我們獲取到了二級頁(yè)面的鏈接,為我們后面爬取二級頁(yè)面中的信息,做準備。
解析二級頁(yè)面網(wǎng)頁(yè)中的信息
demand_list = []
area_list = []
scale_list = []
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)['encoding'] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人數
demand = html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')
# 7. 公司領(lǐng)域
area = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')
# 8. 公司規模
scale = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
  需要注意的是,二級頁(yè)面也是一個(gè)頁(yè)面,在爬取里面的數據的時(shí)候需要請求這個(gè)頁(yè)面。因此,①②③處的代碼完全相同。
  4、翻頁(yè)操作
  https://www.shixi.com/search/i ... e%3D1
https://www.shixi.com/search/i ... e%3D2
https://www.shixi.com/search/i ... e%3D3
  隨意復制幾個(gè)不同頁(yè)面的 URL 并觀(guān)察差異。這里可以看出page參數后面的數字是不一樣的,哪一頁(yè)是數字,數字就是數字。
  x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
  由于我們已經(jīng)爬取了60頁(yè)的數據,所以這里構造了60個(gè)url,全部存放在url_list列表中。
  現在來(lái)看整個(gè)代碼,我不再用文字描述,直接在代碼中寫(xiě)注釋。
  import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 請求獲取一級頁(yè)面的源代碼
url = 'https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)['encoding']
html = etree.HTML(rqg.text)
# 獲取一級頁(yè)面中的信息:一共有5個(gè)信息。
# ①公司名
company_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②崗位名
job_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
#③地址
address_list = html.xpath('//div[@class="job-pannel-two"]//a/text()')
# ④ 學(xué)歷
degree_list = html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')
# ⑤薪資
salary_list = html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')
salary_list = [i.strip() for i in salary_list]
# ⑥獲取二級頁(yè)面的內容
deep_url_list = html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
demand_list = []
area_list = []
scale_list = []
# 獲取二級頁(yè)面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)['encoding']
html = etree.HTML(rqg.text)
#① 需要幾人
demand = html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')
# ②公司領(lǐng)域
area = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')
# ③公司規模
scale = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
# ④ 將每個(gè)頁(yè)面獲取到的所有數據,存儲到DataFrame中。
data = pd.DataFrame({'公司名':company_list,'崗位名':job_list,'地址':address_list,"學(xué)歷":degree_list,
'薪資':salary_list,'崗位需求量':demand_list,'公司領(lǐng)域':area_list,'公司規模':scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=['公司名','崗位名','地址',"學(xué)歷",'薪資','崗位需求量','公司領(lǐng)域','公司規模'])
# 這里進(jìn)行“翻頁(yè)”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存數據
res.to_csv('aliang.csv',encoding='utf_8_sig')
  這一套之后,爬蟲(chóng)的思路是不是瞬間清晰了?眼睛:我會(huì )的!手:我還是不會(huì )。多加練習。初學(xué)者不要急于求成,項目不多,但有技巧??赐敢粋€(gè)比看十個(gè)要有效得多。
  想要獲取源碼的朋友,點(diǎn)贊+評論,私聊~ 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(新手練習爬蟲(chóng)不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,拿走不謝!)
  最近暑假快到了,很多朋友都在找暑期實(shí)習吧?前幾天,朋友的小弟暑假想找個(gè)實(shí)習來(lái)鍛煉自己,但面對網(wǎng)上千篇一律的實(shí)習招聘信息,不知所措。然后我的朋友給我發(fā)了一條“請求幫助”的消息。得知大致情況后,我立即用爬蟲(chóng)爬取了練習網(wǎng)的信息,并將數據結果發(fā)送過(guò)去,分分鐘解決了問(wèn)題。請我吃飯會(huì )不會(huì )太過(guò)分了?
  
  本爬蟲(chóng)實(shí)戰教程不僅適合新手練習爬蟲(chóng),也適合需要找實(shí)習資料的朋友!
  希望看完這篇文章,能夠清楚的知道整個(gè)爬蟲(chóng)流程,并且能夠獨立完成,二來(lái)可以通過(guò)自己的爬蟲(chóng)實(shí)戰得到自己想要的信息。
  好吧,事不宜遲,讓我們開(kāi)始吧!
  內容主要分為兩部分:
  頁(yè)面分析爬蟲(chóng)步驟詳解
  一、目標頁(yè)面分析
  首先,我們應該知道我們的爬蟲(chóng)目標是什么,對吧?俗話(huà)說(shuō),知己知彼,百戰不殆。我們已經(jīng)知道我們要爬的頁(yè)面是“實(shí)習網(wǎng)”,所以我們首先要到實(shí)習網(wǎng)看看有什么數據。
  實(shí)習網(wǎng)址:
  頁(yè)面如下:
  
  比如我們要找的職位就是“品牌運營(yíng)”職位的數據。因此,您可以直接在網(wǎng)頁(yè)的搜索框中輸入品牌運營(yíng)。您會(huì )注意到網(wǎng)址已更改!
  
  注:我們要抓取的頁(yè)面是這個(gè)頁(yè)面:品牌運營(yíng)
  在我們的爬取頁(yè)面中,我們需要觀(guān)察那里有哪些數據,一個(gè)頁(yè)面中有幾條數據。這點(diǎn)很重要,跟后面的代碼編寫(xiě)有關(guān),可以幫你檢查頁(yè)面上的所有信息是否都被爬取了。
  
  此時(shí),我們要注意的是,我們所在的頁(yè)面是“一級頁(yè)面”。在瀏覽過(guò)程中,我們隨機點(diǎn)擊一個(gè)帖子進(jìn)入后,會(huì )顯示“二級頁(yè)面”。這時(shí)候你也會(huì )發(fā)現url又出現了。改變了。
  比如我們點(diǎn)擊一??個(gè)品牌運營(yíng)實(shí)踐,二級頁(yè)面會(huì )自動(dòng)跳轉到這個(gè),生成一個(gè)新的鏈接。如圖所示:
  
  如何抓取頁(yè)面上的信息?
  在分析過(guò)程中,我們發(fā)現有的信息在一級頁(yè)面,有的在二級頁(yè)面。
  在一級頁(yè)面,我們可以得到什么信息?如圖所示:
  
  一共有五個(gè)有效數據:職位、公司名稱(chēng)、學(xué)歷、薪水、地址
  在二級頁(yè)面中,我們來(lái)看看可以獲得哪些有效數據、字段和刻度。如果覺(jué)得階段很重要,也可以納入爬蟲(chóng)的范圍,但我個(gè)人認為這不影響實(shí)習。畢竟,它不是在尋找正式的工作。影響不會(huì )很大,但是招聘的實(shí)習生數量比較重要。這里沒(méi)有顯示新兵的數量,也無(wú)法在圖片上顯示。以后可以添加。
  
  此時(shí),我們一共需要抓取7個(gè)數據,加上“人數”,一共8個(gè)數據,就是我們爬蟲(chóng)最終的目標數據。
  抓取“靜態(tài)”網(wǎng)頁(yè)
  下面分析一下什么是靜態(tài)網(wǎng)頁(yè),什么是動(dòng)態(tài)網(wǎng)頁(yè)。對于靜態(tài)網(wǎng)頁(yè),隨著(zhù)html代碼的生成,頁(yè)面的內容和顯示效果基本不會(huì )改變——除非你修改了頁(yè)面代碼。動(dòng)態(tài)網(wǎng)頁(yè)并非如此。雖然頁(yè)面代碼沒(méi)有改變,但是顯示的內容會(huì )隨著(zhù)時(shí)間、環(huán)境或數據庫操作的結果而改變。
  它們的區別在于靜態(tài)網(wǎng)頁(yè)中的數據是一勞永逸的,也就是說(shuō)一次性給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數據是隨著(zhù)頁(yè)面的逐步加載而逐漸呈現出來(lái)的,也就是說(shuō),如果使用靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù),是無(wú)法獲取其中所有數據的。
  值得強調的是,動(dòng)態(tài)網(wǎng)頁(yè)不應與頁(yè)面內容是否動(dòng)態(tài)相混淆。這里所說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)動(dòng)態(tài)效果沒(méi)有直接關(guān)系。動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文本內容或收錄各種動(dòng)畫(huà)內容。這些只是特定于網(wǎng)頁(yè)。內容的呈現形式,無(wú)論網(wǎng)頁(yè)是否具有動(dòng)態(tài)效果,只要是動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè),都可以稱(chēng)為動(dòng)態(tài)網(wǎng)頁(yè)。
  點(diǎn)擊“鼠標右鍵”,點(diǎn)擊“查看網(wǎng)頁(yè)源代碼”,最終效果如圖(部分截圖):
  
  這是最終反饋給您的數據。如果你發(fā)現你想要的數據都在里面,那么就可以說(shuō)是靜態(tài)頁(yè)面,否則就認為是“動(dòng)態(tài)頁(yè)面”。
  今天這里的案例是一個(gè)靜態(tài)網(wǎng)頁(yè)。
  眾所周知,在編寫(xiě)代碼之前,我們必須知道我們使用哪些方法、庫和模塊來(lái)幫助您解析數據。常用的數據解析方法有:re正則表達式、xpath、beatifulsoup、pyquery等。
  我們需要用到的是xpath解析方法來(lái)分析定位數據。
  二、爬蟲(chóng)代碼說(shuō)明
  導入相關(guān)庫
  爬取的第一步是考慮在爬取過(guò)程中需要哪些庫。您必須知道python是一種依賴(lài)于許多庫的語(yǔ)言。沒(méi)有庫的 Python 是不完整的。
  import pandas as pd # 用于數據存儲
import requests # 用于請求網(wǎng)頁(yè)
import chardet # 用于修改編碼
import re # 用于提取數據
from lxml import etree # 解析數據的庫
import time # 可以粗糙模擬人為請求網(wǎng)頁(yè)的速度
import warnings # 忽略代碼運行時(shí)候的警告信息
warnings.filterwarnings("ignore")
  2、請求一級頁(yè)面的源碼
  url = 'https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)['encoding'] ②
html = etree.HTML(rqg.text)
  這里要注意①和②兩個(gè)地方。①處有兩個(gè)參數,一個(gè)是headers,一個(gè)是verify。其中headers是一種防反爬的措施,它使瀏覽器認為爬蟲(chóng)不是爬蟲(chóng),而是人們使用瀏覽器正常請求網(wǎng)頁(yè)。verify 是忽略安全證書(shū)提示。某些網(wǎng)頁(yè)會(huì )被視為不安全網(wǎng)頁(yè),并會(huì )提示您。只要記住這個(gè)參數。
  在②處,我們已經(jīng)獲得了網(wǎng)頁(yè)的源代碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和你電腦的解析方式,可能存在不一致,返回的結果會(huì )導致亂碼。此時(shí)需要修改編碼方式。chardet 庫可以幫助您自動(dòng)檢測網(wǎng)頁(yè)源代碼的編碼。(一個(gè)非常有用的三方庫chardet檢測文檔編碼)
  3、解析一級頁(yè)面中的信息
  # 1. 公司名
company_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 崗位名
job_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath('//div[@class="job-pannel-two"]//a/text()')
# 4. 學(xué)歷
degree_list = html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')
# 5. 薪資
salary_list = html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')
salary_list = [i.strip() for i in salary_list]
# 獲取二級頁(yè)面的鏈接
deep_url_list = html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
此時(shí),你可以看到,我直接采用xpath一個(gè)個(gè)去解析一級頁(yè)面中的數據分析。在代碼末尾,可以看到:我們獲取到了二級頁(yè)面的鏈接,為我們后面爬取二級頁(yè)面中的信息,做準備。
解析二級頁(yè)面網(wǎng)頁(yè)中的信息
demand_list = []
area_list = []
scale_list = []
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)['encoding'] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人數
demand = html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')
# 7. 公司領(lǐng)域
area = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')
# 8. 公司規模
scale = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
  需要注意的是,二級頁(yè)面也是一個(gè)頁(yè)面,在爬取里面的數據的時(shí)候需要請求這個(gè)頁(yè)面。因此,①②③處的代碼完全相同。
  4、翻頁(yè)操作
  https://www.shixi.com/search/i ... e%3D1
https://www.shixi.com/search/i ... e%3D2
https://www.shixi.com/search/i ... e%3D3
  隨意復制幾個(gè)不同頁(yè)面的 URL 并觀(guān)察差異。這里可以看出page參數后面的數字是不一樣的,哪一頁(yè)是數字,數字就是數字。
  x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
  由于我們已經(jīng)爬取了60頁(yè)的數據,所以這里構造了60個(gè)url,全部存放在url_list列表中。
  現在來(lái)看整個(gè)代碼,我不再用文字描述,直接在代碼中寫(xiě)注釋。
  import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 請求獲取一級頁(yè)面的源代碼
url = 'https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)['encoding']
html = etree.HTML(rqg.text)
# 獲取一級頁(yè)面中的信息:一共有5個(gè)信息。
# ①公司名
company_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②崗位名
job_list = html.xpath('//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()')
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
#③地址
address_list = html.xpath('//div[@class="job-pannel-two"]//a/text()')
# ④ 學(xué)歷
degree_list = html.xpath('//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()')
# ⑤薪資
salary_list = html.xpath('//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()')
salary_list = [i.strip() for i in salary_list]
# ⑥獲取二級頁(yè)面的內容
deep_url_list = html.xpath('//div[@class="job-pannel-list"]//dt/a/@href')
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
demand_list = []
area_list = []
scale_list = []
# 獲取二級頁(yè)面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)['encoding']
html = etree.HTML(rqg.text)
#① 需要幾人
demand = html.xpath('//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()')
# ②公司領(lǐng)域
area = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()')
# ③公司規模
scale = html.xpath('//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()')
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
# ④ 將每個(gè)頁(yè)面獲取到的所有數據,存儲到DataFrame中。
data = pd.DataFrame({'公司名':company_list,'崗位名':job_list,'地址':address_list,"學(xué)歷":degree_list,
'薪資':salary_list,'崗位需求量':demand_list,'公司領(lǐng)域':area_list,'公司規模':scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=['公司名','崗位名','地址',"學(xué)歷",'薪資','崗位需求量','公司領(lǐng)域','公司規模'])
# 這里進(jìn)行“翻頁(yè)”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存數據
res.to_csv('aliang.csv',encoding='utf_8_sig')
  這一套之后,爬蟲(chóng)的思路是不是瞬間清晰了?眼睛:我會(huì )的!手:我還是不會(huì )。多加練習。初學(xué)者不要急于求成,項目不多,但有技巧??赐敢粋€(gè)比看十個(gè)要有效得多。
  想要獲取源碼的朋友,點(diǎn)贊+評論,私聊~

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(1.網(wǎng)絡(luò )爬蟲(chóng)的基本概念網(wǎng)絡(luò )蜘蛛,機器人都能夠做到! )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 48 次瀏覽 ? 2022-01-13 21:28 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(1.網(wǎng)絡(luò )爬蟲(chóng)的基本概念網(wǎng)絡(luò )蜘蛛,機器人都能夠做到!
)
  1.網(wǎng)絡(luò )爬蟲(chóng)基本概念
  網(wǎng)絡(luò )爬蟲(chóng)(也稱(chēng)為網(wǎng)絡(luò )蜘蛛或機器人)是模擬客戶(hù)端發(fā)送網(wǎng)絡(luò )請求并接收請求響應的程序。它是一個(gè)按照一定的規則自動(dòng)抓取互聯(lián)網(wǎng)信息的程序。
  只要瀏覽器能做任何事情,原則上爬蟲(chóng)都能做到。
  2.網(wǎng)絡(luò )爬蟲(chóng)函數
  
  網(wǎng)絡(luò )爬蟲(chóng)可以手動(dòng)替換很多東西,比如用作搜索引擎,或者爬取網(wǎng)站上的圖片。比如有的朋友把一些網(wǎng)站上的所有圖片都爬進(jìn)去,集中在上面??梢赃M(jìn)行投資分析。
  有時(shí)候,可能有幾個(gè)我們比較喜歡的新聞網(wǎng)站,每次瀏覽都單獨打開(kāi)這些新聞網(wǎng)站比較麻煩。這時(shí)候就可以用網(wǎng)絡(luò )爬蟲(chóng)來(lái)爬取這多條新聞網(wǎng)站中的新聞信息,集中閱讀。
  有時(shí)候,我們在網(wǎng)上瀏覽信息的時(shí)候,會(huì )發(fā)現有很多廣告。這時(shí)也可以利用爬蟲(chóng)來(lái)爬取相應網(wǎng)頁(yè)上的信息,從而自動(dòng)過(guò)濾掉這些廣告,方便信息的閱讀和使用。
  有時(shí)候,我們需要做營(yíng)銷(xiāo),所以如何找到目標客戶(hù)和目標客戶(hù)的聯(lián)系方式是一個(gè)關(guān)鍵問(wèn)題。我們可以手動(dòng)搜索互聯(lián)網(wǎng),但這會(huì )非常低效。這時(shí)候,我們可以通過(guò)爬蟲(chóng)設置相應的規則,自動(dòng)采集從互聯(lián)網(wǎng)上獲取目標用戶(hù)的聯(lián)系方式,供我們營(yíng)銷(xiāo)使用。
  有時(shí)候,我們想分析某個(gè)網(wǎng)站的用戶(hù)信息,比如分析網(wǎng)站的用戶(hù)活躍度、發(fā)言次數、熱門(mén)文章等信息,如果我們沒(méi)有網(wǎng)站@ >管理員,手動(dòng)統計將是一個(gè)非常龐大的工程。此時(shí),您可以使用爬蟲(chóng)輕松采集對這些數據進(jìn)行進(jìn)一步分析,并且所有的爬取操作都是自動(dòng)進(jìn)行的,我們只需要編寫(xiě)相應的爬蟲(chóng)并設計相應的爬蟲(chóng)即可。規則會(huì )做。
  此外,爬蟲(chóng)還可以實(shí)現很多強大的功能??傊?,爬蟲(chóng)的出現在一定程度上可以替代人工訪(fǎng)問(wèn)網(wǎng)頁(yè)。因此,我們以前需要手動(dòng)訪(fǎng)問(wèn)互聯(lián)網(wǎng)信息的操作現在可以通過(guò)爬蟲(chóng)實(shí)現自動(dòng)化,從而更有效地使用互聯(lián)網(wǎng)中的有效信息。.
  3.安裝第三方庫
  在爬取和解析數據之前,需要在 Python 運行環(huán)境中下載并安裝第三方庫請求。
  在Windows系統中,打開(kāi)cmd(命令提示符)界面,在界面輸入pip install requests,回車(chē)安裝。(注意連接網(wǎng)絡(luò ))如下圖
  
  安裝完成,如圖
   查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(1.網(wǎng)絡(luò )爬蟲(chóng)的基本概念網(wǎng)絡(luò )蜘蛛,機器人都能夠做到!
)
  1.網(wǎng)絡(luò )爬蟲(chóng)基本概念
  網(wǎng)絡(luò )爬蟲(chóng)(也稱(chēng)為網(wǎng)絡(luò )蜘蛛或機器人)是模擬客戶(hù)端發(fā)送網(wǎng)絡(luò )請求并接收請求響應的程序。它是一個(gè)按照一定的規則自動(dòng)抓取互聯(lián)網(wǎng)信息的程序。
  只要瀏覽器能做任何事情,原則上爬蟲(chóng)都能做到。
  2.網(wǎng)絡(luò )爬蟲(chóng)函數
  
  網(wǎng)絡(luò )爬蟲(chóng)可以手動(dòng)替換很多東西,比如用作搜索引擎,或者爬取網(wǎng)站上的圖片。比如有的朋友把一些網(wǎng)站上的所有圖片都爬進(jìn)去,集中在上面??梢赃M(jìn)行投資分析。
  有時(shí)候,可能有幾個(gè)我們比較喜歡的新聞網(wǎng)站,每次瀏覽都單獨打開(kāi)這些新聞網(wǎng)站比較麻煩。這時(shí)候就可以用網(wǎng)絡(luò )爬蟲(chóng)來(lái)爬取這多條新聞網(wǎng)站中的新聞信息,集中閱讀。
  有時(shí)候,我們在網(wǎng)上瀏覽信息的時(shí)候,會(huì )發(fā)現有很多廣告。這時(shí)也可以利用爬蟲(chóng)來(lái)爬取相應網(wǎng)頁(yè)上的信息,從而自動(dòng)過(guò)濾掉這些廣告,方便信息的閱讀和使用。
  有時(shí)候,我們需要做營(yíng)銷(xiāo),所以如何找到目標客戶(hù)和目標客戶(hù)的聯(lián)系方式是一個(gè)關(guān)鍵問(wèn)題。我們可以手動(dòng)搜索互聯(lián)網(wǎng),但這會(huì )非常低效。這時(shí)候,我們可以通過(guò)爬蟲(chóng)設置相應的規則,自動(dòng)采集從互聯(lián)網(wǎng)上獲取目標用戶(hù)的聯(lián)系方式,供我們營(yíng)銷(xiāo)使用。
  有時(shí)候,我們想分析某個(gè)網(wǎng)站的用戶(hù)信息,比如分析網(wǎng)站的用戶(hù)活躍度、發(fā)言次數、熱門(mén)文章等信息,如果我們沒(méi)有網(wǎng)站@ >管理員,手動(dòng)統計將是一個(gè)非常龐大的工程。此時(shí),您可以使用爬蟲(chóng)輕松采集對這些數據進(jìn)行進(jìn)一步分析,并且所有的爬取操作都是自動(dòng)進(jìn)行的,我們只需要編寫(xiě)相應的爬蟲(chóng)并設計相應的爬蟲(chóng)即可。規則會(huì )做。
  此外,爬蟲(chóng)還可以實(shí)現很多強大的功能??傊?,爬蟲(chóng)的出現在一定程度上可以替代人工訪(fǎng)問(wèn)網(wǎng)頁(yè)。因此,我們以前需要手動(dòng)訪(fǎng)問(wèn)互聯(lián)網(wǎng)信息的操作現在可以通過(guò)爬蟲(chóng)實(shí)現自動(dòng)化,從而更有效地使用互聯(lián)網(wǎng)中的有效信息。.
  3.安裝第三方庫
  在爬取和解析數據之前,需要在 Python 運行環(huán)境中下載并安裝第三方庫請求。
  在Windows系統中,打開(kāi)cmd(命令提示符)界面,在界面輸入pip install requests,回車(chē)安裝。(注意連接網(wǎng)絡(luò ))如下圖
  
  安裝完成,如圖
  

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(頭條搜索爬蟲(chóng)暴力抓取網(wǎng)站內容直接癱瘓百度也沒(méi)有這么折騰)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-01-13 21:25 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(頭條搜索爬蟲(chóng)暴力抓取網(wǎng)站內容直接癱瘓百度也沒(méi)有這么折騰)
  近日,一位站長(cháng)在網(wǎng)上發(fā)帖抱怨字節跳動(dòng)為了快速發(fā)展搜索業(yè)務(wù),派出爬蟲(chóng)暴力抓取網(wǎng)站內容。@>業(yè)主造成了很大的損失和麻煩,嚴重影響了網(wǎng)站的正常用戶(hù)訪(fǎng)問(wèn)。
  站長(cháng)說(shuō),今年7月突然發(fā)現公司的網(wǎng)站不能頻繁打開(kāi),網(wǎng)頁(yè)加載極慢,有時(shí)甚至直接癱瘓。經(jīng)過(guò)一系列排查,在服務(wù)器日志中發(fā)現了bytespider爬蟲(chóng)的蹤跡。爬蟲(chóng)的爬取頻率每天幾百萬(wàn)次,最高的是幾千萬(wàn)次。服務(wù)器帶寬負載飆升至 100%,爬蟲(chóng)在爬取時(shí)完全不遵循 網(wǎng)站 robots 協(xié)議。
  站長(cháng)順著(zhù)爬蟲(chóng)的IP地址查詢(xún),確認該爬蟲(chóng)是字節跳動(dòng)搜索爬蟲(chóng)。
  另外,我還從CSDN、V2EX等技術(shù)論壇了解到,字節跳動(dòng)開(kāi)始搜索后,其實(shí)網(wǎng)上一直有站長(cháng)抱怨頭條搜索爬蟲(chóng)爬得太猛,被字節跳動(dòng)搜索爬蟲(chóng)。這不是個(gè)例,很多小網(wǎng)站他們都沒(méi)有放過(guò)。
  一些網(wǎng)站小站長(cháng)抱怨:字節跳動(dòng)的爬蟲(chóng)“一上午就向網(wǎng)站發(fā)出46萬(wàn)個(gè)請求”,網(wǎng)站癱瘓了,百度也沒(méi)有那么麻煩!
  最后,站長(cháng)說(shuō),對于像我們這樣做SEO的人來(lái)說(shuō),主要目標是希望自己的首頁(yè)網(wǎng)站能夠在主流搜索引擎的搜索結果中排名靠前。360、收錄等搜索引擎的標準爬取很受歡迎,但是今日頭條搜索爬蟲(chóng)的瘋狂爬取內容網(wǎng)站完全癱瘓,不僅沒(méi)有給網(wǎng)站帶來(lái)流量也影響正常用戶(hù)訪(fǎng)問(wèn),不是很“特殊”。
  但字節跳動(dòng)對此的回應是,“網(wǎng)絡(luò )報道不實(shí),目前今日頭條搜索有反饋機制。網(wǎng)站由于爬蟲(chóng)受到影響,可以通過(guò)郵件反饋直接處理?!?明是不準備正面回應的。
  因此,從頭條搜索爬蟲(chóng)暴力爬取網(wǎng)站的內容來(lái)看,雷哥個(gè)人認為字節跳動(dòng)進(jìn)軍全網(wǎng)搜索,攪動(dòng)搜索市場(chǎng)是好事,但為了快速崛起,讓他的爬蟲(chóng)到處亂爬,剛好有問(wèn)題,大網(wǎng)站服務(wù)器配置高,技術(shù)人員多,但是很多小網(wǎng)站受不了字節的折騰- 完全擊敗搜索爬蟲(chóng)。
  搜索引擎的索引數據是一點(diǎn)一點(diǎn)積累的。百度和搜狗.360經(jīng)歷了這么多年的發(fā)展和積累,才走到了今天。今日頭條搜索瘋狂爬取內容。遠離! 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(頭條搜索爬蟲(chóng)暴力抓取網(wǎng)站內容直接癱瘓百度也沒(méi)有這么折騰)
  近日,一位站長(cháng)在網(wǎng)上發(fā)帖抱怨字節跳動(dòng)為了快速發(fā)展搜索業(yè)務(wù),派出爬蟲(chóng)暴力抓取網(wǎng)站內容。@>業(yè)主造成了很大的損失和麻煩,嚴重影響了網(wǎng)站的正常用戶(hù)訪(fǎng)問(wèn)。
  站長(cháng)說(shuō),今年7月突然發(fā)現公司的網(wǎng)站不能頻繁打開(kāi),網(wǎng)頁(yè)加載極慢,有時(shí)甚至直接癱瘓。經(jīng)過(guò)一系列排查,在服務(wù)器日志中發(fā)現了bytespider爬蟲(chóng)的蹤跡。爬蟲(chóng)的爬取頻率每天幾百萬(wàn)次,最高的是幾千萬(wàn)次。服務(wù)器帶寬負載飆升至 100%,爬蟲(chóng)在爬取時(shí)完全不遵循 網(wǎng)站 robots 協(xié)議。
  站長(cháng)順著(zhù)爬蟲(chóng)的IP地址查詢(xún),確認該爬蟲(chóng)是字節跳動(dòng)搜索爬蟲(chóng)。
  另外,我還從CSDN、V2EX等技術(shù)論壇了解到,字節跳動(dòng)開(kāi)始搜索后,其實(shí)網(wǎng)上一直有站長(cháng)抱怨頭條搜索爬蟲(chóng)爬得太猛,被字節跳動(dòng)搜索爬蟲(chóng)。這不是個(gè)例,很多小網(wǎng)站他們都沒(méi)有放過(guò)。
  一些網(wǎng)站小站長(cháng)抱怨:字節跳動(dòng)的爬蟲(chóng)“一上午就向網(wǎng)站發(fā)出46萬(wàn)個(gè)請求”,網(wǎng)站癱瘓了,百度也沒(méi)有那么麻煩!
  最后,站長(cháng)說(shuō),對于像我們這樣做SEO的人來(lái)說(shuō),主要目標是希望自己的首頁(yè)網(wǎng)站能夠在主流搜索引擎的搜索結果中排名靠前。360、收錄等搜索引擎的標準爬取很受歡迎,但是今日頭條搜索爬蟲(chóng)的瘋狂爬取內容網(wǎng)站完全癱瘓,不僅沒(méi)有給網(wǎng)站帶來(lái)流量也影響正常用戶(hù)訪(fǎng)問(wèn),不是很“特殊”。
  但字節跳動(dòng)對此的回應是,“網(wǎng)絡(luò )報道不實(shí),目前今日頭條搜索有反饋機制。網(wǎng)站由于爬蟲(chóng)受到影響,可以通過(guò)郵件反饋直接處理?!?明是不準備正面回應的。
  因此,從頭條搜索爬蟲(chóng)暴力爬取網(wǎng)站的內容來(lái)看,雷哥個(gè)人認為字節跳動(dòng)進(jìn)軍全網(wǎng)搜索,攪動(dòng)搜索市場(chǎng)是好事,但為了快速崛起,讓他的爬蟲(chóng)到處亂爬,剛好有問(wèn)題,大網(wǎng)站服務(wù)器配置高,技術(shù)人員多,但是很多小網(wǎng)站受不了字節的折騰- 完全擊敗搜索爬蟲(chóng)。
  搜索引擎的索引數據是一點(diǎn)一點(diǎn)積累的。百度和搜狗.360經(jīng)歷了這么多年的發(fā)展和積累,才走到了今天。今日頭條搜索瘋狂爬取內容。遠離!

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(入門(mén)文章數據庫入門(mén)指南系列(一)·#11·cdalogic/cdablog)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-01-13 02:01 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(入門(mén)文章數據庫入門(mén)指南系列(一)·#11·cdalogic/cdablog)
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據redis-spider批量下載百度、新浪、鳳凰、搜狐網(wǎng)站所有熱門(mén)話(huà)題內容elasticsearch-parser全文搜索工具elasticsearch-dnspod解析頁(yè)面數據blogger搜索各大人氣博客
  真羨慕你年紀輕輕不急不慢,就開(kāi)始學(xué)計算機技術(shù)。計算機是真正可以學(xué)到一輩子的東西。上面這些我告訴你,一年之后肯定比30歲有技術(shù)有資本的人。
  在計算機領(lǐng)域,
  希望你可以學(xué)習一下數據庫相關(guān)的知識,如nosql或者mongodb,這些都是你大數據開(kāi)發(fā)基礎中必不可少的組成。你可以從學(xué)習數據庫開(kāi)始入手,或者sql開(kāi)始入手,
  netframework不過(guò)呢,看書(shū)理論性太強,光理論書(shū)就夠你看幾年了。還是老老實(shí)實(shí)看視頻吧。
  剛好昨天剛寫(xiě)了一個(gè)數據庫管理員界面,希望對你有所幫助,
  推薦一本數據庫管理員的入門(mén)手冊,
  我寫(xiě)了一篇入門(mén)文章數據庫入門(mén)指南系列(一)·issue#11·cdalogic/cdablog,
  1.推薦《這個(gè)網(wǎng)站是數據庫(databasemanagementtechniquesandtools)》,應該是hadoop之前經(jīng)典書(shū)籍。2.再推薦《數據庫系統概念(databasesystems)》3.又來(lái)個(gè)《數據庫系統概念導論(databasesystems)》4.還有一本《數據庫管理系統(databasemanagementsystems)》。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(入門(mén)文章數據庫入門(mén)指南系列(一)·#11·cdalogic/cdablog)
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據redis-spider批量下載百度、新浪、鳳凰、搜狐網(wǎng)站所有熱門(mén)話(huà)題內容elasticsearch-parser全文搜索工具elasticsearch-dnspod解析頁(yè)面數據blogger搜索各大人氣博客
  真羨慕你年紀輕輕不急不慢,就開(kāi)始學(xué)計算機技術(shù)。計算機是真正可以學(xué)到一輩子的東西。上面這些我告訴你,一年之后肯定比30歲有技術(shù)有資本的人。
  在計算機領(lǐng)域,
  希望你可以學(xué)習一下數據庫相關(guān)的知識,如nosql或者mongodb,這些都是你大數據開(kāi)發(fā)基礎中必不可少的組成。你可以從學(xué)習數據庫開(kāi)始入手,或者sql開(kāi)始入手,
  netframework不過(guò)呢,看書(shū)理論性太強,光理論書(shū)就夠你看幾年了。還是老老實(shí)實(shí)看視頻吧。
  剛好昨天剛寫(xiě)了一個(gè)數據庫管理員界面,希望對你有所幫助,
  推薦一本數據庫管理員的入門(mén)手冊,
  我寫(xiě)了一篇入門(mén)文章數據庫入門(mén)指南系列(一)·issue#11·cdalogic/cdablog,
  1.推薦《這個(gè)網(wǎng)站是數據庫(databasemanagementtechniquesandtools)》,應該是hadoop之前經(jīng)典書(shū)籍。2.再推薦《數據庫系統概念(databasesystems)》3.又來(lái)個(gè)《數據庫系統概念導論(databasesystems)》4.還有一本《數據庫管理系統(databasemanagementsystems)》。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(產(chǎn)品經(jīng)理網(wǎng)站結構比較簡(jiǎn)單的翻太慢錯的方法有哪些)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 55 次瀏覽 ? 2022-01-12 08:09 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(產(chǎn)品經(jīng)理網(wǎng)站結構比較簡(jiǎn)單的翻太慢錯的方法有哪些)
  再次重申:我不是程序員,也沒(méi)有涉及代碼。當頁(yè)面被修改時(shí),我只涉及復制和粘貼。
  要去給朋友圈添點(diǎn)專(zhuān)業(yè)氣息,需要添加一些新的微信ID;
  在哪里可以找到專(zhuān)業(yè)的微信賬號?
  想著(zhù)大家都是產(chǎn)品經(jīng)理,我看到傳播者在文章下的評論里留下微信,但是每個(gè)文章的翻譯太慢了,也許你可以用一個(gè)工具把所有的評論發(fā)到抓住它進(jìn)行過(guò)濾。
  網(wǎng)站結構比較簡(jiǎn)單,這個(gè)應該是簡(jiǎn)單的抓取,到最后會(huì )發(fā)現自己錯了。
  以下簡(jiǎn)稱(chēng)人人為產(chǎn)品經(jīng)理網(wǎng)站;
  上一篇文章中已經(jīng)詳細介紹了常規爬取的過(guò)程,重復部分本文不再贅述;
  思考過(guò)程:如果有需求,找到需求對應的信息,找到信息對應的位置,找到位置對應的工具,找到工具對應的功能或技能。
  一:換算法,使用更準確的方法;
  上一篇文章介紹了一種生成鏈接的方法,大家準備用同樣的方法再做一遍;
  然后遇到第一個(gè)難點(diǎn):大家的鏈接結構不統一,比如:/pmd/1660079.html、/pd/1659496.html、/ai/1648500.html等.;
  總共有10多個(gè)類(lèi)別,最大數量為1,660,079,超過(guò)160萬(wàn)。如果每個(gè)類(lèi)別產(chǎn)生超過(guò)160萬(wàn)個(gè)鏈接,去鏈接審核工具進(jìn)行審核,可能需要十天以上的時(shí)間來(lái)審核鏈接;
  這種方法是行不通的,需要一個(gè)新的方法:網(wǎng)站提供了一個(gè)方便的通道——列表頁(yè),通過(guò)它可以獲得整個(gè)列表的鏈接。
  使用這種方法,從十幾天,這個(gè)步驟可以縮短到幾個(gè)小時(shí)。
  
  二:確定約束條件,根據約束條件改進(jìn)流程
  在得到鏈接之前,我做了一個(gè)計算,有幾萬(wàn)條文章,而文章下的評論就更多了;
  該工具的數據導出限制為 10,000 條。這次真的要花錢(qián)升級嗎?
  又想到一句話(huà):帶枷鎖跳舞,不帶枷鎖跳舞不是技巧,帶枷鎖跳舞是技巧。
  最近一直在思考一個(gè)基本的二元關(guān)系問(wèn)題:A和B之間有多少條路徑?
  對初步思考的回答:A和B之間至少有兩條路徑:AB和BA。
  這說(shuō)明了這樣一個(gè)事實(shí),即兩件事之間必須有兩條路徑,并且除了常規路徑之外至少還有一條其他路徑。
  把這個(gè)結論應用到限定條件上,那么解決問(wèn)題的路徑至少有兩條:
  1:常規路徑:需求(自身)不變,(環(huán)境)極限擴大,極限適應需求;
  2:反向路徑:限制(環(huán)境)不變,壓縮(自己)需求,使需求適應限制;
  第二條反向路徑為解決問(wèn)題帶來(lái)了新的視角,為流程演化建立了新的理論基礎。
  原來(lái)的流程是:
  獲取鏈接—>導出鏈接(限制出現1)—>重新導入—>評論抓取—>導出評論(限制出現2)—>本地過(guò)濾。
  第一個(gè)改進(jìn):重新定義需求,細化獲取環(huán)節:
  其實(shí)第二階段需要的不是任何文章,而是帶注釋的文章(沒(méi)有注釋就不用搶注釋了),在初始條件上加上細化條件提前過(guò)濾,一下子把鏈接數減少了三分之一。
  新流程:獲取精確鏈接—>導出鏈接(限制1)的位置—>重新導入—>評論捕獲—>導出評論(限制2)的位置—>本地過(guò)濾。
  第二次改進(jìn):將新的認識應用到大局中,在第二階段增加細化條件;
  不是所有的評論都要被抓,而是收錄公眾號或微信賬號的評論。
  新流程:獲取精準鏈接—>導出鏈接(限制1)的位置—>重新導入—>準確抓取評論—>導出評論(限制2)的位置—>本地過(guò)濾。
  第三次改進(jìn):合并和推進(jìn)流程
  我在中間去了一次洗手間,洗手間做得很好。在其中,我想到了兩個(gè)過(guò)程。為什么要把這兩個(gè)進(jìn)程分開(kāi)?
  這兩個(gè)階段是一個(gè)連續的過(guò)程,如果這些過(guò)程可以合并,第一階段的限制就會(huì )消失。
  這說(shuō)明除了適應約束之外,還可以選擇合理地調整流程以消除或跳過(guò)約束。
  將兩個(gè)流程合二為一后,新流程:獲取精準鏈接—>準確抓取評論—>導出評論(限制位置2)—>本地過(guò)濾。
  由于重新定義了兩階段要求,最終出口數據中只剩下有意義的部分。
  這個(gè)改進(jìn)過(guò)程也讓我發(fā)現了一個(gè)優(yōu)化的關(guān)鍵點(diǎn):在設計過(guò)程時(shí),結合約束,用約束激發(fā)深度優(yōu)化。
  最終得到了我想要的數據,結果發(fā)現約束不是敵人,約束是持續創(chuàng )新的重要條件。
  這一發(fā)現也為創(chuàng )新開(kāi)辟了一種新的思維方式:自我強加的限制,沒(méi)有限制創(chuàng )造限制。就像這個(gè)文章,本來(lái)是不打算寫(xiě)的,但是我給自己設計了一個(gè)新的限制:把事情做完,從實(shí)踐到總結,就完成了。
  
  在過(guò)濾數據時(shí),我有點(diǎn)氣餒。評論數據是非結構化的,很難快速過(guò)濾此類(lèi)數據。這也讓我有了一個(gè)新的發(fā)現:數據的價(jià)值取決于結構的程度。結構化數據很少。既然如此,與其捕獲雜亂無(wú)章的數據,事后對其進(jìn)行結構化,不如在初始設計中建立結構化的數據捕獲過(guò)程。
  
  結束了嗎?確實(shí)是時(shí)候結束了,本來(lái)預定的數據已經(jīng)拿到了;
  但這并沒(méi)有結束,甚至真正的困難才剛剛開(kāi)始,所以這是一個(gè)意外。
  三:搶公眾號,重新整理全站內容;
  一邊抓著(zhù)上面的微信,一邊也隔出了一部分公眾號,很少。如果能得到更多的公眾號,或許可以做一個(gè)專(zhuān)門(mén)的頁(yè)面來(lái)提供一個(gè)服務(wù),也就是集成即服務(wù)。該方法的效果很差,需要更高效的采集方法;
  我想還有一個(gè)地方也會(huì )放公眾號,每個(gè)文章底部的作者介紹部分:
  
  如果能夠獲取大量數據,就可以形成公眾賬戶(hù)矩陣。據我所知,沒(méi)有這樣的信息庫,信息集中對用戶(hù)也很有價(jià)值;
  準備開(kāi)始抓取,遇到了第一個(gè)難點(diǎn):文章內容很多,如何定位要抓取的對象?
  定位要抓拍的物體有一個(gè)竅門(mén):分析物體的特征,尤其是獨特的特征,通過(guò)獨特的特征準確識別;比如這次要抓的對象是一個(gè)公眾號,而這三個(gè)詞在文章中也經(jīng)常出現,但是出現在文章中的時(shí)候一般不會(huì )跟a : 符號,僅在作者介紹時(shí)才收錄,這是關(guān)鍵特性。
  第一個(gè)改進(jìn):多角度觀(guān)察數據,增加要捕獲的數據類(lèi)型;
  這是一個(gè)非常偶然的想法。我想著(zhù)數據可能可以供官方參考,然后又想到了大家官方需要的數據格式。然后我想到了一個(gè)新的需求場(chǎng)景:如果提供給用戶(hù),用戶(hù)面對的是數據。數據應該如何使用?
  三個(gè)角色:我、用戶(hù)和人人官方。每個(gè)角色需要不同的數據并使用不同的方法。比如我只需要公眾號,用戶(hù)需要更多數據。用戶(hù)將希望執行一些過(guò)濾,以便他們可以找到適合您自己的公共帳戶(hù)。
  
  第二個(gè)改進(jìn):增加輔助判斷條件;
  在爬取中,我們遇到了一個(gè)問(wèn)題:如果沒(méi)有符合設定條件的數據,數據就會(huì )留空。這類(lèi)數據需要丟棄(否則會(huì )占用導出索引)。為了丟棄數據,必須對數據進(jìn)行處理。判斷,進(jìn)行判斷,數據不能為空;
  這里有一個(gè)矛盾或沖突:需要刪除空數據,但只能刪除非空數據;終于找到了一個(gè)辦法:給所有數據加上一個(gè)固定的前綴——delete,這樣無(wú)論數據是否為空,最終都不會(huì )為空;
  比如兩條數據:一條數據為空,需要刪除,加上前綴后,數據變?yōu)椋篸elete;數據B數據不為空,加前綴后數據變?yōu)閯h除+原創(chuàng )數據;要確定哪些數據只收錄刪除,您可以丟棄,因為只有空數據將只收錄添加的前綴。
  
  這種方法是excel中的一個(gè)技巧:當數據本身難以判斷時(shí),加一列輔助判斷,讓具有相同特征的選項轉化為易于識別的數據;如A/A/B/B/C/D,需要確定哪些重復項單獨列出。因為A/B不同,無(wú)法實(shí)現排序。這時(shí)候可以添加一個(gè)單獨的輔助判斷列,將重復項轉換為1,不重復項轉換為0,然后對新列進(jìn)行排序。
  在最后一頁(yè),我也使用了這個(gè)技巧,通過(guò)在未認證的前面加上前綴A,讓未認證的在排序的時(shí)候總是排成一行。
  第三項改進(jìn):增加精準判斷條件;
  由于我不是程序員,對程序了解不多,無(wú)法準確判斷代碼的含義,這就帶來(lái)了一個(gè)問(wèn)題:不知道代碼是否能完全達到目的,同時(shí)處理一些邊緣情況;
  在第一次數據捕獲后,我們發(fā)現了這樣一種情況:當數據中收錄-等符號時(shí),捕獲會(huì )被中斷。很多公眾號都收錄-符號,結果只抓到一半,比如lmh-china,只會(huì )抓lmh。
  這是一個(gè)超出我能力的改進(jìn),所以我準備手動(dòng)修改,但是接近1000個(gè)公眾號,效率太低,如果你能改進(jìn)爬取過(guò)程并修復這個(gè)問(wèn)題,那么你可以重新爬取再次使用正確的數據,我決定試一試。
  最終,我添加了結束條件(正則表達式),必須遇到,或者。會(huì )結束,遇到其他符號也不會(huì )結束。
  這并不意味著(zhù)我可以編寫(xiě)代碼。該工具提供了一個(gè)工具來(lái)幫助生成正則表達式。然后我在互聯(lián)網(wǎng)上搜索答案以找到可能的答案,并不斷嘗試成功。
  PS:寫(xiě)這篇文章的時(shí)候,又查了一遍資料,發(fā)現上次修改沒(méi)有生效,還是老流程。我必須確認未來(lái)的重要步驟,以確認我在做正確的事情。
  改進(jìn)之四:進(jìn)行下一步,從實(shí)際場(chǎng)景中觀(guān)察數據;
  抓數據的時(shí)候想,可能需要一個(gè)地方放數據,這樣方便查看,一張簡(jiǎn)單的表就夠了,還需要排序,這樣就可以根據自己的需要進(jìn)行排序了;
  找了幾個(gè)插件,最后選擇了一個(gè)簡(jiǎn)單的頁(yè)面,經(jīng)過(guò)測試,符合我的要求;
  
  這次提前操作數據讓我決定再次添加一個(gè)數據類(lèi)型,添加一個(gè)經(jīng)過(guò)認證的數據類(lèi)型。人人網(wǎng)網(wǎng)站擁有各類(lèi)認證。添加新的排序字段對用戶(hù)有好處,可以讓我排除官方用戶(hù),排除官方用戶(hù)意味著(zhù)排除非貢獻者的公共賬戶(hù)。
  這些官方發(fā)布的文章中的公眾號是官方轉載的來(lái)源,也很有價(jià)值;它們可以制成單獨的頁(yè)面。
  改進(jìn)之五:試用公共CDN地址查找bug;
  由于所有網(wǎng)頁(yè)都使用開(kāi)源程序,我可以將本地的css和js改成免費的CDN地址,速度更快,節省帶寬;國內外有一些服務(wù)為開(kāi)源程序提供免費CDN,如/,合理節省使用成本;
  
  在不斷測試的過(guò)程中,突然發(fā)現了一個(gè)致命的bug:排序錯誤,這個(gè)bug一下子讓我陷入了深淵。如果存在此錯誤,那么對用戶(hù)最有意義的功能將失?。?br />   
  我沒(méi)有修復錯誤的能力,但我想到了一些可能性。作為一個(gè)開(kāi)源程序,按理說(shuō)這樣明顯的排序bug肯定會(huì )被修復。頁(yè)面使用的版本比較舊。這是原因嗎?
  我去CDN找了最新版本,頁(yè)面直接崩潰了;回去找了個(gè)中間版本,bug修復了,原來(lái)是程序版本問(wèn)題。
  這個(gè)修訂過(guò)程教會(huì )了我一個(gè)反向精益思想:從后到前改進(jìn),提前驗證整個(gè)過(guò)程,如果可能的話(huà),把整個(gè)過(guò)程,特別是還沒(méi)有達到的過(guò)程,并努力做到在少量數據的支持下。實(shí)際場(chǎng)景模擬,去模擬場(chǎng)景看看,這個(gè)模擬有利于整個(gè)過(guò)程的改進(jìn),場(chǎng)景中的思維可以反饋到整個(gè)過(guò)程的改進(jìn)。
  改進(jìn)之六:增加公眾號查詢(xún);
  看了幾個(gè)公眾號,發(fā)現很多公眾號已經(jīng)不存在或者沒(méi)有更新。如果能提供一個(gè)新的篩選維度,讓用戶(hù)可以直接看到公眾號的更新,這個(gè)數據會(huì )更有價(jià)值;
  我知道搜狗搜索提供了微信搜外,我開(kāi)始嘗試爬取搜狗搜索,但是搜狗搜索的反爬蟲(chóng)規則太嚴格了。
  這個(gè)想法失敗了,但我可以提供一個(gè)折衷方案:點(diǎn)擊直接查詢(xún);
  檢查搜狗搜索的鏈接規則后,生成所有公眾號對應的查詢(xún)鏈接。
  
  最終頁(yè)面如下所示:
  
  您可以在頁(yè)面內搜索并按列排序。
  我將頁(yè)面上傳到服務(wù)器,頁(yè)面地址:open.skyfollowsnow.pro/special/woshipm-author/。
  您可以在此處查看本次抓取中使用的工具和知識:open.skyfollowsnow.pro/?thread-55.htm。
  第七項改進(jìn):統一修改位置;
  將文件上傳到服務(wù)器后,我犯了一個(gè)明顯的錯誤:在服務(wù)器中修改文檔,很多修改必須在本地,于是出現了一個(gè)新問(wèn)題:有些東西是在服務(wù)器上修改的,有些東西是在本地修改的,文件兩端不一致;
  雖小,但也是很實(shí)用的一課:統一修改位置,避免協(xié)作時(shí)起點(diǎn)不一致。
  其他:
  在本次爬取中,使用了兩種新的方法來(lái)解決兩個(gè)問(wèn)題:
  1:解決json數據中a標簽不被解析的問(wèn)題;
  作者ID和空格鏈接本來(lái)是兩列,但是我以為可以合并,但是一旦合并就會(huì )報錯,然后我以為我看到了一個(gè)用\符號隔開(kāi)的程序”,于是試了一下,確實(shí)如此。
  2:解決excel列過(guò)多時(shí)合并容易出錯的問(wèn)題;
  最后合并成需要的數據時(shí),需要合并的項很多,很容易發(fā)現順序不對。為了一次性看到所有列的選項,我使用了一個(gè)新工具:桌面紋理工具 Snipaste,這也是我之前見(jiàn)過(guò)的。程序使用的工具正好解決了這個(gè)問(wèn)題:
  
  
  平時(shí)看到新事物的時(shí)候要有點(diǎn)好奇,需要的時(shí)候可能會(huì )想到。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(產(chǎn)品經(jīng)理網(wǎng)站結構比較簡(jiǎn)單的翻太慢錯的方法有哪些)
  再次重申:我不是程序員,也沒(méi)有涉及代碼。當頁(yè)面被修改時(shí),我只涉及復制和粘貼。
  要去給朋友圈添點(diǎn)專(zhuān)業(yè)氣息,需要添加一些新的微信ID;
  在哪里可以找到專(zhuān)業(yè)的微信賬號?
  想著(zhù)大家都是產(chǎn)品經(jīng)理,我看到傳播者在文章下的評論里留下微信,但是每個(gè)文章的翻譯太慢了,也許你可以用一個(gè)工具把所有的評論發(fā)到抓住它進(jìn)行過(guò)濾。
  網(wǎng)站結構比較簡(jiǎn)單,這個(gè)應該是簡(jiǎn)單的抓取,到最后會(huì )發(fā)現自己錯了。
  以下簡(jiǎn)稱(chēng)人人為產(chǎn)品經(jīng)理網(wǎng)站;
  上一篇文章中已經(jīng)詳細介紹了常規爬取的過(guò)程,重復部分本文不再贅述;
  思考過(guò)程:如果有需求,找到需求對應的信息,找到信息對應的位置,找到位置對應的工具,找到工具對應的功能或技能。
  一:換算法,使用更準確的方法;
  上一篇文章介紹了一種生成鏈接的方法,大家準備用同樣的方法再做一遍;
  然后遇到第一個(gè)難點(diǎn):大家的鏈接結構不統一,比如:/pmd/1660079.html、/pd/1659496.html、/ai/1648500.html等.;
  總共有10多個(gè)類(lèi)別,最大數量為1,660,079,超過(guò)160萬(wàn)。如果每個(gè)類(lèi)別產(chǎn)生超過(guò)160萬(wàn)個(gè)鏈接,去鏈接審核工具進(jìn)行審核,可能需要十天以上的時(shí)間來(lái)審核鏈接;
  這種方法是行不通的,需要一個(gè)新的方法:網(wǎng)站提供了一個(gè)方便的通道——列表頁(yè),通過(guò)它可以獲得整個(gè)列表的鏈接。
  使用這種方法,從十幾天,這個(gè)步驟可以縮短到幾個(gè)小時(shí)。
  
  二:確定約束條件,根據約束條件改進(jìn)流程
  在得到鏈接之前,我做了一個(gè)計算,有幾萬(wàn)條文章,而文章下的評論就更多了;
  該工具的數據導出限制為 10,000 條。這次真的要花錢(qián)升級嗎?
  又想到一句話(huà):帶枷鎖跳舞,不帶枷鎖跳舞不是技巧,帶枷鎖跳舞是技巧。
  最近一直在思考一個(gè)基本的二元關(guān)系問(wèn)題:A和B之間有多少條路徑?
  對初步思考的回答:A和B之間至少有兩條路徑:AB和BA。
  這說(shuō)明了這樣一個(gè)事實(shí),即兩件事之間必須有兩條路徑,并且除了常規路徑之外至少還有一條其他路徑。
  把這個(gè)結論應用到限定條件上,那么解決問(wèn)題的路徑至少有兩條:
  1:常規路徑:需求(自身)不變,(環(huán)境)極限擴大,極限適應需求;
  2:反向路徑:限制(環(huán)境)不變,壓縮(自己)需求,使需求適應限制;
  第二條反向路徑為解決問(wèn)題帶來(lái)了新的視角,為流程演化建立了新的理論基礎。
  原來(lái)的流程是:
  獲取鏈接—>導出鏈接(限制出現1)—>重新導入—>評論抓取—>導出評論(限制出現2)—>本地過(guò)濾。
  第一個(gè)改進(jìn):重新定義需求,細化獲取環(huán)節:
  其實(shí)第二階段需要的不是任何文章,而是帶注釋的文章(沒(méi)有注釋就不用搶注釋了),在初始條件上加上細化條件提前過(guò)濾,一下子把鏈接數減少了三分之一。
  新流程:獲取精確鏈接—>導出鏈接(限制1)的位置—>重新導入—>評論捕獲—>導出評論(限制2)的位置—>本地過(guò)濾。
  第二次改進(jìn):將新的認識應用到大局中,在第二階段增加細化條件;
  不是所有的評論都要被抓,而是收錄公眾號或微信賬號的評論。
  新流程:獲取精準鏈接—>導出鏈接(限制1)的位置—>重新導入—>準確抓取評論—>導出評論(限制2)的位置—>本地過(guò)濾。
  第三次改進(jìn):合并和推進(jìn)流程
  我在中間去了一次洗手間,洗手間做得很好。在其中,我想到了兩個(gè)過(guò)程。為什么要把這兩個(gè)進(jìn)程分開(kāi)?
  這兩個(gè)階段是一個(gè)連續的過(guò)程,如果這些過(guò)程可以合并,第一階段的限制就會(huì )消失。
  這說(shuō)明除了適應約束之外,還可以選擇合理地調整流程以消除或跳過(guò)約束。
  將兩個(gè)流程合二為一后,新流程:獲取精準鏈接—>準確抓取評論—>導出評論(限制位置2)—>本地過(guò)濾。
  由于重新定義了兩階段要求,最終出口數據中只剩下有意義的部分。
  這個(gè)改進(jìn)過(guò)程也讓我發(fā)現了一個(gè)優(yōu)化的關(guān)鍵點(diǎn):在設計過(guò)程時(shí),結合約束,用約束激發(fā)深度優(yōu)化。
  最終得到了我想要的數據,結果發(fā)現約束不是敵人,約束是持續創(chuàng )新的重要條件。
  這一發(fā)現也為創(chuàng )新開(kāi)辟了一種新的思維方式:自我強加的限制,沒(méi)有限制創(chuàng )造限制。就像這個(gè)文章,本來(lái)是不打算寫(xiě)的,但是我給自己設計了一個(gè)新的限制:把事情做完,從實(shí)踐到總結,就完成了。
  
  在過(guò)濾數據時(shí),我有點(diǎn)氣餒。評論數據是非結構化的,很難快速過(guò)濾此類(lèi)數據。這也讓我有了一個(gè)新的發(fā)現:數據的價(jià)值取決于結構的程度。結構化數據很少。既然如此,與其捕獲雜亂無(wú)章的數據,事后對其進(jìn)行結構化,不如在初始設計中建立結構化的數據捕獲過(guò)程。
  
  結束了嗎?確實(shí)是時(shí)候結束了,本來(lái)預定的數據已經(jīng)拿到了;
  但這并沒(méi)有結束,甚至真正的困難才剛剛開(kāi)始,所以這是一個(gè)意外。
  三:搶公眾號,重新整理全站內容;
  一邊抓著(zhù)上面的微信,一邊也隔出了一部分公眾號,很少。如果能得到更多的公眾號,或許可以做一個(gè)專(zhuān)門(mén)的頁(yè)面來(lái)提供一個(gè)服務(wù),也就是集成即服務(wù)。該方法的效果很差,需要更高效的采集方法;
  我想還有一個(gè)地方也會(huì )放公眾號,每個(gè)文章底部的作者介紹部分:
  
  如果能夠獲取大量數據,就可以形成公眾賬戶(hù)矩陣。據我所知,沒(méi)有這樣的信息庫,信息集中對用戶(hù)也很有價(jià)值;
  準備開(kāi)始抓取,遇到了第一個(gè)難點(diǎn):文章內容很多,如何定位要抓取的對象?
  定位要抓拍的物體有一個(gè)竅門(mén):分析物體的特征,尤其是獨特的特征,通過(guò)獨特的特征準確識別;比如這次要抓的對象是一個(gè)公眾號,而這三個(gè)詞在文章中也經(jīng)常出現,但是出現在文章中的時(shí)候一般不會(huì )跟a : 符號,僅在作者介紹時(shí)才收錄,這是關(guān)鍵特性。
  第一個(gè)改進(jìn):多角度觀(guān)察數據,增加要捕獲的數據類(lèi)型;
  這是一個(gè)非常偶然的想法。我想著(zhù)數據可能可以供官方參考,然后又想到了大家官方需要的數據格式。然后我想到了一個(gè)新的需求場(chǎng)景:如果提供給用戶(hù),用戶(hù)面對的是數據。數據應該如何使用?
  三個(gè)角色:我、用戶(hù)和人人官方。每個(gè)角色需要不同的數據并使用不同的方法。比如我只需要公眾號,用戶(hù)需要更多數據。用戶(hù)將希望執行一些過(guò)濾,以便他們可以找到適合您自己的公共帳戶(hù)。
  
  第二個(gè)改進(jìn):增加輔助判斷條件;
  在爬取中,我們遇到了一個(gè)問(wèn)題:如果沒(méi)有符合設定條件的數據,數據就會(huì )留空。這類(lèi)數據需要丟棄(否則會(huì )占用導出索引)。為了丟棄數據,必須對數據進(jìn)行處理。判斷,進(jìn)行判斷,數據不能為空;
  這里有一個(gè)矛盾或沖突:需要刪除空數據,但只能刪除非空數據;終于找到了一個(gè)辦法:給所有數據加上一個(gè)固定的前綴——delete,這樣無(wú)論數據是否為空,最終都不會(huì )為空;
  比如兩條數據:一條數據為空,需要刪除,加上前綴后,數據變?yōu)椋篸elete;數據B數據不為空,加前綴后數據變?yōu)閯h除+原創(chuàng )數據;要確定哪些數據只收錄刪除,您可以丟棄,因為只有空數據將只收錄添加的前綴。
  
  這種方法是excel中的一個(gè)技巧:當數據本身難以判斷時(shí),加一列輔助判斷,讓具有相同特征的選項轉化為易于識別的數據;如A/A/B/B/C/D,需要確定哪些重復項單獨列出。因為A/B不同,無(wú)法實(shí)現排序。這時(shí)候可以添加一個(gè)單獨的輔助判斷列,將重復項轉換為1,不重復項轉換為0,然后對新列進(jìn)行排序。
  在最后一頁(yè),我也使用了這個(gè)技巧,通過(guò)在未認證的前面加上前綴A,讓未認證的在排序的時(shí)候總是排成一行。
  第三項改進(jìn):增加精準判斷條件;
  由于我不是程序員,對程序了解不多,無(wú)法準確判斷代碼的含義,這就帶來(lái)了一個(gè)問(wèn)題:不知道代碼是否能完全達到目的,同時(shí)處理一些邊緣情況;
  在第一次數據捕獲后,我們發(fā)現了這樣一種情況:當數據中收錄-等符號時(shí),捕獲會(huì )被中斷。很多公眾號都收錄-符號,結果只抓到一半,比如lmh-china,只會(huì )抓lmh。
  這是一個(gè)超出我能力的改進(jìn),所以我準備手動(dòng)修改,但是接近1000個(gè)公眾號,效率太低,如果你能改進(jìn)爬取過(guò)程并修復這個(gè)問(wèn)題,那么你可以重新爬取再次使用正確的數據,我決定試一試。
  最終,我添加了結束條件(正則表達式),必須遇到,或者。會(huì )結束,遇到其他符號也不會(huì )結束。
  這并不意味著(zhù)我可以編寫(xiě)代碼。該工具提供了一個(gè)工具來(lái)幫助生成正則表達式。然后我在互聯(lián)網(wǎng)上搜索答案以找到可能的答案,并不斷嘗試成功。
  PS:寫(xiě)這篇文章的時(shí)候,又查了一遍資料,發(fā)現上次修改沒(méi)有生效,還是老流程。我必須確認未來(lái)的重要步驟,以確認我在做正確的事情。
  改進(jìn)之四:進(jìn)行下一步,從實(shí)際場(chǎng)景中觀(guān)察數據;
  抓數據的時(shí)候想,可能需要一個(gè)地方放數據,這樣方便查看,一張簡(jiǎn)單的表就夠了,還需要排序,這樣就可以根據自己的需要進(jìn)行排序了;
  找了幾個(gè)插件,最后選擇了一個(gè)簡(jiǎn)單的頁(yè)面,經(jīng)過(guò)測試,符合我的要求;
  
  這次提前操作數據讓我決定再次添加一個(gè)數據類(lèi)型,添加一個(gè)經(jīng)過(guò)認證的數據類(lèi)型。人人網(wǎng)網(wǎng)站擁有各類(lèi)認證。添加新的排序字段對用戶(hù)有好處,可以讓我排除官方用戶(hù),排除官方用戶(hù)意味著(zhù)排除非貢獻者的公共賬戶(hù)。
  這些官方發(fā)布的文章中的公眾號是官方轉載的來(lái)源,也很有價(jià)值;它們可以制成單獨的頁(yè)面。
  改進(jìn)之五:試用公共CDN地址查找bug;
  由于所有網(wǎng)頁(yè)都使用開(kāi)源程序,我可以將本地的css和js改成免費的CDN地址,速度更快,節省帶寬;國內外有一些服務(wù)為開(kāi)源程序提供免費CDN,如/,合理節省使用成本;
  
  在不斷測試的過(guò)程中,突然發(fā)現了一個(gè)致命的bug:排序錯誤,這個(gè)bug一下子讓我陷入了深淵。如果存在此錯誤,那么對用戶(hù)最有意義的功能將失?。?br />   
  我沒(méi)有修復錯誤的能力,但我想到了一些可能性。作為一個(gè)開(kāi)源程序,按理說(shuō)這樣明顯的排序bug肯定會(huì )被修復。頁(yè)面使用的版本比較舊。這是原因嗎?
  我去CDN找了最新版本,頁(yè)面直接崩潰了;回去找了個(gè)中間版本,bug修復了,原來(lái)是程序版本問(wèn)題。
  這個(gè)修訂過(guò)程教會(huì )了我一個(gè)反向精益思想:從后到前改進(jìn),提前驗證整個(gè)過(guò)程,如果可能的話(huà),把整個(gè)過(guò)程,特別是還沒(méi)有達到的過(guò)程,并努力做到在少量數據的支持下。實(shí)際場(chǎng)景模擬,去模擬場(chǎng)景看看,這個(gè)模擬有利于整個(gè)過(guò)程的改進(jìn),場(chǎng)景中的思維可以反饋到整個(gè)過(guò)程的改進(jìn)。
  改進(jìn)之六:增加公眾號查詢(xún);
  看了幾個(gè)公眾號,發(fā)現很多公眾號已經(jīng)不存在或者沒(méi)有更新。如果能提供一個(gè)新的篩選維度,讓用戶(hù)可以直接看到公眾號的更新,這個(gè)數據會(huì )更有價(jià)值;
  我知道搜狗搜索提供了微信搜外,我開(kāi)始嘗試爬取搜狗搜索,但是搜狗搜索的反爬蟲(chóng)規則太嚴格了。
  這個(gè)想法失敗了,但我可以提供一個(gè)折衷方案:點(diǎn)擊直接查詢(xún);
  檢查搜狗搜索的鏈接規則后,生成所有公眾號對應的查詢(xún)鏈接。
  
  最終頁(yè)面如下所示:
  
  您可以在頁(yè)面內搜索并按列排序。
  我將頁(yè)面上傳到服務(wù)器,頁(yè)面地址:open.skyfollowsnow.pro/special/woshipm-author/。
  您可以在此處查看本次抓取中使用的工具和知識:open.skyfollowsnow.pro/?thread-55.htm。
  第七項改進(jìn):統一修改位置;
  將文件上傳到服務(wù)器后,我犯了一個(gè)明顯的錯誤:在服務(wù)器中修改文檔,很多修改必須在本地,于是出現了一個(gè)新問(wèn)題:有些東西是在服務(wù)器上修改的,有些東西是在本地修改的,文件兩端不一致;
  雖小,但也是很實(shí)用的一課:統一修改位置,避免協(xié)作時(shí)起點(diǎn)不一致。
  其他:
  在本次爬取中,使用了兩種新的方法來(lái)解決兩個(gè)問(wèn)題:
  1:解決json數據中a標簽不被解析的問(wèn)題;
  作者ID和空格鏈接本來(lái)是兩列,但是我以為可以合并,但是一旦合并就會(huì )報錯,然后我以為我看到了一個(gè)用\符號隔開(kāi)的程序”,于是試了一下,確實(shí)如此。
  2:解決excel列過(guò)多時(shí)合并容易出錯的問(wèn)題;
  最后合并成需要的數據時(shí),需要合并的項很多,很容易發(fā)現順序不對。為了一次性看到所有列的選項,我使用了一個(gè)新工具:桌面紋理工具 Snipaste,這也是我之前見(jiàn)過(guò)的。程序使用的工具正好解決了這個(gè)問(wèn)題:
  
  
  平時(shí)看到新事物的時(shí)候要有點(diǎn)好奇,需要的時(shí)候可能會(huì )想到。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構環(huán)境?)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-01-12 04:14 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構環(huán)境?)
  萬(wàn)維網(wǎng)的大量信息、股票報價(jià)、電影評論、市場(chǎng)價(jià)格趨勢主題以及幾乎所有內容都可以通過(guò)單擊按鈕找到。在分析數據的過(guò)程中,發(fā)現很多SAS用戶(hù)對網(wǎng)絡(luò )很感興趣,但是你獲取這些數據的SAS環(huán)境呢?有很多方法,例如設計自己的網(wǎng)絡(luò )爬蟲(chóng)或利用 SAS %TMFILTER 文本挖掘的 SAS 數據步驟中的代碼。在本文中,我們將回顧網(wǎng)絡(luò )爬蟲(chóng)的一般架構。我們將討論將 網(wǎng)站 信息導入 SAS 的方法,并在內部查看來(lái)自名為 SAS Search 的實(shí)驗項目的實(shí)驗代碼管道。我們還將提供有關(guān)如何輕松自定義網(wǎng)絡(luò )爬蟲(chóng)以滿(mǎn)足個(gè)人需求以及如何將特定數據導入 SAS Miner 的建議。介紹:互聯(lián)網(wǎng)已成為有用的信息來(lái)源。通常是網(wǎng)絡(luò )上的數據,我們想在SAS內部使用,所以我們需要想辦法獲取這些數據。最好的方法是使用網(wǎng)絡(luò )爬蟲(chóng)。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。
  首先,了解網(wǎng)絡(luò )爬蟲(chóng)的工作原理很重要。在繼續之前,您應該熟悉數據步驟代碼、宏和 SAS 過(guò)程 PROC SQL。網(wǎng)絡(luò )爬蟲(chóng)概述:網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)程序,具有一個(gè)或多個(gè)起始地址作為“種子 URL”,它下載與這些 URL 關(guān)聯(lián)的網(wǎng)頁(yè),提取網(wǎng)頁(yè)中收錄的任何超鏈接,并以遞歸方式繼續這些超鏈接標識下載網(wǎng)頁(yè)。從概念上講,網(wǎng)絡(luò )爬蟲(chóng)很簡(jiǎn)單。網(wǎng)絡(luò )爬蟲(chóng)有四個(gè)職責: 1. 從候選者中選擇一個(gè) URL。2. 下載相關(guān)的 Web 3. 提取網(wǎng)頁(yè)中的 URL(超鏈接)。4. 補充了未遇到的URLs候選集方法1:WEB SAS數據步爬蟲(chóng)中的代碼首先創(chuàng )建了一個(gè)網(wǎng)站網(wǎng)絡(luò )爬蟲(chóng)將啟動(dòng)的URL列表。數據工作.links_to_crawl;長(cháng)度 url $256 inputurl 數據線(xiàn);運行 為確保我們不會(huì )多次抓取同一個(gè) URL,已使用該鏈接創(chuàng )建了數據抓取。當 web 數據集一開(kāi)始是空的,但是一個(gè) 網(wǎng)站 URL 將被添加到數據集爬蟲(chóng)完成對 網(wǎng)站 的爬取。數據work.links_crawled;網(wǎng)址長(cháng)度 256 美元;跑; 現在我們開(kāi)始爬行!此代碼需要我們的 work.links_to_crawl 數據集的第一個(gè) URL。
  在第一個(gè)觀(guān)察“_N_Formula 1”中,URL 被放入一個(gè)名為 next_url 的宏變量中,所有剩余的 URL 都被放回我們的種子 URL 數據集中,以使其在未來(lái)的迭代中可用。nexturl 關(guān)閉 %letnext_url datawork.links_to_crawl; 設置 work.links_to_crawl;callymput("next_url", url); 否則輸出;跑; 現在,從互聯(lián)網(wǎng)上下載網(wǎng)址。創(chuàng )建一個(gè)文件名 _nexturl。我們讓 SAS 知道這是一個(gè) URL,并且可以找到 AT&next_url,這是我們的宏變量,其中收錄我們從 work.links_to_crawl 數據集中提取的 URL。filename_nexturl url "&next_url" 創(chuàng )建一個(gè)對文件名的 URL 引用,它決定了放置我們下載文件的位置。創(chuàng )建另一個(gè)引用文件名的條目,稱(chēng)為 htmlfilm,并將從 url_file.html 采集的信息放在那里。
  查找更多 urls datawork._urls(keep=url); 長(cháng)度 url $256 filehtmlfile; infile _nexturl 長(cháng)度=len;輸入文本 $varying2000. len; 放文字;起始長(cháng)度(文本);使用正則表達式 網(wǎng)站 URL 來(lái)幫助搜索。文本字符串的正則表達式匹配方法,例如單詞、單詞或字符模式。SAS 已經(jīng)提供了許多強大的字符串功能。但是,正則表達式通常提供了一種更簡(jiǎn)潔的方式來(lái)處理和匹配文本。做;保留patternID; pattern '/href=”([^"]+)”/i';patternID prxparse(pattern);end 首先觀(guān)察到,創(chuàng )建 patternID 將使整個(gè)數據步驟保持運行。要查找的模式是:“/href= "([^"]+)"/i'"., 表示我們在尋找字符串 "HREF purpose" 表示使用不區分大小寫(xiě)的方法來(lái)匹配我們的正則表達式。
  PRXNEXT 有五個(gè)參數:我們要查找的正則表達式,開(kāi)始查找正則表達式的開(kāi)始位置,停止正則表達式的結束位置,字符串中一旦找到的位置,以及字符串的長(cháng)度,如果找到的位置將如果未找到字符串,則為 0。PRXNEXT 還更改了 start 參數,以便在找到最后一個(gè)匹配項后重新開(kāi)始搜索。調用 prxnext(patternID, start, stop, text, position, length); 代碼中的循環(huán),顯示在 網(wǎng)站 上的所有鏈接的文本。do while (position substr(text,position+6, length-7); output; call prxnext(patternID, start, stop, text, position, length); end; run; 如果代碼找到一個(gè) URL,它will 檢索在第一個(gè)引號之后開(kāi)始的 URL 的唯一部分。例如,如果代碼找到 href="",那么它應該保存。使用 substr 從 URL 的其余部分中刪除前 6 個(gè)字符和最后一個(gè)字符 work._urls 數據集的輸出?,F在,我們插入 URL 代碼只是為了跟蹤抓取到我們已經(jīng)擁有的名為 work.links_crawled 的數據集,并確保我們不再瀏覽那里。
  currentlink urls我們已經(jīng)爬取了datawork._old_link;網(wǎng)址“&next_url”;運行;proc append base=work.links_crawled data=work._old_link force;跑; 確保: 1. 我們還沒(méi)有抓取它們,也就是說(shuō) URL 不在 work.links_crawled 中)。2.我們沒(méi)有排隊的url進(jìn)行爬?。磚rl不在work.links_to_crawl只添加url我們已經(jīng)爬過(guò)queuedup procsql noprint;創(chuàng )建表work._append selecturl from work._urls where url (selecturl from work.links_crawled) (selecturl from work .links_to_crawl); quit; 然后,我們添加尚未被爬取的 URL,尚未排隊 work.links_to_crawl addnew links procappend base=work.links_to_crawl data=work._append force; run; 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構環(huán)境?)
  萬(wàn)維網(wǎng)的大量信息、股票報價(jià)、電影評論、市場(chǎng)價(jià)格趨勢主題以及幾乎所有內容都可以通過(guò)單擊按鈕找到。在分析數據的過(guò)程中,發(fā)現很多SAS用戶(hù)對網(wǎng)絡(luò )很感興趣,但是你獲取這些數據的SAS環(huán)境呢?有很多方法,例如設計自己的網(wǎng)絡(luò )爬蟲(chóng)或利用 SAS %TMFILTER 文本挖掘的 SAS 數據步驟中的代碼。在本文中,我們將回顧網(wǎng)絡(luò )爬蟲(chóng)的一般架構。我們將討論將 網(wǎng)站 信息導入 SAS 的方法,并在內部查看來(lái)自名為 SAS Search 的實(shí)驗項目的實(shí)驗代碼管道。我們還將提供有關(guān)如何輕松自定義網(wǎng)絡(luò )爬蟲(chóng)以滿(mǎn)足個(gè)人需求以及如何將特定數據導入 SAS Miner 的建議。介紹:互聯(lián)網(wǎng)已成為有用的信息來(lái)源。通常是網(wǎng)絡(luò )上的數據,我們想在SAS內部使用,所以我們需要想辦法獲取這些數據。最好的方法是使用網(wǎng)絡(luò )爬蟲(chóng)。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。
  首先,了解網(wǎng)絡(luò )爬蟲(chóng)的工作原理很重要。在繼續之前,您應該熟悉數據步驟代碼、宏和 SAS 過(guò)程 PROC SQL。網(wǎng)絡(luò )爬蟲(chóng)概述:網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)程序,具有一個(gè)或多個(gè)起始地址作為“種子 URL”,它下載與這些 URL 關(guān)聯(lián)的網(wǎng)頁(yè),提取網(wǎng)頁(yè)中收錄的任何超鏈接,并以遞歸方式繼續這些超鏈接標識下載網(wǎng)頁(yè)。從概念上講,網(wǎng)絡(luò )爬蟲(chóng)很簡(jiǎn)單。網(wǎng)絡(luò )爬蟲(chóng)有四個(gè)職責: 1. 從候選者中選擇一個(gè) URL。2. 下載相關(guān)的 Web 3. 提取網(wǎng)頁(yè)中的 URL(超鏈接)。4. 補充了未遇到的URLs候選集方法1:WEB SAS數據步爬蟲(chóng)中的代碼首先創(chuàng )建了一個(gè)網(wǎng)站網(wǎng)絡(luò )爬蟲(chóng)將啟動(dòng)的URL列表。數據工作.links_to_crawl;長(cháng)度 url $256 inputurl 數據線(xiàn);運行 為確保我們不會(huì )多次抓取同一個(gè) URL,已使用該鏈接創(chuàng )建了數據抓取。當 web 數據集一開(kāi)始是空的,但是一個(gè) 網(wǎng)站 URL 將被添加到數據集爬蟲(chóng)完成對 網(wǎng)站 的爬取。數據work.links_crawled;網(wǎng)址長(cháng)度 256 美元;跑; 現在我們開(kāi)始爬行!此代碼需要我們的 work.links_to_crawl 數據集的第一個(gè) URL。
  在第一個(gè)觀(guān)察“_N_Formula 1”中,URL 被放入一個(gè)名為 next_url 的宏變量中,所有剩余的 URL 都被放回我們的種子 URL 數據集中,以使其在未來(lái)的迭代中可用。nexturl 關(guān)閉 %letnext_url datawork.links_to_crawl; 設置 work.links_to_crawl;callymput("next_url", url); 否則輸出;跑; 現在,從互聯(lián)網(wǎng)上下載網(wǎng)址。創(chuàng )建一個(gè)文件名 _nexturl。我們讓 SAS 知道這是一個(gè) URL,并且可以找到 AT&next_url,這是我們的宏變量,其中收錄我們從 work.links_to_crawl 數據集中提取的 URL。filename_nexturl url "&next_url" 創(chuàng )建一個(gè)對文件名的 URL 引用,它決定了放置我們下載文件的位置。創(chuàng )建另一個(gè)引用文件名的條目,稱(chēng)為 htmlfilm,并將從 url_file.html 采集的信息放在那里。
  查找更多 urls datawork._urls(keep=url); 長(cháng)度 url $256 filehtmlfile; infile _nexturl 長(cháng)度=len;輸入文本 $varying2000. len; 放文字;起始長(cháng)度(文本);使用正則表達式 網(wǎng)站 URL 來(lái)幫助搜索。文本字符串的正則表達式匹配方法,例如單詞、單詞或字符模式。SAS 已經(jīng)提供了許多強大的字符串功能。但是,正則表達式通常提供了一種更簡(jiǎn)潔的方式來(lái)處理和匹配文本。做;保留patternID; pattern '/href=”([^"]+)”/i';patternID prxparse(pattern);end 首先觀(guān)察到,創(chuàng )建 patternID 將使整個(gè)數據步驟保持運行。要查找的模式是:“/href= "([^"]+)"/i'"., 表示我們在尋找字符串 "HREF purpose" 表示使用不區分大小寫(xiě)的方法來(lái)匹配我們的正則表達式。
  PRXNEXT 有五個(gè)參數:我們要查找的正則表達式,開(kāi)始查找正則表達式的開(kāi)始位置,停止正則表達式的結束位置,字符串中一旦找到的位置,以及字符串的長(cháng)度,如果找到的位置將如果未找到字符串,則為 0。PRXNEXT 還更改了 start 參數,以便在找到最后一個(gè)匹配項后重新開(kāi)始搜索。調用 prxnext(patternID, start, stop, text, position, length); 代碼中的循環(huán),顯示在 網(wǎng)站 上的所有鏈接的文本。do while (position substr(text,position+6, length-7); output; call prxnext(patternID, start, stop, text, position, length); end; run; 如果代碼找到一個(gè) URL,它will 檢索在第一個(gè)引號之后開(kāi)始的 URL 的唯一部分。例如,如果代碼找到 href="",那么它應該保存。使用 substr 從 URL 的其余部分中刪除前 6 個(gè)字符和最后一個(gè)字符 work._urls 數據集的輸出?,F在,我們插入 URL 代碼只是為了跟蹤抓取到我們已經(jīng)擁有的名為 work.links_crawled 的數據集,并確保我們不再瀏覽那里。
  currentlink urls我們已經(jīng)爬取了datawork._old_link;網(wǎng)址“&next_url”;運行;proc append base=work.links_crawled data=work._old_link force;跑; 確保: 1. 我們還沒(méi)有抓取它們,也就是說(shuō) URL 不在 work.links_crawled 中)。2.我們沒(méi)有排隊的url進(jìn)行爬?。磚rl不在work.links_to_crawl只添加url我們已經(jīng)爬過(guò)queuedup procsql noprint;創(chuàng )建表work._append selecturl from work._urls where url (selecturl from work.links_crawled) (selecturl from work .links_to_crawl); quit; 然后,我們添加尚未被爬取的 URL,尚未排隊 work.links_to_crawl addnew links procappend base=work.links_to_crawl data=work._append force; run;

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(三種抓取網(wǎng)頁(yè)數據的方法-2.Beautiful)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 61 次瀏覽 ? 2022-01-10 16:06 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(三種抓取網(wǎng)頁(yè)數據的方法-2.Beautiful)
  下面我們將介紹三種抓取網(wǎng)頁(yè)數據的方法,首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  1. 正則表達式
  如果您是正則表達式的新手,或者需要一些提示,請查看正則表達式 HOWTO 以獲得完整的介紹。
  當我們使用正則表達式抓取國家/地區數據時(shí),我們首先嘗試匹配元素的內容,如下所示:
  >>> import re
>>> import urllib2
>>> url = 'http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> re.findall('(.*?)', html)
['/places/static/images/flags/gb.png', '244,820 square kilometres', '62,348,447', 'GB', 'United Kingdom', 'London', 'EU', '.uk', 'GBP', 'Pound', '44', '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA', '^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$', 'en-GB,cy-GB,gd', 'IE ']
>>>
  從以上結果可以看出,標簽用于多個(gè)國家屬性。要隔離 area 屬性,我們只需選擇其中的第二個(gè)元素,如下所示:
  >>> re.findall('(.*?)', html)[1]
'244,820 square kilometres'
  雖然這個(gè)方案現在可用,但如果頁(yè)面發(fā)生變化,它很可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使正則表達式更加健壯,我們也可以添加它的父元素。由于元素具有 ID 屬性,因此它應該是唯一的。
  >>> re.findall('Area: (.*?)', html)
['244,820 square kilometres']
  這個(gè)迭代版本看起來(lái)好一點(diǎn),但是網(wǎng)頁(yè)更新還有很多其他的方式也會(huì )讓這個(gè)正則表達式不令人滿(mǎn)意。例如,將雙引號更改為單引號,在標簽之間添加額外的空格,或者更改 area_label 等。下面是一個(gè)嘗試支持這些可能性的改進(jìn)版本。
  >>> re.findall('.*?(.*?)',html)['244,820 square kilometres']
  雖然這個(gè)正則表達式更容易適應未來(lái)的變化,但它也存在構造困難、可讀性差的問(wèn)題。此外,還有一些細微的布局更改可能會(huì )使此正則表達式無(wú)法令人滿(mǎn)意,例如為標簽添加標題屬性。
  從這個(gè)例子可以看出,正則表達式為我們提供了一種抓取數據的捷徑,但是這種方法過(guò)于脆弱,在頁(yè)面更新后容易出現問(wèn)題。好在還有一些更好的解決方案,后面會(huì )介紹。
  2. 靚湯
  Beautiful Soup 是一個(gè)非常流行的 Python 模塊。該模塊可以解析網(wǎng)頁(yè)并提供方便的界面來(lái)定位內容。如果您還沒(méi)有安裝該模塊,可以使用以下命令安裝其最新版本(需要先安裝pip,請自行百度):
  pip install beautifulsoup4
  使用 Beautiful Soup 的第一步是將下載的 HTML 內容解析成一個(gè)湯文檔。由于大多數網(wǎng)頁(yè)不是格式良好的 HTML,Beautiful Soup 需要確定它們的實(shí)際格式。例如,在下面這個(gè)簡(jiǎn)單網(wǎng)頁(yè)的清單中,存在屬性值和未閉合標簽周?chē)鄙僖柕膯?wèn)題。
  
Area
Population
  如果 Population 列表項被解析為 Area 列表項的子項,而不是兩個(gè)并排的列表項,我們在抓取時(shí)會(huì )得到錯誤的結果。讓我們看看Beautiful Soup是如何處理它的。
  >>> from bs4 import BeautifulSoup
>>> broken_html = 'AreaPopulation'
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, 'html.parser')
>>> fixed_html = soup.prettify()
>>> print fixed_html

Area

Population


  從上面的執行結果可以看出,Beautiful Soup 能夠正確解析缺失的引號并關(guān)閉標簽?,F在我們可以使用 find() 和 find_all() 方法來(lái)定位我們需要的元素。
  >>> ul = soup.find('ul', attrs={'class':'country'})
>>> ul.find('li') # return just the first match
AreaPopulation
>>> ul.find_all('li') # return all matches
[AreaPopulation, Population]
  注意:由于不同版本的Python內置庫的容錯能力存在差異,處理結果可能與上述不同。詳情請參閱: 。想知道所有的方法和參數,可以參考 Beautiful Soup 的官方文檔
  以下是使用此方法提取樣本國家地區數據的完整代碼。
  >>> from bs4 import BeautifulSoup
>>> import urllib2
>>> url = 'http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> # locate the area row
>>> tr = soup.find(attrs={'id':'places_area__row'})
>>> # locate the area tag
>>> td = tr.find(attrs={'class':'w2p_fw'})
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  此代碼雖然比正則表達式代碼更復雜,但更易于構建和理解。此外,布局中的一些小變化,例如額外的空白和制表符屬性,我們不再需要擔心它了。
  3. Lxml
  Lxml 是基于 XML 解析庫 libxml2 的 Python 包裝器。模塊用C語(yǔ)言編寫(xiě),解析速度比Beautiful Soup快,但安裝過(guò)程比較復雜。最新安裝說(shuō)明可以參考。**
  與 Beautiful Soup 一樣,使用 lxml 模塊的第一步是將可能無(wú)效的 HTML 解析為統一格式。以下是使用此模塊解析不完整 HTML 的示例:
  >>> import lxml.html
>>> broken_html = 'AreaPopulation'
>>> # parse the HTML
>>> tree = lxml.html.fromstring(broken_html)
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html
Area
Population
  同樣,lxml 正確解析屬性周?chē)鄙俚囊柌㈥P(guān)閉標簽,但模塊不會(huì )添加和標簽。
  解析輸入后,是時(shí)候選擇元素了。此時(shí),lxml 有幾種不同的方法,例如 XPath 選擇器和 Beautiful Soup 之類(lèi)的 find() 方法。但是,我們將來(lái)會(huì )使用 CSS 選擇器,因為它更簡(jiǎn)潔,可以在解析動(dòng)態(tài)內容時(shí)重用。此外,一些有 jQuery 選擇器經(jīng)驗的讀者會(huì )更熟悉它。
  以下是使用 lxml 的 CSS 選擇器提取區域數據的示例代碼:
  >>> import urllib2
>>> import lxml.html
>>> url = 'http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0] # *行代碼
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  *行代碼會(huì )先找到ID為places_area__row的表格行元素,然后選擇類(lèi)為w2p_fw的表格數據子標簽。
  CSS 選擇器表示用于選擇元素的模式。以下是一些常用選擇器的示例:
  選擇所有標簽: *
選擇 標簽: a
選擇所有 class="link" 的元素: .link
選擇 class="link" 的 標簽: a.link
選擇 id="home" 的 標簽: a#home
選擇父元素為 標簽的所有 子標簽: a > span
選擇 標簽內部的所有 標簽: a span
選擇 title 屬性為"Home"的所有 標簽: a[title=Home]
  W3C 在
  Lxml 已經(jīng)實(shí)現了大部分 CSS3 屬性,其不支持的功能可以在: .
  注意:lxml 的內部實(shí)現實(shí)際上將 CSS 選擇器轉換為等效的 XPath 選擇器。
  4. 性能比較
  在下面的代碼中,每個(gè)爬蟲(chóng)會(huì )執行1000次,每次執行都會(huì )檢查爬取結果是否正確,然后打印總時(shí)間。
  # -*- coding: utf-8 -*-
import csv
import time
import urllib2
import re
import timeit
from bs4 import BeautifulSoup
import lxml.html
FIELDS = ('area', 'population', 'iso', 'country', 'capital', 'continent', 'tld', 'currency_code', 'currency_name', 'phone', 'postal_code_format', 'postal_code_regex', 'languages', 'neighbours')
def regex_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search('.*?(.*?)'.format(field), html).groups()[0]
return results
def beautiful_soup_scraper(html):
soup = BeautifulSoup(html, 'html.parser')
results = {}
for field in FIELDS:
results[field] = soup.find('table').find('tr', id='places_{}__row'.format(field)).find('td', class_='w2p_fw').text
return results
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect('table > tr#places_{}__row > td.w2p_fw'.format(field))[0].text_content()
return results
def main():
times = {}
html = urllib2.urlopen('http://example.webscraping.com ... %2339;).read()
NUM_ITERATIONS = 1000 # number of times to test each scraper
for name, scraper in ('Regular expressions', regex_scraper), ('Beautiful Soup', beautiful_soup_scraper), ('Lxml', lxml_scraper):
times[name] = []
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == regex_scraper:
# the regular expression module will cache results
# so need to purge this cache for meaningful timings
re.purge() # *行代碼
result = scraper(html)
# check scraped result is as expected
assert(result['area'] == '244,820 square kilometres')
times[name].append(time.time() - start)
# record end time of scrape and output the total
end = time.time()
print '{}: {:.2f} seconds'.format(name, end - start)
writer = csv.writer(open('times.csv', 'w'))
header = sorted(times.keys())
writer.writerow(header)
for row in zip(*[times[scraper] for scraper in header]):
writer.writerow(row)
if __name__ == '__main__':
main()
  請注意,我們在 *line 代碼中調用了 re.purge() 方法。默認情況下,正則表達式會(huì )緩存搜索結果,公平起見(jiàn),我們需要使用這種方法來(lái)清除緩存。
  這是在我的計算機上運行腳本的結果:
  
  由于硬件條件的不同,不同計算機的執行結果也會(huì )有一定的差異。但是,每種方法之間的相對差異應該具有可比性。從結果可以看出,Beautiful Soup 在爬取我們的示例網(wǎng)頁(yè)時(shí)比其他兩種方法慢 7 倍以上。事實(shí)上,這個(gè)結果是意料之中的,因為 lxml 和正則表達式模塊是用 C 編寫(xiě)的,而 Beautiful Soup 是用純 Python 編寫(xiě)的。一個(gè)有趣的事實(shí)是 lxml 的性能與正則表達式差不多。由于 lxml 必須在搜索元素之前將輸入解析為內部格式,因此會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)。當爬取同一個(gè)網(wǎng)頁(yè)的多個(gè)特征時(shí),這個(gè)初始解析的開(kāi)銷(xiāo)會(huì )減少,lxml會(huì )更有競爭力,所以lxml是一個(gè)強大的模塊。
  5. 總結
  三種網(wǎng)頁(yè)抓取方式的優(yōu)缺點(diǎn):
  抓取方式 性能 使用難度 安裝難度
  正則表達式
  快的
  困難
  簡(jiǎn)單(內置模塊)
  美麗的湯
  慢的
  簡(jiǎn)單的
  簡(jiǎn)單(純 Python)
  lxml
  快的
  簡(jiǎn)單的
  比較困難
  如果您的爬蟲(chóng)的瓶頸是下載頁(yè)面,而不是提取數據,那么使用較慢的方法(如 Beautiful Soup)不是問(wèn)題。正則表達式在一次性提取中非常有用,除了可以避免解析整個(gè)網(wǎng)頁(yè)的開(kāi)銷(xiāo),如果只需要抓取少量數據并想避免額外的依賴(lài),那么正則表達式可能更適合. 但是,總的來(lái)說(shuō),lxml 是抓取數據的最佳選擇,因為它不僅速度更快,功能更強大,而正則表達式和 Beautiful Soup 僅在某些場(chǎng)景下才有用。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(三種抓取網(wǎng)頁(yè)數據的方法-2.Beautiful)
  下面我們將介紹三種抓取網(wǎng)頁(yè)數據的方法,首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  1. 正則表達式
  如果您是正則表達式的新手,或者需要一些提示,請查看正則表達式 HOWTO 以獲得完整的介紹。
  當我們使用正則表達式抓取國家/地區數據時(shí),我們首先嘗試匹配元素的內容,如下所示:
  >>> import re
>>> import urllib2
>>> url = 'http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> re.findall('(.*?)', html)
['/places/static/images/flags/gb.png', '244,820 square kilometres', '62,348,447', 'GB', 'United Kingdom', 'London', 'EU', '.uk', 'GBP', 'Pound', '44', '@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA', '^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$', 'en-GB,cy-GB,gd', 'IE ']
>>>
  從以上結果可以看出,標簽用于多個(gè)國家屬性。要隔離 area 屬性,我們只需選擇其中的第二個(gè)元素,如下所示:
  >>> re.findall('(.*?)', html)[1]
'244,820 square kilometres'
  雖然這個(gè)方案現在可用,但如果頁(yè)面發(fā)生變化,它很可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使正則表達式更加健壯,我們也可以添加它的父元素。由于元素具有 ID 屬性,因此它應該是唯一的。
  >>> re.findall('Area: (.*?)', html)
['244,820 square kilometres']
  這個(gè)迭代版本看起來(lái)好一點(diǎn),但是網(wǎng)頁(yè)更新還有很多其他的方式也會(huì )讓這個(gè)正則表達式不令人滿(mǎn)意。例如,將雙引號更改為單引號,在標簽之間添加額外的空格,或者更改 area_label 等。下面是一個(gè)嘗試支持這些可能性的改進(jìn)版本。
  >>> re.findall('.*?(.*?)',html)['244,820 square kilometres']
  雖然這個(gè)正則表達式更容易適應未來(lái)的變化,但它也存在構造困難、可讀性差的問(wèn)題。此外,還有一些細微的布局更改可能會(huì )使此正則表達式無(wú)法令人滿(mǎn)意,例如為標簽添加標題屬性。
  從這個(gè)例子可以看出,正則表達式為我們提供了一種抓取數據的捷徑,但是這種方法過(guò)于脆弱,在頁(yè)面更新后容易出現問(wèn)題。好在還有一些更好的解決方案,后面會(huì )介紹。
  2. 靚湯
  Beautiful Soup 是一個(gè)非常流行的 Python 模塊。該模塊可以解析網(wǎng)頁(yè)并提供方便的界面來(lái)定位內容。如果您還沒(méi)有安裝該模塊,可以使用以下命令安裝其最新版本(需要先安裝pip,請自行百度):
  pip install beautifulsoup4
  使用 Beautiful Soup 的第一步是將下載的 HTML 內容解析成一個(gè)湯文檔。由于大多數網(wǎng)頁(yè)不是格式良好的 HTML,Beautiful Soup 需要確定它們的實(shí)際格式。例如,在下面這個(gè)簡(jiǎn)單網(wǎng)頁(yè)的清單中,存在屬性值和未閉合標簽周?chē)鄙僖柕膯?wèn)題。
  
Area
Population
  如果 Population 列表項被解析為 Area 列表項的子項,而不是兩個(gè)并排的列表項,我們在抓取時(shí)會(huì )得到錯誤的結果。讓我們看看Beautiful Soup是如何處理它的。
  >>> from bs4 import BeautifulSoup
>>> broken_html = 'AreaPopulation'
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, 'html.parser')
>>> fixed_html = soup.prettify()
>>> print fixed_html

Area

Population


  從上面的執行結果可以看出,Beautiful Soup 能夠正確解析缺失的引號并關(guān)閉標簽?,F在我們可以使用 find() 和 find_all() 方法來(lái)定位我們需要的元素。
  >>> ul = soup.find('ul', attrs={'class':'country'})
>>> ul.find('li') # return just the first match
AreaPopulation
>>> ul.find_all('li') # return all matches
[AreaPopulation, Population]
  注意:由于不同版本的Python內置庫的容錯能力存在差異,處理結果可能與上述不同。詳情請參閱: 。想知道所有的方法和參數,可以參考 Beautiful Soup 的官方文檔
  以下是使用此方法提取樣本國家地區數據的完整代碼。
  >>> from bs4 import BeautifulSoup
>>> import urllib2
>>> url = 'http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> # locate the area row
>>> tr = soup.find(attrs={'id':'places_area__row'})
>>> # locate the area tag
>>> td = tr.find(attrs={'class':'w2p_fw'})
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  此代碼雖然比正則表達式代碼更復雜,但更易于構建和理解。此外,布局中的一些小變化,例如額外的空白和制表符屬性,我們不再需要擔心它了。
  3. Lxml
  Lxml 是基于 XML 解析庫 libxml2 的 Python 包裝器。模塊用C語(yǔ)言編寫(xiě),解析速度比Beautiful Soup快,但安裝過(guò)程比較復雜。最新安裝說(shuō)明可以參考。**
  與 Beautiful Soup 一樣,使用 lxml 模塊的第一步是將可能無(wú)效的 HTML 解析為統一格式。以下是使用此模塊解析不完整 HTML 的示例:
  >>> import lxml.html
>>> broken_html = 'AreaPopulation'
>>> # parse the HTML
>>> tree = lxml.html.fromstring(broken_html)
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html
Area
Population
  同樣,lxml 正確解析屬性周?chē)鄙俚囊柌㈥P(guān)閉標簽,但模塊不會(huì )添加和標簽。
  解析輸入后,是時(shí)候選擇元素了。此時(shí),lxml 有幾種不同的方法,例如 XPath 選擇器和 Beautiful Soup 之類(lèi)的 find() 方法。但是,我們將來(lái)會(huì )使用 CSS 選擇器,因為它更簡(jiǎn)潔,可以在解析動(dòng)態(tài)內容時(shí)重用。此外,一些有 jQuery 選擇器經(jīng)驗的讀者會(huì )更熟悉它。
  以下是使用 lxml 的 CSS 選擇器提取區域數據的示例代碼:
  >>> import urllib2
>>> import lxml.html
>>> url = 'http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0] # *行代碼
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  *行代碼會(huì )先找到ID為places_area__row的表格行元素,然后選擇類(lèi)為w2p_fw的表格數據子標簽。
  CSS 選擇器表示用于選擇元素的模式。以下是一些常用選擇器的示例:
  選擇所有標簽: *
選擇 標簽: a
選擇所有 class="link" 的元素: .link
選擇 class="link" 的 標簽: a.link
選擇 id="home" 的 標簽: a#home
選擇父元素為 標簽的所有 子標簽: a > span
選擇 標簽內部的所有 標簽: a span
選擇 title 屬性為"Home"的所有 標簽: a[title=Home]
  W3C 在
  Lxml 已經(jīng)實(shí)現了大部分 CSS3 屬性,其不支持的功能可以在: .
  注意:lxml 的內部實(shí)現實(shí)際上將 CSS 選擇器轉換為等效的 XPath 選擇器。
  4. 性能比較
  在下面的代碼中,每個(gè)爬蟲(chóng)會(huì )執行1000次,每次執行都會(huì )檢查爬取結果是否正確,然后打印總時(shí)間。
  # -*- coding: utf-8 -*-
import csv
import time
import urllib2
import re
import timeit
from bs4 import BeautifulSoup
import lxml.html
FIELDS = ('area', 'population', 'iso', 'country', 'capital', 'continent', 'tld', 'currency_code', 'currency_name', 'phone', 'postal_code_format', 'postal_code_regex', 'languages', 'neighbours')
def regex_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search('.*?(.*?)'.format(field), html).groups()[0]
return results
def beautiful_soup_scraper(html):
soup = BeautifulSoup(html, 'html.parser')
results = {}
for field in FIELDS:
results[field] = soup.find('table').find('tr', id='places_{}__row'.format(field)).find('td', class_='w2p_fw').text
return results
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect('table > tr#places_{}__row > td.w2p_fw'.format(field))[0].text_content()
return results
def main():
times = {}
html = urllib2.urlopen('http://example.webscraping.com ... %2339;).read()
NUM_ITERATIONS = 1000 # number of times to test each scraper
for name, scraper in ('Regular expressions', regex_scraper), ('Beautiful Soup', beautiful_soup_scraper), ('Lxml', lxml_scraper):
times[name] = []
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == regex_scraper:
# the regular expression module will cache results
# so need to purge this cache for meaningful timings
re.purge() # *行代碼
result = scraper(html)
# check scraped result is as expected
assert(result['area'] == '244,820 square kilometres')
times[name].append(time.time() - start)
# record end time of scrape and output the total
end = time.time()
print '{}: {:.2f} seconds'.format(name, end - start)
writer = csv.writer(open('times.csv', 'w'))
header = sorted(times.keys())
writer.writerow(header)
for row in zip(*[times[scraper] for scraper in header]):
writer.writerow(row)
if __name__ == '__main__':
main()
  請注意,我們在 *line 代碼中調用了 re.purge() 方法。默認情況下,正則表達式會(huì )緩存搜索結果,公平起見(jiàn),我們需要使用這種方法來(lái)清除緩存。
  這是在我的計算機上運行腳本的結果:
  
  由于硬件條件的不同,不同計算機的執行結果也會(huì )有一定的差異。但是,每種方法之間的相對差異應該具有可比性。從結果可以看出,Beautiful Soup 在爬取我們的示例網(wǎng)頁(yè)時(shí)比其他兩種方法慢 7 倍以上。事實(shí)上,這個(gè)結果是意料之中的,因為 lxml 和正則表達式模塊是用 C 編寫(xiě)的,而 Beautiful Soup 是用純 Python 編寫(xiě)的。一個(gè)有趣的事實(shí)是 lxml 的性能與正則表達式差不多。由于 lxml 必須在搜索元素之前將輸入解析為內部格式,因此會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)。當爬取同一個(gè)網(wǎng)頁(yè)的多個(gè)特征時(shí),這個(gè)初始解析的開(kāi)銷(xiāo)會(huì )減少,lxml會(huì )更有競爭力,所以lxml是一個(gè)強大的模塊。
  5. 總結
  三種網(wǎng)頁(yè)抓取方式的優(yōu)缺點(diǎn):
  抓取方式 性能 使用難度 安裝難度
  正則表達式
  快的
  困難
  簡(jiǎn)單(內置模塊)
  美麗的湯
  慢的
  簡(jiǎn)單的
  簡(jiǎn)單(純 Python)
  lxml
  快的
  簡(jiǎn)單的
  比較困難
  如果您的爬蟲(chóng)的瓶頸是下載頁(yè)面,而不是提取數據,那么使用較慢的方法(如 Beautiful Soup)不是問(wèn)題。正則表達式在一次性提取中非常有用,除了可以避免解析整個(gè)網(wǎng)頁(yè)的開(kāi)銷(xiāo),如果只需要抓取少量數據并想避免額外的依賴(lài),那么正則表達式可能更適合. 但是,總的來(lái)說(shuō),lxml 是抓取數據的最佳選擇,因為它不僅速度更快,功能更強大,而正則表達式和 Beautiful Soup 僅在某些場(chǎng)景下才有用。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬取的人物畫(huà)像(數據的實(shí)時(shí)性)難點(diǎn)打賞禮物)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 64 次瀏覽 ? 2022-01-09 10:13 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬取的人物畫(huà)像(數據的實(shí)時(shí)性)難點(diǎn)打賞禮物)
  后臺抓取某直播平臺信息和普通網(wǎng)站直播平臺數據有熱門(mén)主播在線(xiàn)數,經(jīng)常,熱門(mén)直播的送禮情況(粉絲頭像) 送禮難度人像httpswss(實(shí)時(shí)數據),需要模擬匿名用戶(hù)的訪(fǎng)問(wèn)。一個(gè)直播的wss數據網(wǎng)站是一個(gè)大二進(jìn)制數據頭的js代碼。您需要先模擬匿名登錄才能獲取二進(jìn)制數據。然后分析網(wǎng)站的js代碼進(jìn)行分析。找到工具chrome developer tool,選擇f12 ws,你只能看到幀在移動(dòng)和我們兩個(gè)不認識的二進(jìn)制。Wireshark,遺憾的是,我報了很大的希望,但是通過(guò)websocket找不到,我馬上分析了一下。我想我不知道如何攔截它。稍后我會(huì )研究如何使用它??吹接腥苏f(shuō)直接搜索websocket就可以看到。. 但是通過(guò)websocket過(guò)濾器我真的找不到我想要的數據。除非通過(guò)ip.addr ip.src 等charles,意外發(fā)現。名副其實(shí),查爾斯。雖然一開(kāi)始不太好用,但總算搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具 一開(kāi)始不太好用,終于搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具 一開(kāi)始不太好用,終于搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具
  // Charles Proxy License
// 適用于Charles任意版本的注冊碼,誰(shuí)還會(huì )想要使用破解版呢。
// Charles 4.2目前是最新版,可用。
Registered Name: https://zhile.io
License Key: 48891cf209c6d32bf4
  安裝 ssl 證書(shū)支持
  help->SSL proxying->install charles root certificate
下面這篇文章說(shuō)的非常好
https://www.cnblogs.com/ceshij ... .html
  設置代理,和上面的文章一樣,但是我推薦使用*:443查看結果。在瀏覽器上訪(fǎng)問(wèn)你要訪(fǎng)問(wèn)的網(wǎng)站普通https網(wǎng)頁(yè)。您已經(jīng)可以看到背面的內容。同樣wss的爬取也出來(lái)了,只是具體的二進(jìn)制數據。還是需要你自己分析
  
  
  目前可以抓到數據,下一步就是對二進(jìn)制數據進(jìn)行分析解析,得到有價(jià)值的數據。
  原創(chuàng )文章,版權所有,禁止抄襲,違者必究?。?!請注明出處?。?!技術(shù)需求請聯(lián)系。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬取的人物畫(huà)像(數據的實(shí)時(shí)性)難點(diǎn)打賞禮物)
  后臺抓取某直播平臺信息和普通網(wǎng)站直播平臺數據有熱門(mén)主播在線(xiàn)數,經(jīng)常,熱門(mén)直播的送禮情況(粉絲頭像) 送禮難度人像httpswss(實(shí)時(shí)數據),需要模擬匿名用戶(hù)的訪(fǎng)問(wèn)。一個(gè)直播的wss數據網(wǎng)站是一個(gè)大二進(jìn)制數據頭的js代碼。您需要先模擬匿名登錄才能獲取二進(jìn)制數據。然后分析網(wǎng)站的js代碼進(jìn)行分析。找到工具chrome developer tool,選擇f12 ws,你只能看到幀在移動(dòng)和我們兩個(gè)不認識的二進(jìn)制。Wireshark,遺憾的是,我報了很大的希望,但是通過(guò)websocket找不到,我馬上分析了一下。我想我不知道如何攔截它。稍后我會(huì )研究如何使用它??吹接腥苏f(shuō)直接搜索websocket就可以看到。. 但是通過(guò)websocket過(guò)濾器我真的找不到我想要的數據。除非通過(guò)ip.addr ip.src 等charles,意外發(fā)現。名副其實(shí),查爾斯。雖然一開(kāi)始不太好用,但總算搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具 一開(kāi)始不太好用,終于搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具 一開(kāi)始不太好用,終于搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具
  // Charles Proxy License
// 適用于Charles任意版本的注冊碼,誰(shuí)還會(huì )想要使用破解版呢。
// Charles 4.2目前是最新版,可用。
Registered Name: https://zhile.io
License Key: 48891cf209c6d32bf4
  安裝 ssl 證書(shū)支持
  help->SSL proxying->install charles root certificate
下面這篇文章說(shuō)的非常好
https://www.cnblogs.com/ceshij ... .html
  設置代理,和上面的文章一樣,但是我推薦使用*:443查看結果。在瀏覽器上訪(fǎng)問(wèn)你要訪(fǎng)問(wèn)的網(wǎng)站普通https網(wǎng)頁(yè)。您已經(jīng)可以看到背面的內容。同樣wss的爬取也出來(lái)了,只是具體的二進(jìn)制數據。還是需要你自己分析
  
  
  目前可以抓到數據,下一步就是對二進(jìn)制數據進(jìn)行分析解析,得到有價(jià)值的數據。
  原創(chuàng )文章,版權所有,禁止抄襲,違者必究?。?!請注明出處?。?!技術(shù)需求請聯(lián)系。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(talkischeap,showmethecodeshowthe )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-01-09 10:10 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(talkischeap,showmethecodeshowthe
)
  談話(huà)很便宜,給我看代碼:
  #coding=utf-8
import sys
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
import json
reload(sys)
sys.setdefaultencoding('utf8')
class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains=[""]
start_urls=["http://www.jjkjj.gov.cn/"]
def parse(self,response):
filename = response.url.split("/")[-2]
titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())
open(filename,'w').write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))
  我們來(lái)分析一下代碼:
  from scrapy.spider import BaseSpider
  這是基于單頁(yè)的爬取,所以使用BaseSpider,基于鏈接跳轉的爬蟲(chóng)可以看第二篇文章
   name = "dmoz"
allowed_domains=[""]
start_urls=["http://www.jjkjj.gov.cn/"]
  start_urls是主域名,
  所以 allowed_domain 設置為空
   def parse(self,response):
filename = response.url.split("/")[-2]
titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())
  這個(gè)markdown編輯器的縮進(jìn)有問(wèn)題,titles.extend... 這行要和上一行保持一樣的縮進(jìn),否則會(huì )報錯
  Python 運行時(shí)錯誤,引發(fā) notImplementedError
  遇到此類(lèi)錯誤,檢查縮進(jìn),一般可以解決
  接下來(lái)看xpath表達式,
  具體含義是:找到class屬性為“Work_News_line”的div,以及它下面label的值
  extract()函數 返回一個(gè)unicode字符串,該字符串為XPath選擇器返回的數據
  xpath的使用有幾點(diǎn)需要注意
  上面第二篇文章中,xpath的使用方式是:
  sel=Selector(response) item=DoubanmoiveItem() item['name']=sel.xpath('//[@id="content"]/h1/span[1]/text()').extract()
  新版本的scrapy不建議這樣做
  
  所以我把它改成了上面的
  接下來(lái)是最頭疼的中文顯示問(wèn)題
  在shell中查看xpath查詢(xún)結果:
  
  一堆Unicode字符,其實(shí)這也算是捕獲成功了,但是基本不可用,還是需要轉成中文的。
  感覺(jué)scrapy,甚至python,在字符集上都不是很好,
  再看上面的代碼:
  titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())
  這里聲明了一個(gè)列表。每次查詢(xún)到一個(gè)值,就將其放入列表中,然后列表需要轉換成字符串寫(xiě)入文件。
  python本身提供了str()方法可以將任意對象轉換成字符串,但是不支持中文,轉換后的字符串還是unicode編碼的。
  詳情見(jiàn)此貼:str字符串轉換
  一種解決方法是使用python自帶的json模塊
  open(filename,'w').write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))
  沒(méi)關(guān)系
  我們將捕獲的數據寫(xiě)入文件,我們來(lái)看看結果:
   查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(talkischeap,showmethecodeshowthe
)
  談話(huà)很便宜,給我看代碼:
  #coding=utf-8
import sys
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
import json
reload(sys)
sys.setdefaultencoding('utf8')
class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains=[""]
start_urls=["http://www.jjkjj.gov.cn/"]
def parse(self,response):
filename = response.url.split("/")[-2]
titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())
open(filename,'w').write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))
  我們來(lái)分析一下代碼:
  from scrapy.spider import BaseSpider
  這是基于單頁(yè)的爬取,所以使用BaseSpider,基于鏈接跳轉的爬蟲(chóng)可以看第二篇文章
   name = "dmoz"
allowed_domains=[""]
start_urls=["http://www.jjkjj.gov.cn/"]
  start_urls是主域名,
  所以 allowed_domain 設置為空
   def parse(self,response):
filename = response.url.split("/")[-2]
titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())
  這個(gè)markdown編輯器的縮進(jìn)有問(wèn)題,titles.extend... 這行要和上一行保持一樣的縮進(jìn),否則會(huì )報錯
  Python 運行時(shí)錯誤,引發(fā) notImplementedError
  遇到此類(lèi)錯誤,檢查縮進(jìn),一般可以解決
  接下來(lái)看xpath表達式,
  具體含義是:找到class屬性為“Work_News_line”的div,以及它下面label的值
  extract()函數 返回一個(gè)unicode字符串,該字符串為XPath選擇器返回的數據
  xpath的使用有幾點(diǎn)需要注意
  上面第二篇文章中,xpath的使用方式是:
  sel=Selector(response) item=DoubanmoiveItem() item['name']=sel.xpath('//[@id="content"]/h1/span[1]/text()').extract()
  新版本的scrapy不建議這樣做
  
  所以我把它改成了上面的
  接下來(lái)是最頭疼的中文顯示問(wèn)題
  在shell中查看xpath查詢(xún)結果:
  
  一堆Unicode字符,其實(shí)這也算是捕獲成功了,但是基本不可用,還是需要轉成中文的。
  感覺(jué)scrapy,甚至python,在字符集上都不是很好,
  再看上面的代碼:
  titles=[] titles.extend(response.selector.xpath('//div[@class ="Work_News_line"]/a/text()').extract())
  這里聲明了一個(gè)列表。每次查詢(xún)到一個(gè)值,就將其放入列表中,然后列表需要轉換成字符串寫(xiě)入文件。
  python本身提供了str()方法可以將任意對象轉換成字符串,但是不支持中文,轉換后的字符串還是unicode編碼的。
  詳情見(jiàn)此貼:str字符串轉換
  一種解決方法是使用python自帶的json模塊
  open(filename,'w').write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))
  沒(méi)關(guān)系
  我們將捕獲的數據寫(xiě)入文件,我們來(lái)看看結果:
  

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目1WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 66 次瀏覽 ? 2022-01-08 00:16 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目1WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目)
  WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目1 WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目文檔版本:1.0.0.1 作者:Dane IT Training Group C++教學(xué)研發(fā)部作者:Min Wei 定稿日期:11月,星期五20, 2015 WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目21. 項目概述 互聯(lián)網(wǎng)產(chǎn)品種類(lèi)繁多,以產(chǎn)品為導向,以營(yíng)銷(xiāo)為導向,以技術(shù)為導向,但掌握技術(shù)的互聯(lián)網(wǎng)產(chǎn)品占比較高。更小。搜索引擎是目前互聯(lián)網(wǎng)產(chǎn)品中技術(shù)最先進(jìn)的產(chǎn)品,如果不是唯一的,至少也是其中之一。經(jīng)過(guò)十多年的發(fā)展,搜索引擎已經(jīng)成為互聯(lián)網(wǎng)的重要門(mén)戶(hù)之一。Twitter聯(lián)合創(chuàng )始人埃文威廉姆斯提出“
  WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)訓練項目3這樣海量的數據如何獲取、存儲和計算?如何快速響應用戶(hù)查詢(xún)?如何讓搜索結果盡可能滿(mǎn)足用戶(hù)對信息的需求?這些都是搜索引擎設計者必須面對的技術(shù)挑戰。下圖展示了一個(gè)通用搜索引擎的基本結構。商業(yè)級搜索引擎通常由許多獨立的模塊組成。每個(gè)模塊只負責搜索引擎的部分功能,相互配合形成一個(gè)完整的搜索引擎:搜索引擎的信息源來(lái)自網(wǎng)頁(yè),整個(gè)“網(wǎng)絡(luò )爬蟲(chóng)”的信息“互聯(lián)網(wǎng)”在本地獲取,由于網(wǎng)頁(yè)上的大部分內容完全相同或幾乎重復,“網(wǎng)頁(yè)去重”模塊會(huì )檢測到并刪除重復的內容。之后,搜索引擎將解析網(wǎng)頁(yè),提取網(wǎng)頁(yè)的主要內容,以及指向該網(wǎng)頁(yè)中收錄的其他頁(yè)面的所謂超鏈接。為了加快用戶(hù)查詢(xún)的響應速度,通過(guò)“倒排索引”的高效查詢(xún)數據結構保存網(wǎng)頁(yè)內容,同時(shí)保存網(wǎng)頁(yè)之間的鏈接關(guān)系。之所以保存鏈接關(guān)系,是因為在網(wǎng)頁(yè)的相關(guān)性排名階段,這個(gè)關(guān)系是可用的。頁(yè)面的相對重要性可以通過(guò)“鏈接分析”來(lái)判斷,這對于為用戶(hù)提供準確的搜索結果非常有幫助。由于網(wǎng)頁(yè)數量眾多,搜索引擎不僅需要保存網(wǎng)頁(yè)的原創(chuàng )信息,還需要保存一些中間處理結果。使用單臺計算機或少量計算機顯然是不現實(shí)的。
  谷歌等商業(yè)搜索引擎提供商為此開(kāi)發(fā)了一套完整的云存儲和云計算平臺,利用數以萬(wàn)計的普通PCWEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)訓練項目4,構建了海量信息作為搜索的可靠存儲和計算架構引擎及其相關(guān)應用的基礎支持。優(yōu)秀的云存儲和云計算平臺已成為大型商業(yè)搜索引擎的核心競爭力。以上就是搜索引擎獲取和存儲海量網(wǎng)頁(yè)相關(guān)信息的方式。由于這些功能不需要實(shí)時(shí)計算,可以看作是搜索引擎的后端計算系統。搜索引擎的首要目標當然是為用戶(hù)提供準確、全面的搜索結果。因此,實(shí)時(shí)響應用戶(hù)查詢(xún)并提供準確結果構成了搜索引擎的前端計算系統。搜索引擎收到用戶(hù)的查詢(xún)請求后,首先需要對查詢(xún)詞進(jìn)行分析,并通過(guò)與用戶(hù)信息的結合,正確推斷出用戶(hù)的真實(shí)搜索意圖。之后,首先查看“緩存系統”維護的緩存。搜索引擎的緩存存儲了不同的搜索意圖及其對應的搜索結果。如果在緩存中找到滿(mǎn)足用戶(hù)需求的信息,則直接將搜索結果返回給用戶(hù)。這不僅節省了重復計算的資源消耗,同時(shí)也加快了整個(gè)搜索過(guò)程的響應速度。而如果緩存中沒(méi)有找到滿(mǎn)足用戶(hù)需求的信息,則需要使用“頁(yè)面排序”,根據用戶(hù)的搜索意圖實(shí)時(shí)計算哪些網(wǎng)頁(yè)滿(mǎn)足用戶(hù)需求,并將輸出排序為搜索結果。
  網(wǎng)頁(yè)排名最重要的兩個(gè)參考因素是“內容相似度”,即哪些網(wǎng)頁(yè)與用戶(hù)的搜索意圖密切相關(guān);另一個(gè)是網(wǎng)頁(yè)重要性,即哪些網(wǎng)頁(yè)質(zhì)量好或相對重要。這通??梢詮摹版溄臃治觥钡慕Y果中獲得。結合以上兩種考慮,前端系統將網(wǎng)頁(yè)進(jìn)行排序,作為搜索的最終結果。除了上述功能模塊外,搜索引擎的“反作弊”模塊近年來(lái)也越來(lái)越受到關(guān)注。搜索引擎作為網(wǎng)民上網(wǎng)的入口,對網(wǎng)絡(luò )流量的引導和分流至關(guān)重要,甚至可以說(shuō)起到了舉足輕重的作用。因此,各種“作弊” 方法逐漸流行起來(lái)。各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰已經(jīng)成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰已經(jīng)成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目1WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目)
  WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目1 WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目文檔版本:1.0.0.1 作者:Dane IT Training Group C++教學(xué)研發(fā)部作者:Min Wei 定稿日期:11月,星期五20, 2015 WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目21. 項目概述 互聯(lián)網(wǎng)產(chǎn)品種類(lèi)繁多,以產(chǎn)品為導向,以營(yíng)銷(xiāo)為導向,以技術(shù)為導向,但掌握技術(shù)的互聯(lián)網(wǎng)產(chǎn)品占比較高。更小。搜索引擎是目前互聯(lián)網(wǎng)產(chǎn)品中技術(shù)最先進(jìn)的產(chǎn)品,如果不是唯一的,至少也是其中之一。經(jīng)過(guò)十多年的發(fā)展,搜索引擎已經(jīng)成為互聯(lián)網(wǎng)的重要門(mén)戶(hù)之一。Twitter聯(lián)合創(chuàng )始人埃文威廉姆斯提出“
  WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)訓練項目3這樣海量的數據如何獲取、存儲和計算?如何快速響應用戶(hù)查詢(xún)?如何讓搜索結果盡可能滿(mǎn)足用戶(hù)對信息的需求?這些都是搜索引擎設計者必須面對的技術(shù)挑戰。下圖展示了一個(gè)通用搜索引擎的基本結構。商業(yè)級搜索引擎通常由許多獨立的模塊組成。每個(gè)模塊只負責搜索引擎的部分功能,相互配合形成一個(gè)完整的搜索引擎:搜索引擎的信息源來(lái)自網(wǎng)頁(yè),整個(gè)“網(wǎng)絡(luò )爬蟲(chóng)”的信息“互聯(lián)網(wǎng)”在本地獲取,由于網(wǎng)頁(yè)上的大部分內容完全相同或幾乎重復,“網(wǎng)頁(yè)去重”模塊會(huì )檢測到并刪除重復的內容。之后,搜索引擎將解析網(wǎng)頁(yè),提取網(wǎng)頁(yè)的主要內容,以及指向該網(wǎng)頁(yè)中收錄的其他頁(yè)面的所謂超鏈接。為了加快用戶(hù)查詢(xún)的響應速度,通過(guò)“倒排索引”的高效查詢(xún)數據結構保存網(wǎng)頁(yè)內容,同時(shí)保存網(wǎng)頁(yè)之間的鏈接關(guān)系。之所以保存鏈接關(guān)系,是因為在網(wǎng)頁(yè)的相關(guān)性排名階段,這個(gè)關(guān)系是可用的。頁(yè)面的相對重要性可以通過(guò)“鏈接分析”來(lái)判斷,這對于為用戶(hù)提供準確的搜索結果非常有幫助。由于網(wǎng)頁(yè)數量眾多,搜索引擎不僅需要保存網(wǎng)頁(yè)的原創(chuàng )信息,還需要保存一些中間處理結果。使用單臺計算機或少量計算機顯然是不現實(shí)的。
  谷歌等商業(yè)搜索引擎提供商為此開(kāi)發(fā)了一套完整的云存儲和云計算平臺,利用數以萬(wàn)計的普通PCWEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)訓練項目4,構建了海量信息作為搜索的可靠存儲和計算架構引擎及其相關(guān)應用的基礎支持。優(yōu)秀的云存儲和云計算平臺已成為大型商業(yè)搜索引擎的核心競爭力。以上就是搜索引擎獲取和存儲海量網(wǎng)頁(yè)相關(guān)信息的方式。由于這些功能不需要實(shí)時(shí)計算,可以看作是搜索引擎的后端計算系統。搜索引擎的首要目標當然是為用戶(hù)提供準確、全面的搜索結果。因此,實(shí)時(shí)響應用戶(hù)查詢(xún)并提供準確結果構成了搜索引擎的前端計算系統。搜索引擎收到用戶(hù)的查詢(xún)請求后,首先需要對查詢(xún)詞進(jìn)行分析,并通過(guò)與用戶(hù)信息的結合,正確推斷出用戶(hù)的真實(shí)搜索意圖。之后,首先查看“緩存系統”維護的緩存。搜索引擎的緩存存儲了不同的搜索意圖及其對應的搜索結果。如果在緩存中找到滿(mǎn)足用戶(hù)需求的信息,則直接將搜索結果返回給用戶(hù)。這不僅節省了重復計算的資源消耗,同時(shí)也加快了整個(gè)搜索過(guò)程的響應速度。而如果緩存中沒(méi)有找到滿(mǎn)足用戶(hù)需求的信息,則需要使用“頁(yè)面排序”,根據用戶(hù)的搜索意圖實(shí)時(shí)計算哪些網(wǎng)頁(yè)滿(mǎn)足用戶(hù)需求,并將輸出排序為搜索結果。
  網(wǎng)頁(yè)排名最重要的兩個(gè)參考因素是“內容相似度”,即哪些網(wǎng)頁(yè)與用戶(hù)的搜索意圖密切相關(guān);另一個(gè)是網(wǎng)頁(yè)重要性,即哪些網(wǎng)頁(yè)質(zhì)量好或相對重要。這通??梢詮摹版溄臃治觥钡慕Y果中獲得。結合以上兩種考慮,前端系統將網(wǎng)頁(yè)進(jìn)行排序,作為搜索的最終結果。除了上述功能模塊外,搜索引擎的“反作弊”模塊近年來(lái)也越來(lái)越受到關(guān)注。搜索引擎作為網(wǎng)民上網(wǎng)的入口,對網(wǎng)絡(luò )流量的引導和分流至關(guān)重要,甚至可以說(shuō)起到了舉足輕重的作用。因此,各種“作弊” 方法逐漸流行起來(lái)。各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰已經(jīng)成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰已經(jīng)成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián)

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(具有一定的參考價(jià)值安裝mysql需要屏蔽掉相關(guān)代碼:抓取網(wǎng)頁(yè)數據格式)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 58 次瀏覽 ? 2022-01-07 19:14 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(具有一定的參考價(jià)值安裝mysql需要屏蔽掉相關(guān)代碼:抓取網(wǎng)頁(yè)數據格式)
  本文文章主要介紹python2.7,詳細實(shí)現爬蟲(chóng)網(wǎng)頁(yè)數據。有一定的參考價(jià)值,感興趣的朋友可以參考
  最近剛學(xué)了Python,做了一個(gè)簡(jiǎn)單的爬蟲(chóng)。作為一個(gè)簡(jiǎn)單的demo,希望對我這樣的初學(xué)者有所幫助。
  代碼使用python制作的爬蟲(chóng)2.7抓取51job上的職位名稱(chēng)、公司名稱(chēng)、工資、發(fā)布時(shí)間等。
  直接上代碼。代碼中的注釋相當清楚。如果沒(méi)有安裝mysql,需要屏蔽相關(guān)代碼:
   #!/usr/bin/python # -*- coding: UTF-8 -*- from bs4 import BeautifulSoup import urllib import urllib2 import codecs import re import time import logging import MySQLdb class Jobs(object): # 初始化 """docstring for Jobs""" def __init__(self): super(Jobs, self).__init__() logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') #數據庫的操作,沒(méi)有mysql可以做屏蔽 self.db = MySQLdb.connect('127.0.0.1','root','rootroot','MySQL_Test',charset='utf8') self.cursor = self.db.cursor() #log日志的顯示 self.logger = logging.getLogger("sjk") self.logger.setLevel(level=logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler = logging.FileHandler('log.txt') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) self.logger.addHandler(handler) self.logger.info('初始化完成') # 模擬請求數據 def jobshtml(self, key, page='1'): try: self.logger.info('開(kāi)始請求第' + page + '頁(yè)') #網(wǎng)頁(yè)url searchurl = "https://search.51job.com/list/040000,000000,0000,00,9,99,{key},2,{page}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=" user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0' #設置請求頭 header = {'User-Agent': user_agent, 'Host': 'search.51job.com', 'Referer': 'https://www.51job.com/'} #拼接url finalUrl = searchurl.format(key=key, page=page) request = urllib2.Request(finalUrl, headers=header) response = urllib2.urlopen(request) #等待網(wǎng)頁(yè)加載完成 time.sleep(3) #gbk格式解碼 info = response.read().decode('gbk') self.logger.info('請求網(wǎng)頁(yè)網(wǎng)頁(yè)') self.decodeHtml(info=info, key=key, page=page) except urllib2.HTTPError as e: print e.reason # 解析網(wǎng)頁(yè)數據 def decodeHtml(self, info, key, page): self.logger.info('開(kāi)始解析網(wǎng)頁(yè)數據') #BeautifulSoup 解析網(wǎng)頁(yè) soup = BeautifulSoup(info, 'html.parser') #找到class = t1 t2 t3 t4 t5 的標簽數據 ps = soup.find_all(attrs={"class": re.compile(r'^t[1-5].*')}) #打開(kāi)txt文件 a+ 代表追加 f = codecs.open(key + '.txt', 'a+', 'UTF-8') #清除之前的數據信息 f.truncate() f.write('\n------------' + page + '--------------\n') count = 1 arr = [] #做一些字符串的處理,形成數據格式 iOS開(kāi)發(fā)工程師 有限公司 深圳-南山區 0.9-1.6萬(wàn)/月 05-16 for pi in ps: spe = " " finalstr = pi.getText().strip() arr.append(finalstr) if count % 5 == 0: #每一條數據插入數據庫,如果沒(méi)有安裝mysql 可以將當前行注釋掉 self.connectMySQL(arr=arr) arr = [] spe = "\n" writestr = finalstr + spe count += 1 f.write(writestr) f.close() self.logger.info('解析完成') #數據庫操作 沒(méi)有安裝mysql 可以屏蔽掉 def connectMySQL(self,arr): work=arr[0] company=arr[1] place=arr[2] salary=arr[3] time=arr[4] query = "select * from Jobs_tab where \ company_name='%s' and work_name='%s' and work_place='%s' \ and salary='%s' and time='%s'" %(company,work,place,salary,time) self.cursor.execute(query) queryresult = self.cursor.fetchall() #數據庫中不存在就插入數據 存在就可以更新數據 不過(guò)我這邊沒(méi)有寫(xiě) if len(queryresult) > 0: sql = "insert into Jobs_tab(work_name,company_name,work_place,salary\ ,time) values('%s','%s','%s','%s','%s')" %(work,company,place,salary,time) try: self.cursor.execute(sql) self.db.commit() except Exception as e: self.logger.info('寫(xiě)入數據庫失敗') #模擬登陸 # def login(self): # data = {'action':'save','isread':'on','loginname':'18086514327','password':'kui4131sjk'} # 開(kāi)始抓取 主函數 def run(self, key): # 只要前5頁(yè)的數據 key代表搜索工做類(lèi)型 這邊我是用的ios page是頁(yè)數 for x in xrange(1, 6): self.jobshtml(key=key, page=str(x)) self.logger.info('寫(xiě)入數據庫完成') self.db.close() if __name__ == '__main__': Jobs().run(key='iOS')
  這種方式抓取的網(wǎng)頁(yè)數據格式如下:
  
  以上是python2.7實(shí)現抓取網(wǎng)頁(yè)數據的詳細內容。更多詳情請關(guān)注其他相關(guān)html中文網(wǎng)站文章! 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(具有一定的參考價(jià)值安裝mysql需要屏蔽掉相關(guān)代碼:抓取網(wǎng)頁(yè)數據格式)
  本文文章主要介紹python2.7,詳細實(shí)現爬蟲(chóng)網(wǎng)頁(yè)數據。有一定的參考價(jià)值,感興趣的朋友可以參考
  最近剛學(xué)了Python,做了一個(gè)簡(jiǎn)單的爬蟲(chóng)。作為一個(gè)簡(jiǎn)單的demo,希望對我這樣的初學(xué)者有所幫助。
  代碼使用python制作的爬蟲(chóng)2.7抓取51job上的職位名稱(chēng)、公司名稱(chēng)、工資、發(fā)布時(shí)間等。
  直接上代碼。代碼中的注釋相當清楚。如果沒(méi)有安裝mysql,需要屏蔽相關(guān)代碼:
   #!/usr/bin/python # -*- coding: UTF-8 -*- from bs4 import BeautifulSoup import urllib import urllib2 import codecs import re import time import logging import MySQLdb class Jobs(object): # 初始化 """docstring for Jobs""" def __init__(self): super(Jobs, self).__init__() logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') #數據庫的操作,沒(méi)有mysql可以做屏蔽 self.db = MySQLdb.connect('127.0.0.1','root','rootroot','MySQL_Test',charset='utf8') self.cursor = self.db.cursor() #log日志的顯示 self.logger = logging.getLogger("sjk") self.logger.setLevel(level=logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler = logging.FileHandler('log.txt') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) self.logger.addHandler(handler) self.logger.info('初始化完成') # 模擬請求數據 def jobshtml(self, key, page='1'): try: self.logger.info('開(kāi)始請求第' + page + '頁(yè)') #網(wǎng)頁(yè)url searchurl = "https://search.51job.com/list/040000,000000,0000,00,9,99,{key},2,{page}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=" user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0' #設置請求頭 header = {'User-Agent': user_agent, 'Host': 'search.51job.com', 'Referer': 'https://www.51job.com/'} #拼接url finalUrl = searchurl.format(key=key, page=page) request = urllib2.Request(finalUrl, headers=header) response = urllib2.urlopen(request) #等待網(wǎng)頁(yè)加載完成 time.sleep(3) #gbk格式解碼 info = response.read().decode('gbk') self.logger.info('請求網(wǎng)頁(yè)網(wǎng)頁(yè)') self.decodeHtml(info=info, key=key, page=page) except urllib2.HTTPError as e: print e.reason # 解析網(wǎng)頁(yè)數據 def decodeHtml(self, info, key, page): self.logger.info('開(kāi)始解析網(wǎng)頁(yè)數據') #BeautifulSoup 解析網(wǎng)頁(yè) soup = BeautifulSoup(info, 'html.parser') #找到class = t1 t2 t3 t4 t5 的標簽數據 ps = soup.find_all(attrs={"class": re.compile(r'^t[1-5].*')}) #打開(kāi)txt文件 a+ 代表追加 f = codecs.open(key + '.txt', 'a+', 'UTF-8') #清除之前的數據信息 f.truncate() f.write('\n------------' + page + '--------------\n') count = 1 arr = [] #做一些字符串的處理,形成數據格式 iOS開(kāi)發(fā)工程師 有限公司 深圳-南山區 0.9-1.6萬(wàn)/月 05-16 for pi in ps: spe = " " finalstr = pi.getText().strip() arr.append(finalstr) if count % 5 == 0: #每一條數據插入數據庫,如果沒(méi)有安裝mysql 可以將當前行注釋掉 self.connectMySQL(arr=arr) arr = [] spe = "\n" writestr = finalstr + spe count += 1 f.write(writestr) f.close() self.logger.info('解析完成') #數據庫操作 沒(méi)有安裝mysql 可以屏蔽掉 def connectMySQL(self,arr): work=arr[0] company=arr[1] place=arr[2] salary=arr[3] time=arr[4] query = "select * from Jobs_tab where \ company_name='%s' and work_name='%s' and work_place='%s' \ and salary='%s' and time='%s'" %(company,work,place,salary,time) self.cursor.execute(query) queryresult = self.cursor.fetchall() #數據庫中不存在就插入數據 存在就可以更新數據 不過(guò)我這邊沒(méi)有寫(xiě) if len(queryresult) > 0: sql = "insert into Jobs_tab(work_name,company_name,work_place,salary\ ,time) values('%s','%s','%s','%s','%s')" %(work,company,place,salary,time) try: self.cursor.execute(sql) self.db.commit() except Exception as e: self.logger.info('寫(xiě)入數據庫失敗') #模擬登陸 # def login(self): # data = {'action':'save','isread':'on','loginname':'18086514327','password':'kui4131sjk'} # 開(kāi)始抓取 主函數 def run(self, key): # 只要前5頁(yè)的數據 key代表搜索工做類(lèi)型 這邊我是用的ios page是頁(yè)數 for x in xrange(1, 6): self.jobshtml(key=key, page=str(x)) self.logger.info('寫(xiě)入數據庫完成') self.db.close() if __name__ == '__main__': Jobs().run(key='iOS')
  這種方式抓取的網(wǎng)頁(yè)數據格式如下:
  
  以上是python2.7實(shí)現抓取網(wǎng)頁(yè)數據的詳細內容。更多詳情請關(guān)注其他相關(guān)html中文網(wǎng)站文章!

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(待URL隊列中的URL以什么樣的順序排列算法的思想 )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 67 次瀏覽 ? 2022-01-07 00:03 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(待URL隊列中的URL以什么樣的順序排列算法的思想
)
  遍歷策略是爬蟲(chóng)的核心問(wèn)題。在爬蟲(chóng)系統中,要爬取的URL隊列是一個(gè)非常重要的部分。URL隊列中要爬取的URL的順序也是一個(gè)很重要的問(wèn)題,因為它涉及到先爬取那個(gè)頁(yè)面,再爬到哪個(gè)頁(yè)面來(lái)確定這些URL的順序,這就是爬取策略爬蟲(chóng)。主要有以下幾種策略:
  1.深度優(yōu)先遍歷策略:
  深度優(yōu)先遍歷測試是指網(wǎng)絡(luò )爬蟲(chóng)會(huì )從起始頁(yè)開(kāi)始,逐個(gè)跟蹤每一個(gè)鏈接。處理完該行的鏈接后,會(huì )轉到下一個(gè)起始頁(yè),繼續跟蹤該鏈接。我們用下圖為例:
  走過(guò)的路徑是:AFG EHI BCD
  但是,我們在做爬蟲(chóng)的時(shí)候,深度優(yōu)先策略可能并不是所有情況都適用。如果深度優(yōu)先誤入無(wú)限分支(深度無(wú)限),則無(wú)法找到目標節點(diǎn)。
  二、廣度優(yōu)先遍歷策略:
  廣度優(yōu)先策略是根據樹(shù)的級別進(jìn)行搜索。如果在這一層沒(méi)有完成搜索,則不會(huì )進(jìn)入下一層搜索。即先完成一層搜索,再進(jìn)行下一層,也稱(chēng)為分層處理。我們也以上圖為例:
  遍歷路徑為:第一次遍歷:ABCDEF,第二次遍歷:GH,第三次遍歷:I
  然而,廣度優(yōu)先遍歷策略是一種盲目搜索。它沒(méi)有考慮結果的可能位置,會(huì )徹底搜索整個(gè)圖像,因此效率低。但是,如果您想覆蓋盡可能多的網(wǎng)頁(yè),廣度優(yōu)先搜索方法是更好的選擇。
  三、部分PageRank策略:
  PageRank算法的思想:對于下載的網(wǎng)頁(yè),連同要爬取的URL隊列的URL,組成一個(gè)網(wǎng)頁(yè)集,計算每個(gè)頁(yè)面的PageRank值(PageRank算法參考:PageRank算法-從原理到實(shí)現),計算完成后,根據頁(yè)面級別的值排列待爬取隊列中的URL,依次爬取URL頁(yè)面。
  如果每次都爬一個(gè)新的頁(yè)面,重新計算出來(lái)的PageRank值顯然效率太低了。折中是保存足夠的網(wǎng)頁(yè)來(lái)計算一次。
  下圖是web級策略的示意圖:
  為每下載 3 個(gè)網(wǎng)頁(yè)設置一個(gè)新的 PageRank 計算。此時(shí),本地已經(jīng)下載了3個(gè)網(wǎng)頁(yè){1,2,3}。這三個(gè)網(wǎng)頁(yè)中收錄的鏈接指向{4,5,6},即要爬取的URL隊列。如何確定下載順序?
  把這6個(gè)網(wǎng)頁(yè)組成一個(gè)新的集合,計算這個(gè)集合的PageRank值,這樣4、5、6就會(huì )得到各自對應的頁(yè)面排名值,從大到小排序,就可以得到假設的順序下載順序為5,4,6,當下載55頁(yè)時(shí),提取鏈接指向第8頁(yè),此時(shí)臨時(shí)分配PageRank值為8。如果該值大于 4 和 6 的 PageRank,則將首先下載第 8 頁(yè),依此類(lèi)推。循環(huán),即不完全頁(yè)面級策略的計算思想形成。
  四、OPIC策略策略(在線(xiàn)頁(yè)面重要性計算):
  基本思想:在算法開(kāi)始之前,給所有頁(yè)面相同的初始現金(cash)。下載一個(gè)頁(yè)面P后,將P的現金分配給所有從P解析出來(lái)的鏈接,并清空P的現金。所有要爬取的URL隊列中的頁(yè)面按照現金的數量進(jìn)行排序。
  與PageRank不同的是:PageRank每次都需要迭代計算,而OPIC策略不需要迭代過(guò)程,所以計算速度比PageRank快很多,適合實(shí)時(shí)計算。
  五、各大站優(yōu)先策略:
  策略:以網(wǎng)站為單位選擇網(wǎng)頁(yè)的重要性。對于URL隊列中待抓取的網(wǎng)頁(yè),根據自己的網(wǎng)站進(jìn)行分類(lèi)。如果哪個(gè)網(wǎng)站等待下載的頁(yè)面最多,先下載這些鏈接,本質(zhì)思路傾向于優(yōu)先下載大的網(wǎng)站。因為大 網(wǎng)站 往往收錄更多頁(yè)面。鑒于大型網(wǎng)站往往是知名公司的內容,而且他們的網(wǎng)頁(yè)一般都是高質(zhì)量的,這個(gè)想法很簡(jiǎn)單,但是有一定的依據。實(shí)驗表明,該算法的效果也應該略?xún)?yōu)于寬度優(yōu)先遍歷策略。
  花生代理動(dòng)態(tài)IP更改軟件可實(shí)現全國城市IP自動(dòng)切換,千萬(wàn)級動(dòng)態(tài)IP池,支持過(guò)濾,支持電腦手機多終端使用,數萬(wàn)條隨機撥號線(xiàn)路, 24小時(shí)不間斷提供動(dòng)態(tài)IP。
   查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(待URL隊列中的URL以什么樣的順序排列算法的思想
)
  遍歷策略是爬蟲(chóng)的核心問(wèn)題。在爬蟲(chóng)系統中,要爬取的URL隊列是一個(gè)非常重要的部分。URL隊列中要爬取的URL的順序也是一個(gè)很重要的問(wèn)題,因為它涉及到先爬取那個(gè)頁(yè)面,再爬到哪個(gè)頁(yè)面來(lái)確定這些URL的順序,這就是爬取策略爬蟲(chóng)。主要有以下幾種策略:
  1.深度優(yōu)先遍歷策略:
  深度優(yōu)先遍歷測試是指網(wǎng)絡(luò )爬蟲(chóng)會(huì )從起始頁(yè)開(kāi)始,逐個(gè)跟蹤每一個(gè)鏈接。處理完該行的鏈接后,會(huì )轉到下一個(gè)起始頁(yè),繼續跟蹤該鏈接。我們用下圖為例:
  走過(guò)的路徑是:AFG EHI BCD
  但是,我們在做爬蟲(chóng)的時(shí)候,深度優(yōu)先策略可能并不是所有情況都適用。如果深度優(yōu)先誤入無(wú)限分支(深度無(wú)限),則無(wú)法找到目標節點(diǎn)。
  二、廣度優(yōu)先遍歷策略:
  廣度優(yōu)先策略是根據樹(shù)的級別進(jìn)行搜索。如果在這一層沒(méi)有完成搜索,則不會(huì )進(jìn)入下一層搜索。即先完成一層搜索,再進(jìn)行下一層,也稱(chēng)為分層處理。我們也以上圖為例:
  遍歷路徑為:第一次遍歷:ABCDEF,第二次遍歷:GH,第三次遍歷:I
  然而,廣度優(yōu)先遍歷策略是一種盲目搜索。它沒(méi)有考慮結果的可能位置,會(huì )徹底搜索整個(gè)圖像,因此效率低。但是,如果您想覆蓋盡可能多的網(wǎng)頁(yè),廣度優(yōu)先搜索方法是更好的選擇。
  三、部分PageRank策略:
  PageRank算法的思想:對于下載的網(wǎng)頁(yè),連同要爬取的URL隊列的URL,組成一個(gè)網(wǎng)頁(yè)集,計算每個(gè)頁(yè)面的PageRank值(PageRank算法參考:PageRank算法-從原理到實(shí)現),計算完成后,根據頁(yè)面級別的值排列待爬取隊列中的URL,依次爬取URL頁(yè)面。
  如果每次都爬一個(gè)新的頁(yè)面,重新計算出來(lái)的PageRank值顯然效率太低了。折中是保存足夠的網(wǎng)頁(yè)來(lái)計算一次。
  下圖是web級策略的示意圖:
  為每下載 3 個(gè)網(wǎng)頁(yè)設置一個(gè)新的 PageRank 計算。此時(shí),本地已經(jīng)下載了3個(gè)網(wǎng)頁(yè){1,2,3}。這三個(gè)網(wǎng)頁(yè)中收錄的鏈接指向{4,5,6},即要爬取的URL隊列。如何確定下載順序?
  把這6個(gè)網(wǎng)頁(yè)組成一個(gè)新的集合,計算這個(gè)集合的PageRank值,這樣4、5、6就會(huì )得到各自對應的頁(yè)面排名值,從大到小排序,就可以得到假設的順序下載順序為5,4,6,當下載55頁(yè)時(shí),提取鏈接指向第8頁(yè),此時(shí)臨時(shí)分配PageRank值為8。如果該值大于 4 和 6 的 PageRank,則將首先下載第 8 頁(yè),依此類(lèi)推。循環(huán),即不完全頁(yè)面級策略的計算思想形成。
  四、OPIC策略策略(在線(xiàn)頁(yè)面重要性計算):
  基本思想:在算法開(kāi)始之前,給所有頁(yè)面相同的初始現金(cash)。下載一個(gè)頁(yè)面P后,將P的現金分配給所有從P解析出來(lái)的鏈接,并清空P的現金。所有要爬取的URL隊列中的頁(yè)面按照現金的數量進(jìn)行排序。
  與PageRank不同的是:PageRank每次都需要迭代計算,而OPIC策略不需要迭代過(guò)程,所以計算速度比PageRank快很多,適合實(shí)時(shí)計算。
  五、各大站優(yōu)先策略:
  策略:以網(wǎng)站為單位選擇網(wǎng)頁(yè)的重要性。對于URL隊列中待抓取的網(wǎng)頁(yè),根據自己的網(wǎng)站進(jìn)行分類(lèi)。如果哪個(gè)網(wǎng)站等待下載的頁(yè)面最多,先下載這些鏈接,本質(zhì)思路傾向于優(yōu)先下載大的網(wǎng)站。因為大 網(wǎng)站 往往收錄更多頁(yè)面。鑒于大型網(wǎng)站往往是知名公司的內容,而且他們的網(wǎng)頁(yè)一般都是高質(zhì)量的,這個(gè)想法很簡(jiǎn)單,但是有一定的依據。實(shí)驗表明,該算法的效果也應該略?xún)?yōu)于寬度優(yōu)先遍歷策略。
  花生代理動(dòng)態(tài)IP更改軟件可實(shí)現全國城市IP自動(dòng)切換,千萬(wàn)級動(dòng)態(tài)IP池,支持過(guò)濾,支持電腦手機多終端使用,數萬(wàn)條隨機撥號線(xiàn)路, 24小時(shí)不間斷提供動(dòng)態(tài)IP。
  

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 循環(huán)來(lái)實(shí)現所有網(wǎng)頁(yè)的爬取總結(圖))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 51 次瀏覽 ? 2022-01-06 17:16 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
循環(huán)來(lái)實(shí)現所有網(wǎng)頁(yè)的爬取總結(圖))
  public static List ParseLink(string html)
{
List res = new List();
var doc = new HtmlDocument();
doc.LoadHtml(html);
var linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
foreach (var linkNode in linkNodes)
{
string link = linkNode.GetAttributeValue("href", "");
if (link.StartsWith("/lishi/beijing/month"))
{
res.Add(link);
}
}
return res;
}
  到目前為止,我們已經(jīng)解析出網(wǎng)站上所有收錄過(guò)去時(shí)間段的鏈接。接下來(lái),我們需要分析每個(gè)鏈接對應的特定網(wǎng)頁(yè)的結構,從中獲取天氣信息。
  分析天氣網(wǎng)頁(yè)的結構
  上一個(gè)鏈接是站點(diǎn)鏈接。上一節分析了特定天氣網(wǎng)頁(yè)對應的鏈接集合,例如。
  
  現在我們需要從這個(gè)頁(yè)面分析天氣,就像解析站點(diǎn)結構中的目標鏈接一樣,在瀏覽器中觀(guān)察Html代碼,發(fā)現天氣的目標內容在一個(gè)表格中,所以我們只需要選擇節點(diǎn),因為一個(gè)節點(diǎn)代表某一天的天氣(天氣狀況、溫度和風(fēng)向)。
  
  public static void ParseDailyWeather(string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
var rows = doc.DocumentNode.SelectNodes("//tr");
StringBuilder sb = new StringBuilder();
rows.RemoveAt(0);
foreach (var row in rows)
{
var cols = row.SelectNodes("td");
foreach (var col in cols)
{
string temp = col.InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
sb.Append(temp + ",");
}
sb.Append("\r\n");
}
FileStream fs = new FileStream("output.csv", FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("gbk"));
sw.WriteLine(sb);
sw.Close();
fs.Close();
}
  最后,為了實(shí)現對網(wǎng)站的爬取,需要一個(gè)循環(huán)來(lái)實(shí)現對所有網(wǎng)頁(yè)的爬取
  public static void ParseWebsite(string url)
{
string html = Weather.GetHtml(url);
var links = Weather.ParseLink(html);
foreach (var link in links)
{
url = "http://www.tianqihoubao.com" + link;
html = Weather.GetHtml(url);
Weather.ParseDailyWeather(html);
}
}
  總結
  靜態(tài)網(wǎng)頁(yè)的爬取比較簡(jiǎn)單,可以分為以下幾個(gè)步驟 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
循環(huán)來(lái)實(shí)現所有網(wǎng)頁(yè)的爬取總結(圖))
  public static List ParseLink(string html)
{
List res = new List();
var doc = new HtmlDocument();
doc.LoadHtml(html);
var linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
foreach (var linkNode in linkNodes)
{
string link = linkNode.GetAttributeValue("href", "");
if (link.StartsWith("/lishi/beijing/month"))
{
res.Add(link);
}
}
return res;
}
  到目前為止,我們已經(jīng)解析出網(wǎng)站上所有收錄過(guò)去時(shí)間段的鏈接。接下來(lái),我們需要分析每個(gè)鏈接對應的特定網(wǎng)頁(yè)的結構,從中獲取天氣信息。
  分析天氣網(wǎng)頁(yè)的結構
  上一個(gè)鏈接是站點(diǎn)鏈接。上一節分析了特定天氣網(wǎng)頁(yè)對應的鏈接集合,例如。
  
  現在我們需要從這個(gè)頁(yè)面分析天氣,就像解析站點(diǎn)結構中的目標鏈接一樣,在瀏覽器中觀(guān)察Html代碼,發(fā)現天氣的目標內容在一個(gè)表格中,所以我們只需要選擇節點(diǎn),因為一個(gè)節點(diǎn)代表某一天的天氣(天氣狀況、溫度和風(fēng)向)。
  
  public static void ParseDailyWeather(string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
var rows = doc.DocumentNode.SelectNodes("//tr");
StringBuilder sb = new StringBuilder();
rows.RemoveAt(0);
foreach (var row in rows)
{
var cols = row.SelectNodes("td");
foreach (var col in cols)
{
string temp = col.InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
sb.Append(temp + ",");
}
sb.Append("\r\n");
}
FileStream fs = new FileStream("output.csv", FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("gbk"));
sw.WriteLine(sb);
sw.Close();
fs.Close();
}
  最后,為了實(shí)現對網(wǎng)站的爬取,需要一個(gè)循環(huán)來(lái)實(shí)現對所有網(wǎng)頁(yè)的爬取
  public static void ParseWebsite(string url)
{
string html = Weather.GetHtml(url);
var links = Weather.ParseLink(html);
foreach (var link in links)
{
url = "http://www.tianqihoubao.com" + link;
html = Weather.GetHtml(url);
Weather.ParseDailyWeather(html);
}
}
  總結
  靜態(tài)網(wǎng)頁(yè)的爬取比較簡(jiǎn)單,可以分為以下幾個(gè)步驟

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下新建項目(Project)文件的作用和作用)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 62 次瀏覽 ? 2022-01-04 02:18 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下新建項目(Project)文件的作用和作用)
  網(wǎng)絡(luò )爬蟲(chóng)是在互聯(lián)網(wǎng)上爬取數據的程序,用它來(lái)爬取特定網(wǎng)頁(yè)的 HTML 數據。雖然我們使用一些庫來(lái)開(kāi)發(fā)爬蟲(chóng)程序,但是使用框架可以大大提高效率,縮短開(kāi)發(fā)時(shí)間。 Scrapy是用Python編寫(xiě)的,輕量級,簡(jiǎn)單輕便,使用起來(lái)非常方便。使用Scrapy可以很方便的完成在線(xiàn)數據采集的工作,它已經(jīng)為我們完成了很多工作,不需要花大力氣去開(kāi)發(fā)。
  首先,我們必須回答一個(gè)問(wèn)題。
  問(wèn):網(wǎng)站安裝到爬蟲(chóng)需要幾步?
  答案很簡(jiǎn)單,四步:
  新建項目(Project):新建一個(gè)爬蟲(chóng)項目
  清除目標(Items):清除你要爬取的目標
  制作蜘蛛:制作蜘蛛并開(kāi)始抓取網(wǎng)頁(yè)
  存儲內容(管道):設計管道來(lái)存儲抓取的內容
  好了,基本流程確定了,接下來(lái)就是一步步完成了。
  1.新建項目(Project)
  在空目錄下按住Shift鍵右鍵,選擇“在此處打開(kāi)命令窗口”,輸入命令:
  代碼如下:
  scrapy startproject 教程
  其中,tutorial 為項目名稱(chēng)。
  可以看到會(huì )創(chuàng )建一個(gè)tutorial文件夾,目錄結構如下:
  代碼如下:
  教程/
  scrapy.cfg
  教程/
  __init__.py
  items.py
  pipelines.py
  settings.py
  蜘蛛/
  __init__.py
  ...
  簡(jiǎn)單介紹一下各個(gè)文件的作用:
  scrapy.cfg:項目配置文件
  tutorial/:項目的Python模塊,代碼會(huì )從這里引用
  tutorial/items.py:項目的items文件
  tutorial/pipelines.py:項目的流水線(xiàn)文件
  tutorial/settings.py:項目設置文件
  tutorial/spiders/:蜘蛛存放的目錄
  2.明確目標(Item)
  在 Scrapy 中,items 是用于加載爬取內容的容器,有點(diǎn)像 Python 中的 Dic,它是一個(gè)字典,但提供了一些額外的保護以減少錯誤。
  一般來(lái)說(shuō)item可以用scrapy.item.Item類(lèi)創(chuàng )建,scrapy.item.Field對象用來(lái)定義屬性(可以理解為類(lèi)似于ORM的映射關(guān)系)。
  接下來(lái),我們開(kāi)始構建項目模型。
  首先,我們想要的是:
  姓名(姓名)
  鏈接(網(wǎng)址)
  說(shuō)明
  修改tutorial目錄下的items.py文件,在原來(lái)的類(lèi)之后添加我們自己的類(lèi)。
  因為我們要抓取網(wǎng)站的內容,所以可以命名為DmozItem:
  代碼如下:
  # 在此處定義已抓取項目的模型
  #
  # 查看文檔:
  #
  從scrapy.item導入項目,字段
  class TutorialItem(Item):
  # 在此處定義您的項目的字段,例如:
  # name = Field()
  通過(guò)
  類(lèi) DmozItem(Item):
  title = Field()
  link = Field()
  desc = Field()
  乍一看可能有點(diǎn)難以理解,但定義這些項目會(huì )讓您在使用其他組件時(shí)了解您的項目是什么。
  Item 可以簡(jiǎn)單理解為一個(gè)封裝的類(lèi)對象。
  3.制作蜘蛛(Spider)
  做一個(gè)爬蟲(chóng),一般有兩個(gè)步驟:先爬后取。
  也就是說(shuō),首先你需要獲取整個(gè)網(wǎng)頁(yè)的所有內容,然后取出對你有用的部分。
  3.1 次攀爬
  Spider 是用戶(hù)編寫(xiě)的一個(gè)類(lèi),用于從域(或域組)中獲取信息。
  它們定義了用于下載的 URL 列表、跟蹤鏈接的方案以及解析 Web 內容以提取項目的方法。
  要創(chuàng )建蜘蛛,您必須使用scrapy.spider.BaseSpider 創(chuàng )建一個(gè)子類(lèi)并確定三個(gè)必需屬性:
  name:爬蟲(chóng)的標識名,必須是唯一的。您必須在不同的爬蟲(chóng)中定義不同的名稱(chēng)。
  start_urls:抓取的 URL 列表。爬蟲(chóng)從這里開(kāi)始抓取數據,所以第一次下載數據會(huì )從這些url開(kāi)始。其他子 URL 將從這些起始 URL 繼承。
  parse():解析方法,調用時(shí)將每個(gè)URL返回的Response對象作為唯一參數傳入,負責解析匹配捕獲的數據(解析為item),跟蹤更多的URL。
<p>這里可以參考寬度爬蟲(chóng)教程中提到的思路幫助理解,教程傳輸:【Java】知乎下巴第五集:使用HttpClient工具包和寬度爬蟲(chóng)。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下新建項目(Project)文件的作用和作用)
  網(wǎng)絡(luò )爬蟲(chóng)是在互聯(lián)網(wǎng)上爬取數據的程序,用它來(lái)爬取特定網(wǎng)頁(yè)的 HTML 數據。雖然我們使用一些庫來(lái)開(kāi)發(fā)爬蟲(chóng)程序,但是使用框架可以大大提高效率,縮短開(kāi)發(fā)時(shí)間。 Scrapy是用Python編寫(xiě)的,輕量級,簡(jiǎn)單輕便,使用起來(lái)非常方便。使用Scrapy可以很方便的完成在線(xiàn)數據采集的工作,它已經(jīng)為我們完成了很多工作,不需要花大力氣去開(kāi)發(fā)。
  首先,我們必須回答一個(gè)問(wèn)題。
  問(wèn):網(wǎng)站安裝到爬蟲(chóng)需要幾步?
  答案很簡(jiǎn)單,四步:
  新建項目(Project):新建一個(gè)爬蟲(chóng)項目
  清除目標(Items):清除你要爬取的目標
  制作蜘蛛:制作蜘蛛并開(kāi)始抓取網(wǎng)頁(yè)
  存儲內容(管道):設計管道來(lái)存儲抓取的內容
  好了,基本流程確定了,接下來(lái)就是一步步完成了。
  1.新建項目(Project)
  在空目錄下按住Shift鍵右鍵,選擇“在此處打開(kāi)命令窗口”,輸入命令:
  代碼如下:
  scrapy startproject 教程
  其中,tutorial 為項目名稱(chēng)。
  可以看到會(huì )創(chuàng )建一個(gè)tutorial文件夾,目錄結構如下:
  代碼如下:
  教程/
  scrapy.cfg
  教程/
  __init__.py
  items.py
  pipelines.py
  settings.py
  蜘蛛/
  __init__.py
  ...
  簡(jiǎn)單介紹一下各個(gè)文件的作用:
  scrapy.cfg:項目配置文件
  tutorial/:項目的Python模塊,代碼會(huì )從這里引用
  tutorial/items.py:項目的items文件
  tutorial/pipelines.py:項目的流水線(xiàn)文件
  tutorial/settings.py:項目設置文件
  tutorial/spiders/:蜘蛛存放的目錄
  2.明確目標(Item)
  在 Scrapy 中,items 是用于加載爬取內容的容器,有點(diǎn)像 Python 中的 Dic,它是一個(gè)字典,但提供了一些額外的保護以減少錯誤。
  一般來(lái)說(shuō)item可以用scrapy.item.Item類(lèi)創(chuàng )建,scrapy.item.Field對象用來(lái)定義屬性(可以理解為類(lèi)似于ORM的映射關(guān)系)。
  接下來(lái),我們開(kāi)始構建項目模型。
  首先,我們想要的是:
  姓名(姓名)
  鏈接(網(wǎng)址)
  說(shuō)明
  修改tutorial目錄下的items.py文件,在原來(lái)的類(lèi)之后添加我們自己的類(lèi)。
  因為我們要抓取網(wǎng)站的內容,所以可以命名為DmozItem:
  代碼如下:
  # 在此處定義已抓取項目的模型
  #
  # 查看文檔:
  #
  從scrapy.item導入項目,字段
  class TutorialItem(Item):
  # 在此處定義您的項目的字段,例如:
  # name = Field()
  通過(guò)
  類(lèi) DmozItem(Item):
  title = Field()
  link = Field()
  desc = Field()
  乍一看可能有點(diǎn)難以理解,但定義這些項目會(huì )讓您在使用其他組件時(shí)了解您的項目是什么。
  Item 可以簡(jiǎn)單理解為一個(gè)封裝的類(lèi)對象。
  3.制作蜘蛛(Spider)
  做一個(gè)爬蟲(chóng),一般有兩個(gè)步驟:先爬后取。
  也就是說(shuō),首先你需要獲取整個(gè)網(wǎng)頁(yè)的所有內容,然后取出對你有用的部分。
  3.1 次攀爬
  Spider 是用戶(hù)編寫(xiě)的一個(gè)類(lèi),用于從域(或域組)中獲取信息。
  它們定義了用于下載的 URL 列表、跟蹤鏈接的方案以及解析 Web 內容以提取項目的方法。
  要創(chuàng )建蜘蛛,您必須使用scrapy.spider.BaseSpider 創(chuàng )建一個(gè)子類(lèi)并確定三個(gè)必需屬性:
  name:爬蟲(chóng)的標識名,必須是唯一的。您必須在不同的爬蟲(chóng)中定義不同的名稱(chēng)。
  start_urls:抓取的 URL 列表。爬蟲(chóng)從這里開(kāi)始抓取數據,所以第一次下載數據會(huì )從這些url開(kāi)始。其他子 URL 將從這些起始 URL 繼承。
  parse():解析方法,調用時(shí)將每個(gè)URL返回的Response對象作為唯一參數傳入,負責解析匹配捕獲的數據(解析為item),跟蹤更多的URL。
<p>這里可以參考寬度爬蟲(chóng)教程中提到的思路幫助理解,教程傳輸:【Java】知乎下巴第五集:使用HttpClient工具包和寬度爬蟲(chóng)。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(網(wǎng)絡(luò )爬蟲(chóng)提取出該網(wǎng)頁(yè)中的新一輪URL的抓取環(huán)路)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 53 次瀏覽 ? 2022-01-03 21:17 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(網(wǎng)絡(luò )爬蟲(chóng)提取出該網(wǎng)頁(yè)中的新一輪URL的抓取環(huán)路)
  一般我們要抓取一個(gè)網(wǎng)站的所有網(wǎng)址,先傳遞起始網(wǎng)址,然后通過(guò)網(wǎng)絡(luò )爬蟲(chóng)提取網(wǎng)頁(yè)中的所有網(wǎng)址鏈接,然后進(jìn)行每一個(gè)網(wǎng)址抓取的提取,在每個(gè)網(wǎng)頁(yè)中提取新一輪的 URL,依此類(lèi)推??傮w感覺(jué)是從上到下爬取網(wǎng)頁(yè)中的鏈接。理論上,您可以抓取整個(gè)網(wǎng)站上的所有鏈接。但問(wèn)題來(lái)了。 網(wǎng)站 中的網(wǎng)頁(yè)鏈接有循環(huán)。
  
  比如在網(wǎng)站的首頁(yè),我們可以看到首頁(yè)的鏈接,然后我們也可能在子頁(yè)面中看到首頁(yè)的鏈接,可能會(huì )有對應的子子-頁(yè)面。該鏈接指向主頁(yè)。按照我們之前的邏輯,抓取每個(gè)網(wǎng)頁(yè)中的所有鏈接,然后繼續抓取所有鏈接。以首頁(yè)為例。我們爬行的第一件事就是它。然后子頁(yè)面里面有一個(gè)到首頁(yè)的鏈接,子子頁(yè)面也有一個(gè)到首頁(yè)的鏈接。進(jìn)行這種爬取會(huì )導致網(wǎng)頁(yè)的重復爬取。其他的根本就沒(méi)有抓取網(wǎng)頁(yè)的機會(huì ),無(wú)法想象~~解決這個(gè)問(wèn)題不難。這時(shí)候就需要用到網(wǎng)絡(luò )爬蟲(chóng)中一個(gè)很重要的知識點(diǎn),就是網(wǎng)頁(yè)去重。
  
  先介紹一個(gè)簡(jiǎn)單的思路,也是一個(gè)常用的思路。我們將抓取到的網(wǎng)頁(yè)放到一個(gè)列表中。以首頁(yè)為例。抓取主頁(yè)后,將主頁(yè)放入列表中。那么當我們抓取子頁(yè)面的時(shí)候,如果再次觸摸首頁(yè),并且首頁(yè)已經(jīng)被抓取了。這時(shí)候可以跳過(guò)首頁(yè),繼續爬取其他網(wǎng)頁(yè),避免重復爬取首頁(yè)。這樣在爬取整個(gè)站點(diǎn)的時(shí)候就不會(huì )出現循環(huán)了。路。以這個(gè)思路為出發(fā)點(diǎn),將訪(fǎng)問(wèn)過(guò)的URL保存在數據庫中,當獲取到下一個(gè)URL時(shí),到數據庫中查看該URL是否被訪(fǎng)問(wèn)過(guò)。雖然數據庫有緩存,但是在數據庫中查詢(xún)每個(gè)URL時(shí),效率會(huì )下降的很快,所以這個(gè)策略用的不多,但是是最簡(jiǎn)單的方法。
  
  第二種方法是將訪(fǎng)問(wèn)過(guò)的URL保存在集合中。這種方式獲取URL的速度非???,基本不用查詢(xún)。但是這種方法有一個(gè)缺點(diǎn)。保存集合中的URL實(shí)際上是將其保存在內存中。當 URL 數據量較大(如 1 億)時(shí),內存壓力會(huì )增加。對于小型爬蟲(chóng),這種方法是非??扇〉?,但對于大型網(wǎng)絡(luò )爬蟲(chóng)來(lái)說(shuō),這種方法很難實(shí)現。
  
  第三種方式是對md5中的字符進(jìn)行編碼,md5編碼可以將字符縮減為固定長(cháng)度。一般來(lái)說(shuō),md5編碼的長(cháng)度在128bit左右,約等于16byte。在縮減之前,假設一個(gè)URL占用的內存大小為50字節,1字節等于2字節,相當于100字節??梢钥闯?,經(jīng)過(guò)md5編碼后,節省了大量的內存空間。通過(guò)md5,可以將任意長(cháng)度的URL壓縮成相同長(cháng)度的md5字符串,不會(huì )有重復,可以達到去重的效果。這樣,在很大程度上節省了內存。 scrapy框架采用的方法與md5方法有些類(lèi)似。因此,一般情況下,即使URL的量級達到億級,scrapy占用的內存也比set方法高。少很多。
  
  第四種方式是使用位圖方法進(jìn)一步壓縮字符。這種方法的意思是在計算機中申請8位,即8位,每一位用0或1表示,是計算機中的最小單位。如果8位組成一個(gè)字節,一位代表一個(gè)URL,為什么一位可以確定一個(gè)URL?因為我們可以對一個(gè) URL 執行哈希函數,然后將其映射到位。例如,假設我們有8個(gè)URL,對應8位,然后通過(guò)位上的0和1的狀態(tài),就可以表明這個(gè)URL是否存在,這種方法可以進(jìn)一步壓縮內存。
  
  但是位圖方法有一個(gè)非常大的缺點(diǎn),就是它的沖突會(huì )非常高,因為使用了同一個(gè)hash函數,很有可能將兩個(gè)不同的URL或者多個(gè)不同的URL映射到一個(gè)位置。其實(shí)這個(gè)hash方法也是set方法的一個(gè)實(shí)現原理。它對 URL 執行函數計算,然后將其映射到位的位置。因此,這種方法可以大大壓縮內存。簡(jiǎn)單計算一下,還是用1億個(gè)URL來(lái)計算,相當于1億比特。通過(guò)計算,相當于1250萬(wàn)字節。除以1024之后,大約是12207KB,也就是大約12MB的空間。在實(shí)際過(guò)程中,內存占用可能會(huì )大于12MB,但即便如此,與前三種方法相比,這種方法又大大減少了內存占用的空間。但同時(shí),與此方法沖突的可能性非常高,因此此方法不是很適用。那么有沒(méi)有辦法進(jìn)一步優(yōu)化位圖,這是一種重內存壓縮的方法,以減少沖突的可能性?答案是肯定的,是第五種方式。
  
  第五種方法是bloomfilter,改進(jìn)位圖。它可以通過(guò)多個(gè)散列函數減少沖突的可能性。這樣一來(lái),一方面不僅可以減少位圖方法的內存,另一方面,同時(shí)也起到了減少沖突的作用。關(guān)于bloomfilter的原理和實(shí)現,后期我一定會(huì )介紹給大家的。今天就讓大家有個(gè)簡(jiǎn)單的了解。 Bloomfilter適用于大型網(wǎng)絡(luò )爬蟲(chóng),尤其是數量級超大的時(shí)候。布隆過(guò)濾器方法可以事半功倍。也經(jīng)常與分布式爬蟲(chóng)配合,達到爬取的目的。
  
  我是來(lái)為大家介紹爬網(wǎng)過(guò)程中去重策略的五種方法的。如果你不明白,你應該知道它。在科普下,問(wèn)題不大。希望對朋友的學(xué)習有所幫助。 . 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(網(wǎng)絡(luò )爬蟲(chóng)提取出該網(wǎng)頁(yè)中的新一輪URL的抓取環(huán)路)
  一般我們要抓取一個(gè)網(wǎng)站的所有網(wǎng)址,先傳遞起始網(wǎng)址,然后通過(guò)網(wǎng)絡(luò )爬蟲(chóng)提取網(wǎng)頁(yè)中的所有網(wǎng)址鏈接,然后進(jìn)行每一個(gè)網(wǎng)址抓取的提取,在每個(gè)網(wǎng)頁(yè)中提取新一輪的 URL,依此類(lèi)推??傮w感覺(jué)是從上到下爬取網(wǎng)頁(yè)中的鏈接。理論上,您可以抓取整個(gè)網(wǎng)站上的所有鏈接。但問(wèn)題來(lái)了。 網(wǎng)站 中的網(wǎng)頁(yè)鏈接有循環(huán)。
  
  比如在網(wǎng)站的首頁(yè),我們可以看到首頁(yè)的鏈接,然后我們也可能在子頁(yè)面中看到首頁(yè)的鏈接,可能會(huì )有對應的子子-頁(yè)面。該鏈接指向主頁(yè)。按照我們之前的邏輯,抓取每個(gè)網(wǎng)頁(yè)中的所有鏈接,然后繼續抓取所有鏈接。以首頁(yè)為例。我們爬行的第一件事就是它。然后子頁(yè)面里面有一個(gè)到首頁(yè)的鏈接,子子頁(yè)面也有一個(gè)到首頁(yè)的鏈接。進(jìn)行這種爬取會(huì )導致網(wǎng)頁(yè)的重復爬取。其他的根本就沒(méi)有抓取網(wǎng)頁(yè)的機會(huì ),無(wú)法想象~~解決這個(gè)問(wèn)題不難。這時(shí)候就需要用到網(wǎng)絡(luò )爬蟲(chóng)中一個(gè)很重要的知識點(diǎn),就是網(wǎng)頁(yè)去重。
  
  先介紹一個(gè)簡(jiǎn)單的思路,也是一個(gè)常用的思路。我們將抓取到的網(wǎng)頁(yè)放到一個(gè)列表中。以首頁(yè)為例。抓取主頁(yè)后,將主頁(yè)放入列表中。那么當我們抓取子頁(yè)面的時(shí)候,如果再次觸摸首頁(yè),并且首頁(yè)已經(jīng)被抓取了。這時(shí)候可以跳過(guò)首頁(yè),繼續爬取其他網(wǎng)頁(yè),避免重復爬取首頁(yè)。這樣在爬取整個(gè)站點(diǎn)的時(shí)候就不會(huì )出現循環(huán)了。路。以這個(gè)思路為出發(fā)點(diǎn),將訪(fǎng)問(wèn)過(guò)的URL保存在數據庫中,當獲取到下一個(gè)URL時(shí),到數據庫中查看該URL是否被訪(fǎng)問(wèn)過(guò)。雖然數據庫有緩存,但是在數據庫中查詢(xún)每個(gè)URL時(shí),效率會(huì )下降的很快,所以這個(gè)策略用的不多,但是是最簡(jiǎn)單的方法。
  
  第二種方法是將訪(fǎng)問(wèn)過(guò)的URL保存在集合中。這種方式獲取URL的速度非???,基本不用查詢(xún)。但是這種方法有一個(gè)缺點(diǎn)。保存集合中的URL實(shí)際上是將其保存在內存中。當 URL 數據量較大(如 1 億)時(shí),內存壓力會(huì )增加。對于小型爬蟲(chóng),這種方法是非??扇〉?,但對于大型網(wǎng)絡(luò )爬蟲(chóng)來(lái)說(shuō),這種方法很難實(shí)現。
  
  第三種方式是對md5中的字符進(jìn)行編碼,md5編碼可以將字符縮減為固定長(cháng)度。一般來(lái)說(shuō),md5編碼的長(cháng)度在128bit左右,約等于16byte。在縮減之前,假設一個(gè)URL占用的內存大小為50字節,1字節等于2字節,相當于100字節??梢钥闯?,經(jīng)過(guò)md5編碼后,節省了大量的內存空間。通過(guò)md5,可以將任意長(cháng)度的URL壓縮成相同長(cháng)度的md5字符串,不會(huì )有重復,可以達到去重的效果。這樣,在很大程度上節省了內存。 scrapy框架采用的方法與md5方法有些類(lèi)似。因此,一般情況下,即使URL的量級達到億級,scrapy占用的內存也比set方法高。少很多。
  
  第四種方式是使用位圖方法進(jìn)一步壓縮字符。這種方法的意思是在計算機中申請8位,即8位,每一位用0或1表示,是計算機中的最小單位。如果8位組成一個(gè)字節,一位代表一個(gè)URL,為什么一位可以確定一個(gè)URL?因為我們可以對一個(gè) URL 執行哈希函數,然后將其映射到位。例如,假設我們有8個(gè)URL,對應8位,然后通過(guò)位上的0和1的狀態(tài),就可以表明這個(gè)URL是否存在,這種方法可以進(jìn)一步壓縮內存。
  
  但是位圖方法有一個(gè)非常大的缺點(diǎn),就是它的沖突會(huì )非常高,因為使用了同一個(gè)hash函數,很有可能將兩個(gè)不同的URL或者多個(gè)不同的URL映射到一個(gè)位置。其實(shí)這個(gè)hash方法也是set方法的一個(gè)實(shí)現原理。它對 URL 執行函數計算,然后將其映射到位的位置。因此,這種方法可以大大壓縮內存。簡(jiǎn)單計算一下,還是用1億個(gè)URL來(lái)計算,相當于1億比特。通過(guò)計算,相當于1250萬(wàn)字節。除以1024之后,大約是12207KB,也就是大約12MB的空間。在實(shí)際過(guò)程中,內存占用可能會(huì )大于12MB,但即便如此,與前三種方法相比,這種方法又大大減少了內存占用的空間。但同時(shí),與此方法沖突的可能性非常高,因此此方法不是很適用。那么有沒(méi)有辦法進(jìn)一步優(yōu)化位圖,這是一種重內存壓縮的方法,以減少沖突的可能性?答案是肯定的,是第五種方式。
  
  第五種方法是bloomfilter,改進(jìn)位圖。它可以通過(guò)多個(gè)散列函數減少沖突的可能性。這樣一來(lái),一方面不僅可以減少位圖方法的內存,另一方面,同時(shí)也起到了減少沖突的作用。關(guān)于bloomfilter的原理和實(shí)現,后期我一定會(huì )介紹給大家的。今天就讓大家有個(gè)簡(jiǎn)單的了解。 Bloomfilter適用于大型網(wǎng)絡(luò )爬蟲(chóng),尤其是數量級超大的時(shí)候。布隆過(guò)濾器方法可以事半功倍。也經(jīng)常與分布式爬蟲(chóng)配合,達到爬取的目的。
  
  我是來(lái)為大家介紹爬網(wǎng)過(guò)程中去重策略的五種方法的。如果你不明白,你應該知道它。在科普下,問(wèn)題不大。希望對朋友的學(xué)習有所幫助。 .

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(這請我吃一頓飯不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,不僅適合新手練習爬蟲(chóng))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 70 次瀏覽 ? 2022-01-01 12:21 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(這請我吃一頓飯不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,不僅適合新手練習爬蟲(chóng))
  暑假已經(jīng)開(kāi)始很久了,但是還有很多朋友沒(méi)有找到暑期實(shí)習?前幾天,我朋友的弟弟想在暑假找一份實(shí)習來(lái)鍛煉自己,但面對網(wǎng)上成千上萬(wàn)的實(shí)習招聘信息,簡(jiǎn)直讓人望而生畏。然后我的朋友給我發(fā)了一條“幫助”信息。了解了大致情況后,我立即用爬蟲(chóng)爬取了實(shí)習網(wǎng)的信息,并貼出了數據結果。問(wèn)題在幾分鐘內得到解決。請我吃飯會(huì )不會(huì )過(guò)分?
  
  本爬蟲(chóng)實(shí)戰教程不僅適合新手練習爬蟲(chóng),也適合需要找實(shí)習信息的朋友!
  希望看完這篇文章后,能夠清楚的了解整個(gè)爬蟲(chóng)流程,能夠獨立完成。其次,可以通過(guò)自己的爬蟲(chóng)實(shí)戰獲取自己想要的信息。
  好了,話(huà)不多說(shuō),開(kāi)始吧!
  內容主要分為三部分:
  1、頁(yè)面分析
  2、爬蟲(chóng)步驟詳解
  一、目標頁(yè)面分析
  首先我們要知道我們的爬蟲(chóng)目標是什么?俗話(huà)說(shuō),知己知彼,百戰不殆。我們已經(jīng)知道我們要爬取的頁(yè)面是“實(shí)習網(wǎng)”,所以我們首先要去實(shí)習網(wǎng)看看里面有什么數據。
  實(shí)習網(wǎng)址:
  頁(yè)面如下:
  
  比如我們要找的職位是“品牌運營(yíng)”職位的數據。因此,直接在網(wǎng)頁(yè)的搜索框中輸入品牌操作即可。你會(huì )發(fā)現url變了!
  
  注意:我們要抓取的頁(yè)面是這個(gè)頁(yè)面:品牌運營(yíng)
  在我們的抓取頁(yè)面中,我們需要觀(guān)察有哪些數據,一個(gè)頁(yè)面中有幾條數據。這一點(diǎn)很重要,關(guān)系到后續的代碼編寫(xiě),可以幫助你檢查頁(yè)面上的信息是否全部被抓取。
  此時(shí)需要注意的是,我們所在的頁(yè)面是“一級頁(yè)面”。在瀏覽過(guò)程中,我們點(diǎn)擊任意一個(gè)帖子進(jìn)入,就會(huì )顯示“二級頁(yè)面”。這時(shí)候你也會(huì )發(fā)現url又變了。
  比如我們點(diǎn)擊一??個(gè)品牌運營(yíng)實(shí)習,二級頁(yè)面會(huì )自動(dòng)跳轉到這個(gè),并且會(huì )生成一個(gè)新的鏈接。如圖:
  
  應該在頁(yè)面上抓取哪些信息?
  我們在分析中發(fā)現,有的信息在一級頁(yè)面,有的在二級頁(yè)面。
  在一級頁(yè)面上我們可以得到什么樣的信息?如圖:
  
  一共有五個(gè)有效數據:職位、公司名稱(chēng)、學(xué)歷、薪水、地址
  在二級頁(yè)面中,我們來(lái)看看可以獲取哪些有效數據、字段和比例。如果你覺(jué)得階段很重要,也可以把它包括在爬蟲(chóng)的范圍內,不過(guò)我個(gè)人認為這不影響實(shí)習,畢竟不是找正式工作不會(huì )有很大影響。相反,招聘的實(shí)習生人數更為重要。新兵人數這里沒(méi)有顯示,無(wú)法在圖片上顯示,以后可以添加。
  
  這里,我們需要抓取一共7條數據,加上“人數”一共8條數據,就是我們爬蟲(chóng)最終的目標數據。
  抓取“靜態(tài)”網(wǎng)頁(yè)
  這里分析一下什么是靜態(tài)網(wǎng)頁(yè),什么是動(dòng)態(tài)網(wǎng)頁(yè)。對于靜態(tài)網(wǎng)頁(yè),隨著(zhù)html代碼的生成,頁(yè)面的內容和顯示效果基本不會(huì )發(fā)生變化——除非你修改頁(yè)面代碼。這不是動(dòng)態(tài)網(wǎng)頁(yè)的情況。雖然頁(yè)面代碼沒(méi)有改變,但顯示的內容會(huì )隨著(zhù)時(shí)間、環(huán)境或數據庫操作的結果而改變。
  它們的區別在于:靜態(tài)網(wǎng)頁(yè)中的數據是一勞永逸的,也就是說(shuō)一次性全部給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數據是隨著(zhù)頁(yè)面的逐步加載而逐漸呈現的,即靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù)無(wú)法獲取其中的所有數據。
  值得強調的是,不要將動(dòng)態(tài)網(wǎng)頁(yè)與動(dòng)態(tài)頁(yè)面內容混淆。這里所說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)動(dòng)態(tài)效果無(wú)關(guān)。動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文本內容,也可以收錄各種動(dòng)畫(huà)內容。這些只是網(wǎng)頁(yè)的細節。內容的呈現形式,無(wú)論網(wǎng)頁(yè)是否有動(dòng)態(tài)效果,只要是使用動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè),都可以稱(chēng)為動(dòng)態(tài)網(wǎng)頁(yè)。
  點(diǎn)擊“鼠標右鍵”,點(diǎn)擊“查看網(wǎng)頁(yè)源代碼”,最終效果如圖(部分截圖):
  
  這是最終反饋給你的數據。如果你發(fā)現你想要的所有數據都在里面,你可以說(shuō)它是一個(gè)靜態(tài)頁(yè)面。如果不是,則將其視為“動(dòng)態(tài)頁(yè)面”。
  今天的案例是一個(gè)靜態(tài)網(wǎng)頁(yè)。
  大家都知道,在編寫(xiě)代碼之前,我們首先要知道我們將使用哪些方法、庫和模塊來(lái)幫助您解析數據。常用的解析數據的方法有:re正則表達式、xpath、beatifulsoup、pyquery等
  我們需要使用的是xpath分析方法來(lái)分析定位數據。
  二、爬蟲(chóng)代碼說(shuō)明1、導入相關(guān)庫
  爬蟲(chóng)的第一步是考慮在爬蟲(chóng)過(guò)程中需要哪些庫。你要知道python是一種依賴(lài)很多庫的語(yǔ)言。沒(méi)有庫的 Python 是不完整的。
  import pandas as pd # 用于數據存儲
import requests # 用于請求網(wǎng)頁(yè)
import chardet # 用于修改編碼
import re # 用于提取數據
from lxml import etree # 解析數據的庫
import time # 可以粗糙模擬人為請求網(wǎng)頁(yè)的速度
import warnings # 忽略代碼運行時(shí)候的警告信息
warnings.filterwarnings("ignore")
  2、請求一級頁(yè)面源碼
  url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text)
  這里要注意兩個(gè)地方①②。 ①處有兩個(gè)參數,一個(gè)是headers,一個(gè)是verify。其中,headers是一種反亂碼措施,使瀏覽器認為爬蟲(chóng)不是爬蟲(chóng),而是人們在正常使用瀏覽器請求網(wǎng)頁(yè)。驗證是忽略安全證書(shū)提示。某些網(wǎng)頁(yè)將被視為不安全并會(huì )提示您。記住這個(gè)參數就行了。
  在②處,我們已經(jīng)獲得了網(wǎng)頁(yè)的源代碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和您電腦的解析方式,可能會(huì )出現不一致的情況,返回結果會(huì )造成亂碼。此時(shí)需要修改編碼方式,chardet庫可以幫你自動(dòng)檢測網(wǎng)頁(yè)源代碼的編碼方式。 (一個(gè)非常有用的檢測文檔編碼的三方庫chardet)
  3、解析一級頁(yè)面網(wǎng)頁(yè)中的信息
  # 1. 公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)
# 4. 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)
# 5. 薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
  4、獲取二級頁(yè)面的鏈接
  deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
  這時(shí)候可以看到我直接用xpath對一級頁(yè)面中的數據分析進(jìn)行了分析。代碼最后可以看到:我們已經(jīng)獲取到了二級頁(yè)面的鏈接,為我們后續抓取二級頁(yè)面的信息做準備。
  分析二級頁(yè)面網(wǎng)頁(yè)中的信息
  需求列表 = []
  area_list = []
  scale_list = []
  對于 deep_url_list 中的 deep_url:
  rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人數
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)
# 7. 公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# 8. 公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
  需要注意的是,二級頁(yè)面也是一個(gè)頁(yè)面,爬取其中的數據時(shí)需要請求該頁(yè)面。因此,①②③處的代碼完全相同。
  5、翻頁(yè)操作
  隨意復制幾個(gè)不同頁(yè)面的URL,觀(guān)察差異。這里可以看到page參數后面的數字不同,是第一頁(yè),數字就是數字。
  x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,21)]
  由于我們抓取了 20 頁(yè)數據,這里構造了 20 個(gè) URL,它們都存在于 url_list 列表中。
  現在讓我們看一下整個(gè)代碼。不再用文字描述,直接在代碼中寫(xiě)注釋。
  import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 請求獲取一級頁(yè)面的源代碼
url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)

# 獲取一級頁(yè)面中的信息:一共有5個(gè)信息。
# ①公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]

#③地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)

# ④ 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)


# ⑤薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
# ⑥獲取二級頁(yè)面的內容
deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]

demand_list = []
area_list = []
scale_list = []
# 獲取二級頁(yè)面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)

#① 需要幾人
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)

# ②公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# ③公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)

demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)

# ④ 將每個(gè)頁(yè)面獲取到的所有數據,存儲到DataFrame中。
data = pd.DataFrame({&#39;公司名&#39;:company_list,&#39;崗位名&#39;:job_list,&#39;地址&#39;:address_list,"學(xué)歷":degree_list,
&#39;薪資&#39;:salary_list,&#39;崗位需求量&#39;:demand_list,&#39;公司領(lǐng)域&#39;:area_list,&#39;公司規模&#39;:scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=[&#39;公司名&#39;,&#39;崗位名&#39;,&#39;地址&#39;,"學(xué)歷",&#39;薪資&#39;,&#39;崗位需求量&#39;,&#39;公司領(lǐng)域&#39;,&#39;公司規模&#39;])
# 這里進(jìn)行“翻頁(yè)”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存數據
res.to_csv(&#39;aliang.csv&#39;,encoding=&#39;utf_8_sig&#39;)
  有了這樣的一套,爬蟲(chóng)的思路會(huì )不會(huì )瞬間清晰?眼睛:我會(huì )的!手:我還是不會(huì )。多練。初學(xué)者不要急于求成,項目不多,但要精髓。吃一個(gè)比看十個(gè)更有效。
  來(lái)自: 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(這請我吃一頓飯不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,不僅適合新手練習爬蟲(chóng))
  暑假已經(jīng)開(kāi)始很久了,但是還有很多朋友沒(méi)有找到暑期實(shí)習?前幾天,我朋友的弟弟想在暑假找一份實(shí)習來(lái)鍛煉自己,但面對網(wǎng)上成千上萬(wàn)的實(shí)習招聘信息,簡(jiǎn)直讓人望而生畏。然后我的朋友給我發(fā)了一條“幫助”信息。了解了大致情況后,我立即用爬蟲(chóng)爬取了實(shí)習網(wǎng)的信息,并貼出了數據結果。問(wèn)題在幾分鐘內得到解決。請我吃飯會(huì )不會(huì )過(guò)分?
  
  本爬蟲(chóng)實(shí)戰教程不僅適合新手練習爬蟲(chóng),也適合需要找實(shí)習信息的朋友!
  希望看完這篇文章后,能夠清楚的了解整個(gè)爬蟲(chóng)流程,能夠獨立完成。其次,可以通過(guò)自己的爬蟲(chóng)實(shí)戰獲取自己想要的信息。
  好了,話(huà)不多說(shuō),開(kāi)始吧!
  內容主要分為三部分:
  1、頁(yè)面分析
  2、爬蟲(chóng)步驟詳解
  一、目標頁(yè)面分析
  首先我們要知道我們的爬蟲(chóng)目標是什么?俗話(huà)說(shuō),知己知彼,百戰不殆。我們已經(jīng)知道我們要爬取的頁(yè)面是“實(shí)習網(wǎng)”,所以我們首先要去實(shí)習網(wǎng)看看里面有什么數據。
  實(shí)習網(wǎng)址:
  頁(yè)面如下:
  
  比如我們要找的職位是“品牌運營(yíng)”職位的數據。因此,直接在網(wǎng)頁(yè)的搜索框中輸入品牌操作即可。你會(huì )發(fā)現url變了!
  
  注意:我們要抓取的頁(yè)面是這個(gè)頁(yè)面:品牌運營(yíng)
  在我們的抓取頁(yè)面中,我們需要觀(guān)察有哪些數據,一個(gè)頁(yè)面中有幾條數據。這一點(diǎn)很重要,關(guān)系到后續的代碼編寫(xiě),可以幫助你檢查頁(yè)面上的信息是否全部被抓取。
  此時(shí)需要注意的是,我們所在的頁(yè)面是“一級頁(yè)面”。在瀏覽過(guò)程中,我們點(diǎn)擊任意一個(gè)帖子進(jìn)入,就會(huì )顯示“二級頁(yè)面”。這時(shí)候你也會(huì )發(fā)現url又變了。
  比如我們點(diǎn)擊一??個(gè)品牌運營(yíng)實(shí)習,二級頁(yè)面會(huì )自動(dòng)跳轉到這個(gè),并且會(huì )生成一個(gè)新的鏈接。如圖:
  
  應該在頁(yè)面上抓取哪些信息?
  我們在分析中發(fā)現,有的信息在一級頁(yè)面,有的在二級頁(yè)面。
  在一級頁(yè)面上我們可以得到什么樣的信息?如圖:
  
  一共有五個(gè)有效數據:職位、公司名稱(chēng)、學(xué)歷、薪水、地址
  在二級頁(yè)面中,我們來(lái)看看可以獲取哪些有效數據、字段和比例。如果你覺(jué)得階段很重要,也可以把它包括在爬蟲(chóng)的范圍內,不過(guò)我個(gè)人認為這不影響實(shí)習,畢竟不是找正式工作不會(huì )有很大影響。相反,招聘的實(shí)習生人數更為重要。新兵人數這里沒(méi)有顯示,無(wú)法在圖片上顯示,以后可以添加。
  
  這里,我們需要抓取一共7條數據,加上“人數”一共8條數據,就是我們爬蟲(chóng)最終的目標數據。
  抓取“靜態(tài)”網(wǎng)頁(yè)
  這里分析一下什么是靜態(tài)網(wǎng)頁(yè),什么是動(dòng)態(tài)網(wǎng)頁(yè)。對于靜態(tài)網(wǎng)頁(yè),隨著(zhù)html代碼的生成,頁(yè)面的內容和顯示效果基本不會(huì )發(fā)生變化——除非你修改頁(yè)面代碼。這不是動(dòng)態(tài)網(wǎng)頁(yè)的情況。雖然頁(yè)面代碼沒(méi)有改變,但顯示的內容會(huì )隨著(zhù)時(shí)間、環(huán)境或數據庫操作的結果而改變。
  它們的區別在于:靜態(tài)網(wǎng)頁(yè)中的數據是一勞永逸的,也就是說(shuō)一次性全部給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數據是隨著(zhù)頁(yè)面的逐步加載而逐漸呈現的,即靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù)無(wú)法獲取其中的所有數據。
  值得強調的是,不要將動(dòng)態(tài)網(wǎng)頁(yè)與動(dòng)態(tài)頁(yè)面內容混淆。這里所說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)動(dòng)態(tài)效果無(wú)關(guān)。動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文本內容,也可以收錄各種動(dòng)畫(huà)內容。這些只是網(wǎng)頁(yè)的細節。內容的呈現形式,無(wú)論網(wǎng)頁(yè)是否有動(dòng)態(tài)效果,只要是使用動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè),都可以稱(chēng)為動(dòng)態(tài)網(wǎng)頁(yè)。
  點(diǎn)擊“鼠標右鍵”,點(diǎn)擊“查看網(wǎng)頁(yè)源代碼”,最終效果如圖(部分截圖):
  
  這是最終反饋給你的數據。如果你發(fā)現你想要的所有數據都在里面,你可以說(shuō)它是一個(gè)靜態(tài)頁(yè)面。如果不是,則將其視為“動(dòng)態(tài)頁(yè)面”。
  今天的案例是一個(gè)靜態(tài)網(wǎng)頁(yè)。
  大家都知道,在編寫(xiě)代碼之前,我們首先要知道我們將使用哪些方法、庫和模塊來(lái)幫助您解析數據。常用的解析數據的方法有:re正則表達式、xpath、beatifulsoup、pyquery等
  我們需要使用的是xpath分析方法來(lái)分析定位數據。
  二、爬蟲(chóng)代碼說(shuō)明1、導入相關(guān)庫
  爬蟲(chóng)的第一步是考慮在爬蟲(chóng)過(guò)程中需要哪些庫。你要知道python是一種依賴(lài)很多庫的語(yǔ)言。沒(méi)有庫的 Python 是不完整的。
  import pandas as pd # 用于數據存儲
import requests # 用于請求網(wǎng)頁(yè)
import chardet # 用于修改編碼
import re # 用于提取數據
from lxml import etree # 解析數據的庫
import time # 可以粗糙模擬人為請求網(wǎng)頁(yè)的速度
import warnings # 忽略代碼運行時(shí)候的警告信息
warnings.filterwarnings("ignore")
  2、請求一級頁(yè)面源碼
  url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text)
  這里要注意兩個(gè)地方①②。 ①處有兩個(gè)參數,一個(gè)是headers,一個(gè)是verify。其中,headers是一種反亂碼措施,使瀏覽器認為爬蟲(chóng)不是爬蟲(chóng),而是人們在正常使用瀏覽器請求網(wǎng)頁(yè)。驗證是忽略安全證書(shū)提示。某些網(wǎng)頁(yè)將被視為不安全并會(huì )提示您。記住這個(gè)參數就行了。
  在②處,我們已經(jīng)獲得了網(wǎng)頁(yè)的源代碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和您電腦的解析方式,可能會(huì )出現不一致的情況,返回結果會(huì )造成亂碼。此時(shí)需要修改編碼方式,chardet庫可以幫你自動(dòng)檢測網(wǎng)頁(yè)源代碼的編碼方式。 (一個(gè)非常有用的檢測文檔編碼的三方庫chardet)
  3、解析一級頁(yè)面網(wǎng)頁(yè)中的信息
  # 1. 公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)
# 4. 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)
# 5. 薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
  4、獲取二級頁(yè)面的鏈接
  deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
  這時(shí)候可以看到我直接用xpath對一級頁(yè)面中的數據分析進(jìn)行了分析。代碼最后可以看到:我們已經(jīng)獲取到了二級頁(yè)面的鏈接,為我們后續抓取二級頁(yè)面的信息做準備。
  分析二級頁(yè)面網(wǎng)頁(yè)中的信息
  需求列表 = []
  area_list = []
  scale_list = []
  對于 deep_url_list 中的 deep_url:
  rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人數
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)
# 7. 公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# 8. 公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
  需要注意的是,二級頁(yè)面也是一個(gè)頁(yè)面,爬取其中的數據時(shí)需要請求該頁(yè)面。因此,①②③處的代碼完全相同。
  5、翻頁(yè)操作
  隨意復制幾個(gè)不同頁(yè)面的URL,觀(guān)察差異。這里可以看到page參數后面的數字不同,是第一頁(yè),數字就是數字。
  x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,21)]
  由于我們抓取了 20 頁(yè)數據,這里構造了 20 個(gè) URL,它們都存在于 url_list 列表中。
  現在讓我們看一下整個(gè)代碼。不再用文字描述,直接在代碼中寫(xiě)注釋。
  import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 請求獲取一級頁(yè)面的源代碼
url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)

# 獲取一級頁(yè)面中的信息:一共有5個(gè)信息。
# ①公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]

#③地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)

# ④ 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)


# ⑤薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
# ⑥獲取二級頁(yè)面的內容
deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]

demand_list = []
area_list = []
scale_list = []
# 獲取二級頁(yè)面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)

#① 需要幾人
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)

# ②公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# ③公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)

demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)

# ④ 將每個(gè)頁(yè)面獲取到的所有數據,存儲到DataFrame中。
data = pd.DataFrame({&#39;公司名&#39;:company_list,&#39;崗位名&#39;:job_list,&#39;地址&#39;:address_list,"學(xué)歷":degree_list,
&#39;薪資&#39;:salary_list,&#39;崗位需求量&#39;:demand_list,&#39;公司領(lǐng)域&#39;:area_list,&#39;公司規模&#39;:scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=[&#39;公司名&#39;,&#39;崗位名&#39;,&#39;地址&#39;,"學(xué)歷",&#39;薪資&#39;,&#39;崗位需求量&#39;,&#39;公司領(lǐng)域&#39;,&#39;公司規模&#39;])
# 這里進(jìn)行“翻頁(yè)”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存數據
res.to_csv(&#39;aliang.csv&#39;,encoding=&#39;utf_8_sig&#39;)
  有了這樣的一套,爬蟲(chóng)的思路會(huì )不會(huì )瞬間清晰?眼睛:我會(huì )的!手:我還是不會(huì )。多練。初學(xué)者不要急于求成,項目不多,但要精髓。吃一個(gè)比看十個(gè)更有效。
  來(lái)自:

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),利用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 57 次瀏覽 ? 2021-12-31 13:29 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),利用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序)
  摘要:基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),采用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序,對廣電總局電視劇電子政務(wù)平臺的電視劇記錄數據進(jìn)行爬取。此外,還對抓取的電視劇記錄數據進(jìn)行了統計分析,得出了相關(guān)結論。
  關(guān)鍵詞:Python;爬蟲(chóng);數據分析
  中文圖書(shū)館分類(lèi)號:TP311.11 文獻識別碼:A 文章 編號:1007-9416 (2017)09-0035-02
  1 爬蟲(chóng)技術(shù)介紹
  網(wǎng)絡(luò )爬蟲(chóng)是一種通過(guò)既定規則自動(dòng)抓取網(wǎng)絡(luò )信息的計算機程序。爬蟲(chóng)的目的是將目標網(wǎng)頁(yè)數據下載到本地進(jìn)行后續的數據分析。爬蟲(chóng)技術(shù)的興起源于海量網(wǎng)絡(luò )數據的可用性。通過(guò)爬蟲(chóng)技術(shù),我們可以輕松獲取網(wǎng)絡(luò )數據,通過(guò)數據分析得出有價(jià)值的結論。
  Python語(yǔ)言簡(jiǎn)單易用,現成的爬蟲(chóng)框架和工具包降低了使用門(mén)檻。正則表達式的具體使用,使得數據采集工作生動(dòng)有趣。
  2 案例分析
  2.1 網(wǎng)頁(yè)描述
  目標數據是歷年全國電視劇拍攝的記錄數據。數據來(lái)源于廣電總局電視劇電子政務(wù)平臺公開(kāi)信息,如圖1所示。 具體網(wǎng)址:“http:
  // /tims/site/views/applications.shanty? 應用名稱(chēng)=注釋”。
  我們需要爬取歷年來(lái)每個(gè)月的記錄公開(kāi)信息列表數據,如圖2所示,并進(jìn)行匯總分析。
  2.2 爬蟲(chóng)程序的設計與實(shí)現
  首先,我們使用 BeautifulSoup 解析器來(lái)解析 URL 的文本信息。在分析了網(wǎng)頁(yè)的 HTML 文本和頁(yè)面規則后,我們制定了以下步驟來(lái)捕獲目標數據。
 ?、僮ト〉谝豁?yè)碼和最后頁(yè)碼后,循環(huán)抓取列表頁(yè)信息; 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),利用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序)
  摘要:基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),采用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序,對廣電總局電視劇電子政務(wù)平臺的電視劇記錄數據進(jìn)行爬取。此外,還對抓取的電視劇記錄數據進(jìn)行了統計分析,得出了相關(guān)結論。
  關(guān)鍵詞:Python;爬蟲(chóng);數據分析
  中文圖書(shū)館分類(lèi)號:TP311.11 文獻識別碼:A 文章 編號:1007-9416 (2017)09-0035-02
  1 爬蟲(chóng)技術(shù)介紹
  網(wǎng)絡(luò )爬蟲(chóng)是一種通過(guò)既定規則自動(dòng)抓取網(wǎng)絡(luò )信息的計算機程序。爬蟲(chóng)的目的是將目標網(wǎng)頁(yè)數據下載到本地進(jìn)行后續的數據分析。爬蟲(chóng)技術(shù)的興起源于海量網(wǎng)絡(luò )數據的可用性。通過(guò)爬蟲(chóng)技術(shù),我們可以輕松獲取網(wǎng)絡(luò )數據,通過(guò)數據分析得出有價(jià)值的結論。
  Python語(yǔ)言簡(jiǎn)單易用,現成的爬蟲(chóng)框架和工具包降低了使用門(mén)檻。正則表達式的具體使用,使得數據采集工作生動(dòng)有趣。
  2 案例分析
  2.1 網(wǎng)頁(yè)描述
  目標數據是歷年全國電視劇拍攝的記錄數據。數據來(lái)源于廣電總局電視劇電子政務(wù)平臺公開(kāi)信息,如圖1所示。 具體網(wǎng)址:“http:
  // /tims/site/views/applications.shanty? 應用名稱(chēng)=注釋”。
  我們需要爬取歷年來(lái)每個(gè)月的記錄公開(kāi)信息列表數據,如圖2所示,并進(jìn)行匯總分析。
  2.2 爬蟲(chóng)程序的設計與實(shí)現
  首先,我們使用 BeautifulSoup 解析器來(lái)解析 URL 的文本信息。在分析了網(wǎng)頁(yè)的 HTML 文本和頁(yè)面規則后,我們制定了以下步驟來(lái)捕獲目標數據。
 ?、僮ト〉谝豁?yè)碼和最后頁(yè)碼后,循環(huán)抓取列表頁(yè)信息;

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何獲取JS生成的JS和網(wǎng)頁(yè)內容和服務(wù)端?)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 54 次瀏覽 ? 2022-01-21 01:00 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何獲取JS生成的JS和網(wǎng)頁(yè)內容和服務(wù)端?)
  最近需要在一個(gè)網(wǎng)站中下載一批數據。但是輸入一個(gè)查詢(xún),返回30000到40000個(gè)結果,每次只能導出500個(gè),而且每次都要輸入下載項的范圍!就這樣點(diǎn)擊下載,我不要命了。所以我想自動(dòng)化這個(gè)過(guò)程。
  我的需求主要是兩點(diǎn):1.要求自動(dòng)化程度高。最好有一個(gè)成熟的界面,直接模擬瀏覽器的鼠標和鍵盤(pán)動(dòng)作,比如輸入文本框、選擇下拉列表、單選按鈕、復選框、點(diǎn)擊按鈕等。2.效率不高。因為我想要的數據量比較少。3. python下的框架。因為我通常主要使用python。
  對網(wǎng)站技術(shù)了解不多,對網(wǎng)站只有兩個(gè)經(jīng)驗:自己開(kāi)發(fā)了一個(gè)很簡(jiǎn)單的Android客戶(hù)端,用python的scrapy框架寫(xiě)了一個(gè)爬蟲(chóng)自動(dòng)爬取新聞. 所以了解客戶(hù)端和服務(wù)器的一些基本交互方法,了解如何分析網(wǎng)頁(yè)源代碼,了解xpath語(yǔ)法。
  當我第一次開(kāi)始解決這個(gè)問(wèn)題時(shí),我什至不知道要搜索什么。知乎的這個(gè)文章提供了很多有用的信息:“Python爬蟲(chóng)如何獲取JS生成的URL和網(wǎng)頁(yè)內容?” 隨之權衡了很多方法,最終選擇了Selenium。主要優(yōu)點(diǎn)是學(xué)習成本最小,代碼實(shí)現速度快。缺點(diǎn)是爬取效率低。如果您想成為富有成效的朋友,您將不得不花一些時(shí)間學(xué)習更復雜的工具包。
  網(wǎng)站技術(shù)
  如果要自動(dòng)爬取網(wǎng)頁(yè),需要了解一些基礎知識,這樣做會(huì )比較快。這里簡(jiǎn)單介紹一下相關(guān)知識。
  1. 請求/響應
  request 是客戶(hù)端向服務(wù)器發(fā)出的請求。輸入一個(gè) URL 對應一個(gè)請求動(dòng)作,這是最直觀(guān)的。爬取靜態(tài)網(wǎng)頁(yè)的內容,只需要知道網(wǎng)址即可。但是,當前的許多網(wǎng)頁(yè)都是動(dòng)態(tài)的。指向或點(diǎn)擊網(wǎng)頁(yè)中的某些元素也會(huì )觸發(fā)請求動(dòng)作,從而使網(wǎng)頁(yè)可以動(dòng)態(tài)更新部分內容,而這些內容不能直接從靜態(tài)網(wǎng)頁(yè)中獲取。這種技術(shù)叫做AJAX,但我對它了解不多。這里的問(wèn)題是我們可能甚至不知道 URL 是什么,所以我們需要一些可以處理動(dòng)態(tài)內容的高級接口。
  response 是服務(wù)器返回給客戶(hù)端的內容。如果要獲取靜態(tài)網(wǎng)頁(yè)內容,直接從請求中獲取即可。
  
  2. 分析網(wǎng)頁(yè)源碼
  如果我們想抓取網(wǎng)頁(yè)上的某一部分信息,我們需要知道如何定位它。這里需要 HTML 和 XPATH 知識。不知道的可以去w3school在線(xiàn)教程:
  查看網(wǎng)頁(yè)的源代碼,將鼠標指針指向網(wǎng)頁(yè)的任意位置,或指向目標元素。右鍵單擊并從下拉列表中選擇“檢查元素”。下面是我右鍵“百度”顯示的網(wǎng)頁(yè)源代碼,是HTML格式的,我們可以看到對應的HTML代碼。要提取它,我們可能需要 div//@[class="head_wrapper"]//input[@type="submit"] 的語(yǔ)句,它是 XPATH 語(yǔ)法,易于掌握。知道如何分析網(wǎng)頁(yè),我們更進(jìn)一步。
  
  3. 網(wǎng)頁(yè)基本元素操作
  前進(jìn)、后退、刷新、打開(kāi)新標簽、輸入網(wǎng)址等;
  文本框輸入、選擇下拉列表、單選按鈕、復選框、點(diǎn)擊按鈕等。
  我這里只需要模擬這么多操作,可以參考對應的selenium接口。
  4. Selenium 簡(jiǎn)介
  底線(xiàn):Selenium 是用于 Web 應用程序的自動(dòng)化測試工具集。
  很多話(huà):Selenium 誕生于 2004 年,當時(shí) ThoughtWorks 的 Jason Huggins 正在測試一個(gè)內部應用程序。作為一個(gè)聰明人,他意識到他的時(shí)間應該比手動(dòng)測試每個(gè)更改更有價(jià)值。他開(kāi)發(fā)了一個(gè)驅動(dòng)頁(yè)面交互的 Javascript 庫,允許多個(gè)瀏覽器自動(dòng)返回測試結果。該庫最終成為 Selenium 的核心,它是 Selenium RC(遠程控制)和 Selenium IDE 所有功能的基礎。
  實(shí)戰練習1.分析數據采集過(guò)程
  我的數據采集過(guò)程如下:
  在A(yíng)頁(yè)輸入查詢(xún)語(yǔ)句,點(diǎn)擊提交;瀏覽器自動(dòng)打開(kāi)新頁(yè)面,跳轉到新頁(yè)面B,在文本框中輸入下載項的范圍;單擊導出彈出一個(gè)彈出窗口,然后單擊下拉列表,單選按鈕,選取框進(jìn)行一些選擇,然后單擊下載。然后瀏覽器開(kāi)始下載文件。
  頁(yè)面 A
  
  B頁(yè)
  
  2. 爬取過(guò)程 A. 安裝 Selenium
  Selenium 支持多種瀏覽器,我選擇 google chrome。下載鏈接:。同時(shí),當然要在python中安裝selenium。從命令行輸入 pip install senenium 進(jìn)行安裝。
  B、配置環(huán)境變量
  這一步需要將chromedriver的保存路徑配置到操作系統的環(huán)境變量中,這樣selenium才能找到chromedriver。windows下配置環(huán)境變量PATH,linux或者mac可以選擇在.bash_rc中配置。配置方法很多,百度一下。
  我用的是mac,不知道為什么配置不行!后來(lái)發(fā)現只有在代碼中設置了才有效。
  C. 核心代碼(python)
  # 設置下載路徑,配置ChromeOptions的路徑。
  chromeoptions = webdriver.ChromeOptions()
  首選項 = {'profile.default_content_settings.popups':0,'download.default_directory': query_dir}
  chromeoptions.add_experimental_option('prefs', prefs)
  # 設置環(huán)境變量并啟動(dòng)瀏覽器。
  chromedriver = CHROMEDRIVER_DIR # 設置為你自己的路徑
  os.environ["webdriver.chrome.driver"] = chromedriver
  驅動(dòng)程序 = webdriver.Chrome(executable_path=chromedriver,chrome_options=chromeoptions)
  # 設置不可見(jiàn)等待時(shí)間,因為點(diǎn)擊網(wǎng)站后,可以返回一段時(shí)間的內容。如果不等待,就會(huì )報超時(shí)異常。
  driver.implicitly_wait(IMPLICIT_WAIT_TIME)
  # 請求頁(yè)面A
  司機.get("")
  # 在頁(yè)面A的兩個(gè)文本框中輸入并提交。
  
  driver.find_element_by_name('D').clear()
  driver.find_element_by_name('D').send_keys('mesz')
  driver.find_element_by_name('SEARCH').clear()
  driver.find_element_by_name('SEARCH').send_keys(str_search_query)
  driver.find_element_by_name('ovid').click()
  # 跳轉到新窗口并關(guān)注該窗口。
  current_window_handle = driver.current_window_handle
  for hdl in driver.window_handles: # selenium 總是有兩個(gè)句柄
  如果 hdl != current_window_handle:
  new_window_handle = hdl
  driver.switch_to.window(new_window_handle)
  driver.implicitly_wait(IMPLICIT_WAIT_TIME)
  # 獲取網(wǎng)頁(yè)。首先獲取返回的條目總數,然后提取文本框輸入下載條目的范圍,例如1-500。然后單擊導出。
  
  # 注意:等待頁(yè)面加載完畢再計算下載次數
  search_ret_num = WebDriverWait(驅動(dòng)程序, EXPLICIT_WAIT_TIME, EXPLICIT_WAIT_INTERVAL).until(EC.presence_of_element_located((By.XPATH,'//*[@id="searchaid-numbers"]')))
  search_ret_num =int(re.findall(r'\d+', search_ret_num.text.encode('utf-8'))[0])
  list_range = chunks_by_element(范圍(1, search_ret_num+1), DOWNLOAD_NUM_PER_TIME)
  對于 list_range 中的項目:
  download_range = driver.find_element_by_xpath('//*[@id="titles-display"]//input[@title="Range"]')
  下載范圍.clear()
  download_range.send_keys('{}-{}'.format(item[0], item[-1]))
  # 點(diǎn)擊導出
  export = driver.find_element_by_xpath('//*[@id="titles-display"]//input[@value="Export"]')
  導出.click()
  # 獲取彈出窗口。進(jìn)行一些設置。
  
  driver.switch_to.alert
  WebDriverWait(驅動(dòng)程序, EXPLICIT_WAIT_TIME, EXPLICIT_WAIT_INTERVAL).until(EC.presence_of_element_located((By.XPATH,'//div[@id="export-citation-popup"]')))
  # 設置下載文件的一些配置
  export_to_options = driver.find_element_by_xpath('//select[@id="export-citation-export-to-options"]')
  export_to_options.find_element_by_xpath('//option[@value="xml"]').click()# XML
  # 設置引文內容電臺
  citation_options = driver.find_element_by_xpath('//ul[@id="export-citation-options"]')
  citation_options.find_element_by_xpath('//input[@value="ALL"]').click()# 完整參考
  # 設置收錄復選框
  citation_include = driver.find_element_by_xpath('//div[@id="export-citation-include"]')
  ifcitation_include.find_element_by_xpath('//input[@name="externalResolverLink"]').is_selected():# 鏈接到外部解析器
  citation_include.find_element_by_xpath('//input[@name="externalResolverLink"]').click()
  ifcitation_include.find_element_by_xpath('//input[@name="jumpstartLink"]').is_selected():# 收錄網(wǎng)址
  citation_include.find_element_by_xpath('//input[@name="jumpstartLink"]').click()
  ifcitation_include.find_element_by_xpath('//input[@name="saveStrategy"]').is_selected():# 搜索歷史
  citation_include.find_element_by_xpath('//input[@name="saveStrategy"]').click()
  # 點(diǎn)擊下載。
  下載 = driver.find_element_by_xpath('//div[@class="export-citation-buttons"]')
  下載.click()
  最后:
  sleep(30)#等待最后一個(gè)文件下載完成
  # driver.implicitly_wait(30) # 不行!
  driver.quit()
  返回
  3. 提示
  A. 每次啟動(dòng)瀏覽器時(shí),桌面上都會(huì )彈出一個(gè)瀏覽器。您可以清楚地看到自動(dòng)化過(guò)程是怎樣的??磥?lái) selenium 真的為 Web 程序的自動(dòng)化測試做好了準備。另外,在爬取過(guò)程中要注意保持屏幕打開(kāi)。如果它進(jìn)入睡眠或屏幕保護程序,也會(huì )拋出異常。
  B、在模擬網(wǎng)頁(yè)操作時(shí),網(wǎng)頁(yè)跳轉是很常見(jiàn)的場(chǎng)景。所以要注意網(wǎng)頁(yè)響應時(shí)間。Selenium 在繼續執行代碼之前不會(huì )等待網(wǎng)頁(yè)響應完成,而是直接執行。兩者應該是不同的過(guò)程。這里可以選擇設置隱式等待和顯式等待。在其他操作中,隱式等待起決定性作用,在WebDriverWait中..顯式等待起主要作用,但需要注意的是,最長(cháng)等待時(shí)間取決于兩者中的較大者,如果隱式等待時(shí)間&gt;顯式等待時(shí)間,代碼的最長(cháng)等待時(shí)間等于隱式等待時(shí)間。
  C. 設置下載路徑時(shí),一開(kāi)始沒(méi)有任何效果。懷疑是“download.default_directory”這個(gè)key寫(xiě)錯了,于是通過(guò)查看網(wǎng)頁(yè)源碼找到了key,還是一樣。問(wèn)題出在其他地方。不過(guò)提醒了我以后在代碼中使用字典進(jìn)行相關(guān)配置的時(shí)候,看源碼就能猜出來(lái)。
  
  D.我以為至少需要兩三天才能實(shí)現整個(gè)過(guò)程,因為我真的不明白。從頭到尾完成這項研究只需不到一天的時(shí)間。大概是因為入手之前找了很久,反復比較之后,才找到了最得心應手的工具。
  E. 整理完之后在github上搜了一圈,發(fā)現了一個(gè)神器。對于想要爬取大量?jì)热莸呐笥?,如果不想浪費時(shí)間過(guò)多學(xué)習web應用的底層知識,可以結合使用Selenium+scrapy。scrapy可以負責搜索網(wǎng)頁(yè),selenium負責處理每個(gè)網(wǎng)頁(yè)上的內容,尤其是動(dòng)態(tài)內容。下次如果我需要它,我打算使用這個(gè)想法!
  F. 分享一句話(huà)?!瓣P(guān)于爬蟲(chóng),獲取經(jīng)驗最快的方法是:學(xué)會(huì )寫(xiě)網(wǎng)站,你知道網(wǎng)站發(fā)送請求是什么,那么你就知道怎么爬網(wǎng)站了!” 很簡(jiǎn)單的。,但是這么簡(jiǎn)單的一句話(huà)卻給了我很大的啟發(fā)。之前太難了,一直卡在scrapy爬靜態(tài)網(wǎng)頁(yè)的水平。像 cookie 這樣的技術(shù)也曾被閱讀和遺忘過(guò)一次?,F在看來(lái)是因為網(wǎng)站的整體流程還沒(méi)有理清清楚。另一方面,我也害怕那些復雜的網(wǎng)站技術(shù)術(shù)語(yǔ)。其實(shí)只要在網(wǎng)上查查相關(guān)概念,就會(huì )慢慢打通。
  G. 最后,完全不懂編程的人可以使用一些可視化爬蟲(chóng)工具。這里有一些介紹: 。懂編程又想提高效率的人需要參考其他工具。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何獲取JS生成的JS和網(wǎng)頁(yè)內容和服務(wù)端?)
  最近需要在一個(gè)網(wǎng)站中下載一批數據。但是輸入一個(gè)查詢(xún),返回30000到40000個(gè)結果,每次只能導出500個(gè),而且每次都要輸入下載項的范圍!就這樣點(diǎn)擊下載,我不要命了。所以我想自動(dòng)化這個(gè)過(guò)程。
  我的需求主要是兩點(diǎn):1.要求自動(dòng)化程度高。最好有一個(gè)成熟的界面,直接模擬瀏覽器的鼠標和鍵盤(pán)動(dòng)作,比如輸入文本框、選擇下拉列表、單選按鈕、復選框、點(diǎn)擊按鈕等。2.效率不高。因為我想要的數據量比較少。3. python下的框架。因為我通常主要使用python。
  對網(wǎng)站技術(shù)了解不多,對網(wǎng)站只有兩個(gè)經(jīng)驗:自己開(kāi)發(fā)了一個(gè)很簡(jiǎn)單的Android客戶(hù)端,用python的scrapy框架寫(xiě)了一個(gè)爬蟲(chóng)自動(dòng)爬取新聞. 所以了解客戶(hù)端和服務(wù)器的一些基本交互方法,了解如何分析網(wǎng)頁(yè)源代碼,了解xpath語(yǔ)法。
  當我第一次開(kāi)始解決這個(gè)問(wèn)題時(shí),我什至不知道要搜索什么。知乎的這個(gè)文章提供了很多有用的信息:“Python爬蟲(chóng)如何獲取JS生成的URL和網(wǎng)頁(yè)內容?” 隨之權衡了很多方法,最終選擇了Selenium。主要優(yōu)點(diǎn)是學(xué)習成本最小,代碼實(shí)現速度快。缺點(diǎn)是爬取效率低。如果您想成為富有成效的朋友,您將不得不花一些時(shí)間學(xué)習更復雜的工具包。
  網(wǎng)站技術(shù)
  如果要自動(dòng)爬取網(wǎng)頁(yè),需要了解一些基礎知識,這樣做會(huì )比較快。這里簡(jiǎn)單介紹一下相關(guān)知識。
  1. 請求/響應
  request 是客戶(hù)端向服務(wù)器發(fā)出的請求。輸入一個(gè) URL 對應一個(gè)請求動(dòng)作,這是最直觀(guān)的。爬取靜態(tài)網(wǎng)頁(yè)的內容,只需要知道網(wǎng)址即可。但是,當前的許多網(wǎng)頁(yè)都是動(dòng)態(tài)的。指向或點(diǎn)擊網(wǎng)頁(yè)中的某些元素也會(huì )觸發(fā)請求動(dòng)作,從而使網(wǎng)頁(yè)可以動(dòng)態(tài)更新部分內容,而這些內容不能直接從靜態(tài)網(wǎng)頁(yè)中獲取。這種技術(shù)叫做AJAX,但我對它了解不多。這里的問(wèn)題是我們可能甚至不知道 URL 是什么,所以我們需要一些可以處理動(dòng)態(tài)內容的高級接口。
  response 是服務(wù)器返回給客戶(hù)端的內容。如果要獲取靜態(tài)網(wǎng)頁(yè)內容,直接從請求中獲取即可。
  
  2. 分析網(wǎng)頁(yè)源碼
  如果我們想抓取網(wǎng)頁(yè)上的某一部分信息,我們需要知道如何定位它。這里需要 HTML 和 XPATH 知識。不知道的可以去w3school在線(xiàn)教程:
  查看網(wǎng)頁(yè)的源代碼,將鼠標指針指向網(wǎng)頁(yè)的任意位置,或指向目標元素。右鍵單擊并從下拉列表中選擇“檢查元素”。下面是我右鍵“百度”顯示的網(wǎng)頁(yè)源代碼,是HTML格式的,我們可以看到對應的HTML代碼。要提取它,我們可能需要 div//@[class="head_wrapper"]//input[@type="submit"] 的語(yǔ)句,它是 XPATH 語(yǔ)法,易于掌握。知道如何分析網(wǎng)頁(yè),我們更進(jìn)一步。
  
  3. 網(wǎng)頁(yè)基本元素操作
  前進(jìn)、后退、刷新、打開(kāi)新標簽、輸入網(wǎng)址等;
  文本框輸入、選擇下拉列表、單選按鈕、復選框、點(diǎn)擊按鈕等。
  我這里只需要模擬這么多操作,可以參考對應的selenium接口。
  4. Selenium 簡(jiǎn)介
  底線(xiàn):Selenium 是用于 Web 應用程序的自動(dòng)化測試工具集。
  很多話(huà):Selenium 誕生于 2004 年,當時(shí) ThoughtWorks 的 Jason Huggins 正在測試一個(gè)內部應用程序。作為一個(gè)聰明人,他意識到他的時(shí)間應該比手動(dòng)測試每個(gè)更改更有價(jià)值。他開(kāi)發(fā)了一個(gè)驅動(dòng)頁(yè)面交互的 Javascript 庫,允許多個(gè)瀏覽器自動(dòng)返回測試結果。該庫最終成為 Selenium 的核心,它是 Selenium RC(遠程控制)和 Selenium IDE 所有功能的基礎。
  實(shí)戰練習1.分析數據采集過(guò)程
  我的數據采集過(guò)程如下:
  在A(yíng)頁(yè)輸入查詢(xún)語(yǔ)句,點(diǎn)擊提交;瀏覽器自動(dòng)打開(kāi)新頁(yè)面,跳轉到新頁(yè)面B,在文本框中輸入下載項的范圍;單擊導出彈出一個(gè)彈出窗口,然后單擊下拉列表,單選按鈕,選取框進(jìn)行一些選擇,然后單擊下載。然后瀏覽器開(kāi)始下載文件。
  頁(yè)面 A
  
  B頁(yè)
  
  2. 爬取過(guò)程 A. 安裝 Selenium
  Selenium 支持多種瀏覽器,我選擇 google chrome。下載鏈接:。同時(shí),當然要在python中安裝selenium。從命令行輸入 pip install senenium 進(jìn)行安裝。
  B、配置環(huán)境變量
  這一步需要將chromedriver的保存路徑配置到操作系統的環(huán)境變量中,這樣selenium才能找到chromedriver。windows下配置環(huán)境變量PATH,linux或者mac可以選擇在.bash_rc中配置。配置方法很多,百度一下。
  我用的是mac,不知道為什么配置不行!后來(lái)發(fā)現只有在代碼中設置了才有效。
  C. 核心代碼(python)
  # 設置下載路徑,配置ChromeOptions的路徑。
  chromeoptions = webdriver.ChromeOptions()
  首選項 = {'profile.default_content_settings.popups':0,'download.default_directory': query_dir}
  chromeoptions.add_experimental_option('prefs', prefs)
  # 設置環(huán)境變量并啟動(dòng)瀏覽器。
  chromedriver = CHROMEDRIVER_DIR # 設置為你自己的路徑
  os.environ["webdriver.chrome.driver"] = chromedriver
  驅動(dòng)程序 = webdriver.Chrome(executable_path=chromedriver,chrome_options=chromeoptions)
  # 設置不可見(jiàn)等待時(shí)間,因為點(diǎn)擊網(wǎng)站后,可以返回一段時(shí)間的內容。如果不等待,就會(huì )報超時(shí)異常。
  driver.implicitly_wait(IMPLICIT_WAIT_TIME)
  # 請求頁(yè)面A
  司機.get("")
  # 在頁(yè)面A的兩個(gè)文本框中輸入并提交。
  
  driver.find_element_by_name('D').clear()
  driver.find_element_by_name('D').send_keys('mesz')
  driver.find_element_by_name('SEARCH').clear()
  driver.find_element_by_name('SEARCH').send_keys(str_search_query)
  driver.find_element_by_name('ovid').click()
  # 跳轉到新窗口并關(guān)注該窗口。
  current_window_handle = driver.current_window_handle
  for hdl in driver.window_handles: # selenium 總是有兩個(gè)句柄
  如果 hdl != current_window_handle:
  new_window_handle = hdl
  driver.switch_to.window(new_window_handle)
  driver.implicitly_wait(IMPLICIT_WAIT_TIME)
  # 獲取網(wǎng)頁(yè)。首先獲取返回的條目總數,然后提取文本框輸入下載條目的范圍,例如1-500。然后單擊導出。
  
  # 注意:等待頁(yè)面加載完畢再計算下載次數
  search_ret_num = WebDriverWait(驅動(dòng)程序, EXPLICIT_WAIT_TIME, EXPLICIT_WAIT_INTERVAL).until(EC.presence_of_element_located((By.XPATH,'//*[@id="searchaid-numbers"]')))
  search_ret_num =int(re.findall(r'\d+', search_ret_num.text.encode('utf-8'))[0])
  list_range = chunks_by_element(范圍(1, search_ret_num+1), DOWNLOAD_NUM_PER_TIME)
  對于 list_range 中的項目:
  download_range = driver.find_element_by_xpath('//*[@id="titles-display"]//input[@title="Range"]')
  下載范圍.clear()
  download_range.send_keys('{}-{}'.format(item[0], item[-1]))
  # 點(diǎn)擊導出
  export = driver.find_element_by_xpath('//*[@id="titles-display"]//input[@value="Export"]')
  導出.click()
  # 獲取彈出窗口。進(jìn)行一些設置。
  
  driver.switch_to.alert
  WebDriverWait(驅動(dòng)程序, EXPLICIT_WAIT_TIME, EXPLICIT_WAIT_INTERVAL).until(EC.presence_of_element_located((By.XPATH,'//div[@id="export-citation-popup"]')))
  # 設置下載文件的一些配置
  export_to_options = driver.find_element_by_xpath('//select[@id="export-citation-export-to-options"]')
  export_to_options.find_element_by_xpath('//option[@value="xml"]').click()# XML
  # 設置引文內容電臺
  citation_options = driver.find_element_by_xpath('//ul[@id="export-citation-options"]')
  citation_options.find_element_by_xpath('//input[@value="ALL"]').click()# 完整參考
  # 設置收錄復選框
  citation_include = driver.find_element_by_xpath('//div[@id="export-citation-include"]')
  ifcitation_include.find_element_by_xpath('//input[@name="externalResolverLink"]').is_selected():# 鏈接到外部解析器
  citation_include.find_element_by_xpath('//input[@name="externalResolverLink"]').click()
  ifcitation_include.find_element_by_xpath('//input[@name="jumpstartLink"]').is_selected():# 收錄網(wǎng)址
  citation_include.find_element_by_xpath('//input[@name="jumpstartLink"]').click()
  ifcitation_include.find_element_by_xpath('//input[@name="saveStrategy"]').is_selected():# 搜索歷史
  citation_include.find_element_by_xpath('//input[@name="saveStrategy"]').click()
  # 點(diǎn)擊下載。
  下載 = driver.find_element_by_xpath('//div[@class="export-citation-buttons"]')
  下載.click()
  最后:
  sleep(30)#等待最后一個(gè)文件下載完成
  # driver.implicitly_wait(30) # 不行!
  driver.quit()
  返回
  3. 提示
  A. 每次啟動(dòng)瀏覽器時(shí),桌面上都會(huì )彈出一個(gè)瀏覽器。您可以清楚地看到自動(dòng)化過(guò)程是怎樣的??磥?lái) selenium 真的為 Web 程序的自動(dòng)化測試做好了準備。另外,在爬取過(guò)程中要注意保持屏幕打開(kāi)。如果它進(jìn)入睡眠或屏幕保護程序,也會(huì )拋出異常。
  B、在模擬網(wǎng)頁(yè)操作時(shí),網(wǎng)頁(yè)跳轉是很常見(jiàn)的場(chǎng)景。所以要注意網(wǎng)頁(yè)響應時(shí)間。Selenium 在繼續執行代碼之前不會(huì )等待網(wǎng)頁(yè)響應完成,而是直接執行。兩者應該是不同的過(guò)程。這里可以選擇設置隱式等待和顯式等待。在其他操作中,隱式等待起決定性作用,在WebDriverWait中..顯式等待起主要作用,但需要注意的是,最長(cháng)等待時(shí)間取決于兩者中的較大者,如果隱式等待時(shí)間&gt;顯式等待時(shí)間,代碼的最長(cháng)等待時(shí)間等于隱式等待時(shí)間。
  C. 設置下載路徑時(shí),一開(kāi)始沒(méi)有任何效果。懷疑是“download.default_directory”這個(gè)key寫(xiě)錯了,于是通過(guò)查看網(wǎng)頁(yè)源碼找到了key,還是一樣。問(wèn)題出在其他地方。不過(guò)提醒了我以后在代碼中使用字典進(jìn)行相關(guān)配置的時(shí)候,看源碼就能猜出來(lái)。
  
  D.我以為至少需要兩三天才能實(shí)現整個(gè)過(guò)程,因為我真的不明白。從頭到尾完成這項研究只需不到一天的時(shí)間。大概是因為入手之前找了很久,反復比較之后,才找到了最得心應手的工具。
  E. 整理完之后在github上搜了一圈,發(fā)現了一個(gè)神器。對于想要爬取大量?jì)热莸呐笥?,如果不想浪費時(shí)間過(guò)多學(xué)習web應用的底層知識,可以結合使用Selenium+scrapy。scrapy可以負責搜索網(wǎng)頁(yè),selenium負責處理每個(gè)網(wǎng)頁(yè)上的內容,尤其是動(dòng)態(tài)內容。下次如果我需要它,我打算使用這個(gè)想法!
  F. 分享一句話(huà)?!瓣P(guān)于爬蟲(chóng),獲取經(jīng)驗最快的方法是:學(xué)會(huì )寫(xiě)網(wǎng)站,你知道網(wǎng)站發(fā)送請求是什么,那么你就知道怎么爬網(wǎng)站了!” 很簡(jiǎn)單的。,但是這么簡(jiǎn)單的一句話(huà)卻給了我很大的啟發(fā)。之前太難了,一直卡在scrapy爬靜態(tài)網(wǎng)頁(yè)的水平。像 cookie 這樣的技術(shù)也曾被閱讀和遺忘過(guò)一次?,F在看來(lái)是因為網(wǎng)站的整體流程還沒(méi)有理清清楚。另一方面,我也害怕那些復雜的網(wǎng)站技術(shù)術(shù)語(yǔ)。其實(shí)只要在網(wǎng)上查查相關(guān)概念,就會(huì )慢慢打通。
  G. 最后,完全不懂編程的人可以使用一些可視化爬蟲(chóng)工具。這里有一些介紹: 。懂編程又想提高效率的人需要參考其他工具。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解策略實(shí)戰作者(組圖)作者)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-01-20 15:18 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解策略實(shí)戰作者(組圖)作者)
  阿里云&gt;云棲社區&gt;主題圖&gt;C&gt;c爬蟲(chóng)源碼
  
  推薦活動(dòng):
  更多優(yōu)惠&gt;
  當前話(huà)題:c網(wǎng)絡(luò )爬蟲(chóng)源碼加入采集
  相關(guān)話(huà)題:
  c網(wǎng)絡(luò )爬蟲(chóng)源碼相關(guān)博客看更多博文
  C# 網(wǎng)絡(luò )爬蟲(chóng)
  
  
  作者:Street Corner Box 712 查看評論:05 年前
  公司的編輯需要爬取網(wǎng)頁(yè)的內容,讓我幫我做一個(gè)簡(jiǎn)單的爬取工具。這是抓取網(wǎng)頁(yè)的內容??磥?lái)這對大家來(lái)說(shuō)并不難,不過(guò)這里有一些小的改動(dòng),代碼提供,請參考 1 private string GetHttpWebRequest(string url) 2 { 3 Ht
  閱讀全文
  C#HttpHelper爬蟲(chóng)源碼分享--蘇飛版
  
  
  作者:蘇飛2071 瀏覽評論:03年前
  簡(jiǎn)介 C#HttpHelper實(shí)現了C#HttpWebRequest爬取時(shí)忽略編碼、忽略證書(shū)、忽略cookie的功能,實(shí)現代理的功能。有了它,您可以發(fā)出 Get 和 Post 請求,并且可以輕松設置 cookie、證書(shū)、代理和編碼。你不用擔心這個(gè)問(wèn)題,因為類(lèi)會(huì )自動(dòng)為你識別頁(yè)面
  閱讀全文
  Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解攻略實(shí)戰
  
  
  作者:薇薇8128 瀏覽評論:04年前
  作者:薇薇,請注明出處。我們經(jīng)常會(huì )寫(xiě)一些網(wǎng)絡(luò )爬蟲(chóng),想必大家都會(huì )有一種感覺(jué),雖然寫(xiě)爬蟲(chóng)不難,但是反爬很難處理,因為大部分網(wǎng)站都有自己的反爬機制,所以我們將更加難以抓取這些數據。但是,對于每一種反爬機制,我們其實(shí)都會(huì )有相應的解決方案。作為一個(gè)爬蟲(chóng),我們,
  閱讀全文
  C#網(wǎng)絡(luò )爬蟲(chóng)--多線(xiàn)程增強版
  
  
  作者:街角盒飯 688 次瀏覽評論:05 年前
  上次給公司的一個(gè)女生做爬蟲(chóng),不是很精致。這次是用在公司的項目中,所以做了一些改動(dòng)。該函數添加了一個(gè)URL圖片采集,下載,線(xiàn)程處理接口URL圖片下載等。說(shuō)說(shuō)思路:總理在初始網(wǎng)站采集圖片去獲取初始網(wǎng)站的所有內容到初始網(wǎng)站 采集 鏈接并將 采集 的鏈接放入隊列以繼續 采集 圖片
  閱讀全文
  Python網(wǎng)絡(luò )爬蟲(chóng)抓取極品姐姐的視頻并保存到文件
  
  
  作者:keitwotest1060 瀏覽評論:04年前
  項目描述 用Python寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)爬取Best Sister的視頻并保存到文件中使用工具示例 Python2.7.X,pycharm如何使用創(chuàng )建視頻爬取Best Sister in pycharm .py 文件,并在當前目錄下創(chuàng )建video文件夾,用于存放采集到的視頻文件,編寫(xiě)代碼,運行
  閱讀全文
  一篇文章文章教你用Python網(wǎng)絡(luò )爬蟲(chóng)搞定差旅攻略
  
  
  作者:python進(jìn)階13人查看評論:01年前
  [一、項目背景] 趣游網(wǎng)提供原創(chuàng )實(shí)用的出境游指南、攻略、旅游社區和問(wèn)答平臺,以及智能旅游規劃解決方案,以及簽證、保險、機票、酒店在線(xiàn)預訂、租車(chē)等增值服務(wù)。僑游“鼓勵和幫助中國游客以自己的視角和方式體驗世界”。今天就教大家如何獲取僑友網(wǎng)的城市信息。
  閱讀全文
  Java版網(wǎng)絡(luò )爬蟲(chóng)基礎(轉)
  
  
  作者:developerguy851 瀏覽評論:06年前
  網(wǎng)絡(luò )爬蟲(chóng)不僅可以爬取網(wǎng)站網(wǎng)頁(yè)和圖片,甚至可以實(shí)現搶票、網(wǎng)上購買(mǎi)、機票查詢(xún)。這幾天看了一些基礎知識,記錄下來(lái)。網(wǎng)頁(yè)之間的關(guān)系可以看成一個(gè)大圖,圖的遍歷可以分為深度優(yōu)先和廣度優(yōu)先。網(wǎng)絡(luò )爬蟲(chóng)采取的廣度優(yōu)先方式總結如下:2個(gè)數組,一個(gè)
  閱讀全文
  一篇文章文章教你使用Python網(wǎng)絡(luò )爬蟲(chóng)爬取評論區百度貼吧圖片和視頻
  
  
  作者:python進(jìn)階26人查看評論:01年前
  [一、項目背景]百度貼吧是全球最大的中文交流平臺。你是不是和我一樣,有時(shí)候看到評論區的圖片就想下載?或者觀(guān)看視頻并想下載?今天小編帶大家通過(guò)搜索關(guān)鍵詞,在評論區獲取圖片和視頻。[二、項目目標]實(shí)現貼吧獲取的圖片或視頻將保存在
  閱讀全文 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解策略實(shí)戰作者(組圖)作者)
  阿里云&gt;云棲社區&gt;主題圖&gt;C&gt;c爬蟲(chóng)源碼
  
  推薦活動(dòng):
  更多優(yōu)惠&gt;
  當前話(huà)題:c網(wǎng)絡(luò )爬蟲(chóng)源碼加入采集
  相關(guān)話(huà)題:
  c網(wǎng)絡(luò )爬蟲(chóng)源碼相關(guān)博客看更多博文
  C# 網(wǎng)絡(luò )爬蟲(chóng)
  
  
  作者:Street Corner Box 712 查看評論:05 年前
  公司的編輯需要爬取網(wǎng)頁(yè)的內容,讓我幫我做一個(gè)簡(jiǎn)單的爬取工具。這是抓取網(wǎng)頁(yè)的內容??磥?lái)這對大家來(lái)說(shuō)并不難,不過(guò)這里有一些小的改動(dòng),代碼提供,請參考 1 private string GetHttpWebRequest(string url) 2 { 3 Ht
  閱讀全文
  C#HttpHelper爬蟲(chóng)源碼分享--蘇飛版
  
  
  作者:蘇飛2071 瀏覽評論:03年前
  簡(jiǎn)介 C#HttpHelper實(shí)現了C#HttpWebRequest爬取時(shí)忽略編碼、忽略證書(shū)、忽略cookie的功能,實(shí)現代理的功能。有了它,您可以發(fā)出 Get 和 Post 請求,并且可以輕松設置 cookie、證書(shū)、代理和編碼。你不用擔心這個(gè)問(wèn)題,因為類(lèi)會(huì )自動(dòng)為你識別頁(yè)面
  閱讀全文
  Python網(wǎng)絡(luò )爬蟲(chóng)反爬破解攻略實(shí)戰
  
  
  作者:薇薇8128 瀏覽評論:04年前
  作者:薇薇,請注明出處。我們經(jīng)常會(huì )寫(xiě)一些網(wǎng)絡(luò )爬蟲(chóng),想必大家都會(huì )有一種感覺(jué),雖然寫(xiě)爬蟲(chóng)不難,但是反爬很難處理,因為大部分網(wǎng)站都有自己的反爬機制,所以我們將更加難以抓取這些數據。但是,對于每一種反爬機制,我們其實(shí)都會(huì )有相應的解決方案。作為一個(gè)爬蟲(chóng),我們,
  閱讀全文
  C#網(wǎng)絡(luò )爬蟲(chóng)--多線(xiàn)程增強版
  
  
  作者:街角盒飯 688 次瀏覽評論:05 年前
  上次給公司的一個(gè)女生做爬蟲(chóng),不是很精致。這次是用在公司的項目中,所以做了一些改動(dòng)。該函數添加了一個(gè)URL圖片采集,下載,線(xiàn)程處理接口URL圖片下載等。說(shuō)說(shuō)思路:總理在初始網(wǎng)站采集圖片去獲取初始網(wǎng)站的所有內容到初始網(wǎng)站 采集 鏈接并將 采集 的鏈接放入隊列以繼續 采集 圖片
  閱讀全文
  Python網(wǎng)絡(luò )爬蟲(chóng)抓取極品姐姐的視頻并保存到文件
  
  
  作者:keitwotest1060 瀏覽評論:04年前
  項目描述 用Python寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)爬取Best Sister的視頻并保存到文件中使用工具示例 Python2.7.X,pycharm如何使用創(chuàng )建視頻爬取Best Sister in pycharm .py 文件,并在當前目錄下創(chuàng )建video文件夾,用于存放采集到的視頻文件,編寫(xiě)代碼,運行
  閱讀全文
  一篇文章文章教你用Python網(wǎng)絡(luò )爬蟲(chóng)搞定差旅攻略
  
  
  作者:python進(jìn)階13人查看評論:01年前
  [一、項目背景] 趣游網(wǎng)提供原創(chuàng )實(shí)用的出境游指南、攻略、旅游社區和問(wèn)答平臺,以及智能旅游規劃解決方案,以及簽證、保險、機票、酒店在線(xiàn)預訂、租車(chē)等增值服務(wù)。僑游“鼓勵和幫助中國游客以自己的視角和方式體驗世界”。今天就教大家如何獲取僑友網(wǎng)的城市信息。
  閱讀全文
  Java版網(wǎng)絡(luò )爬蟲(chóng)基礎(轉)
  
  
  作者:developerguy851 瀏覽評論:06年前
  網(wǎng)絡(luò )爬蟲(chóng)不僅可以爬取網(wǎng)站網(wǎng)頁(yè)和圖片,甚至可以實(shí)現搶票、網(wǎng)上購買(mǎi)、機票查詢(xún)。這幾天看了一些基礎知識,記錄下來(lái)。網(wǎng)頁(yè)之間的關(guān)系可以看成一個(gè)大圖,圖的遍歷可以分為深度優(yōu)先和廣度優(yōu)先。網(wǎng)絡(luò )爬蟲(chóng)采取的廣度優(yōu)先方式總結如下:2個(gè)數組,一個(gè)
  閱讀全文
  一篇文章文章教你使用Python網(wǎng)絡(luò )爬蟲(chóng)爬取評論區百度貼吧圖片和視頻
  
  
  作者:python進(jìn)階26人查看評論:01年前
  [一、項目背景]百度貼吧是全球最大的中文交流平臺。你是不是和我一樣,有時(shí)候看到評論區的圖片就想下載?或者觀(guān)看視頻并想下載?今天小編帶大家通過(guò)搜索關(guān)鍵詞,在評論區獲取圖片和視頻。[二、項目目標]實(shí)現貼吧獲取的圖片或視頻將保存在
  閱讀全文

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(以文章首頁(yè)爬取數據的首頁(yè)方法數據類(lèi)型及類(lèi)型)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 48 次瀏覽 ? 2022-01-16 16:01 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(以文章首頁(yè)爬取數據的首頁(yè)方法數據類(lèi)型及類(lèi)型)
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據,而且是從不同的,唯一的抓取途徑。還可以做到自動(dòng)翻頁(yè)?還能直接或間接爬到某種信息?這些網(wǎng)站應該都是通過(guò)共享logo實(shí)現抓取的,使用flask-redis的interface進(jìn)行封裝。
  cookie我是猜的,因為javascript只能獲取某一特定瀏覽器上的數據。而這個(gè)功能在手機瀏覽器上,有更完美的封裝。html5里的grid布局就可以覆蓋.useragent。那么問(wèn)題來(lái)了,抓取非ie瀏覽器不就得了。
  什么是首頁(yè)?網(wǎng)站的入口,無(wú)論是wap、flash還是http,都必須在“首頁(yè)”上放置頁(yè)面標簽,而首頁(yè)無(wú)非兩種格式:網(wǎng)站首頁(yè)和文章首頁(yè)。文章首頁(yè)只是網(wǎng)站中頁(yè)面的補充,目的為使讀者不至于從網(wǎng)站跳轉而無(wú)法繼續訪(fǎng)問(wèn)網(wǎng)站本身。下面的爬蟲(chóng)就是以文章首頁(yè)爬取數據。為了編寫(xiě)方便,urllib.request、urllib.request.urlretrieve等同樣用于這種場(chǎng)景,可以根據接口的數據結構靈活實(shí)現爬取json。
  首頁(yè)抓取方法數據類(lèi)型1、地址2、標簽名a標簽:/useragent是tx在googleanalytics上面對當前我國互聯(lián)網(wǎng)用戶(hù)分析調研得出的pythonurlretrieve提供的接口。在python中常用。#headers頭部urllib.request.headers.setretrieve("request_uri",url,verify=false)#聲明請求頭headers頭部自定義urlurllib.request.headers.setretrieve("request_uri","",verify=false)#聲明請求頭urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.alias_default)#聲明請求頭urllib.request.headers.setretrieve("data_string",tx.noagent.transform.text)#聲明請求頭urllib.request.headers.setretrieve("category","",verify=false)#聲明請求頭urllib.request.headers.setretrieve("category","",verify=false)urllib.request.headers.setretrieve("data_text",tx.noagent.transform.text)//網(wǎng)頁(yè)簡(jiǎn)易使用urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.text)urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.text)//web瀏覽器根據url抓取元素urllib.request.headers.setretrieve("cookie",tx.noagent.cookie)python抓取cookie部分的代碼importrequestsfrombs4importbeaut。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(以文章首頁(yè)爬取數據的首頁(yè)方法數據類(lèi)型及類(lèi)型)
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據,而且是從不同的,唯一的抓取途徑。還可以做到自動(dòng)翻頁(yè)?還能直接或間接爬到某種信息?這些網(wǎng)站應該都是通過(guò)共享logo實(shí)現抓取的,使用flask-redis的interface進(jìn)行封裝。
  cookie我是猜的,因為javascript只能獲取某一特定瀏覽器上的數據。而這個(gè)功能在手機瀏覽器上,有更完美的封裝。html5里的grid布局就可以覆蓋.useragent。那么問(wèn)題來(lái)了,抓取非ie瀏覽器不就得了。
  什么是首頁(yè)?網(wǎng)站的入口,無(wú)論是wap、flash還是http,都必須在“首頁(yè)”上放置頁(yè)面標簽,而首頁(yè)無(wú)非兩種格式:網(wǎng)站首頁(yè)和文章首頁(yè)。文章首頁(yè)只是網(wǎng)站中頁(yè)面的補充,目的為使讀者不至于從網(wǎng)站跳轉而無(wú)法繼續訪(fǎng)問(wèn)網(wǎng)站本身。下面的爬蟲(chóng)就是以文章首頁(yè)爬取數據。為了編寫(xiě)方便,urllib.request、urllib.request.urlretrieve等同樣用于這種場(chǎng)景,可以根據接口的數據結構靈活實(shí)現爬取json。
  首頁(yè)抓取方法數據類(lèi)型1、地址2、標簽名a標簽:/useragent是tx在googleanalytics上面對當前我國互聯(lián)網(wǎng)用戶(hù)分析調研得出的pythonurlretrieve提供的接口。在python中常用。#headers頭部urllib.request.headers.setretrieve("request_uri",url,verify=false)#聲明請求頭headers頭部自定義urlurllib.request.headers.setretrieve("request_uri","",verify=false)#聲明請求頭urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.alias_default)#聲明請求頭urllib.request.headers.setretrieve("data_string",tx.noagent.transform.text)#聲明請求頭urllib.request.headers.setretrieve("category","",verify=false)#聲明請求頭urllib.request.headers.setretrieve("category","",verify=false)urllib.request.headers.setretrieve("data_text",tx.noagent.transform.text)//網(wǎng)頁(yè)簡(jiǎn)易使用urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.text)urllib.request.headers.setretrieve("user-agent",tx.noagent.transform.text)//web瀏覽器根據url抓取元素urllib.request.headers.setretrieve("cookie",tx.noagent.cookie)python抓取cookie部分的代碼importrequestsfrombs4importbeaut。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(新手練習爬蟲(chóng)不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,拿走不謝!)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 55 次瀏覽 ? 2022-01-14 09:13 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(新手練習爬蟲(chóng)不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,拿走不謝!)
  最近暑假快到了,很多朋友都在找暑期實(shí)習吧?前幾天,朋友的小弟暑假想找個(gè)實(shí)習來(lái)鍛煉自己,但面對網(wǎng)上千篇一律的實(shí)習招聘信息,不知所措。然后我的朋友給我發(fā)了一條“請求幫助”的消息。得知大致情況后,我立即用爬蟲(chóng)爬取了練習網(wǎng)的信息,并將數據結果發(fā)送過(guò)去,分分鐘解決了問(wèn)題。請我吃飯會(huì )不會(huì )太過(guò)分了?
  
  本爬蟲(chóng)實(shí)戰教程不僅適合新手練習爬蟲(chóng),也適合需要找實(shí)習資料的朋友!
  希望看完這篇文章,能夠清楚的知道整個(gè)爬蟲(chóng)流程,并且能夠獨立完成,二來(lái)可以通過(guò)自己的爬蟲(chóng)實(shí)戰得到自己想要的信息。
  好吧,事不宜遲,讓我們開(kāi)始吧!
  內容主要分為兩部分:
  頁(yè)面分析爬蟲(chóng)步驟詳解
  一、目標頁(yè)面分析
  首先,我們應該知道我們的爬蟲(chóng)目標是什么,對吧?俗話(huà)說(shuō),知己知彼,百戰不殆。我們已經(jīng)知道我們要爬的頁(yè)面是“實(shí)習網(wǎng)”,所以我們首先要到實(shí)習網(wǎng)看看有什么數據。
  實(shí)習網(wǎng)址:
  頁(yè)面如下:
  
  比如我們要找的職位就是“品牌運營(yíng)”職位的數據。因此,您可以直接在網(wǎng)頁(yè)的搜索框中輸入品牌運營(yíng)。您會(huì )注意到網(wǎng)址已更改!
  
  注:我們要抓取的頁(yè)面是這個(gè)頁(yè)面:品牌運營(yíng)
  在我們的爬取頁(yè)面中,我們需要觀(guān)察那里有哪些數據,一個(gè)頁(yè)面中有幾條數據。這點(diǎn)很重要,跟后面的代碼編寫(xiě)有關(guān),可以幫你檢查頁(yè)面上的所有信息是否都被爬取了。
  
  此時(shí),我們要注意的是,我們所在的頁(yè)面是“一級頁(yè)面”。在瀏覽過(guò)程中,我們隨機點(diǎn)擊一個(gè)帖子進(jìn)入后,會(huì )顯示“二級頁(yè)面”。這時(shí)候你也會(huì )發(fā)現url又出現了。改變了。
  比如我們點(diǎn)擊一??個(gè)品牌運營(yíng)實(shí)踐,二級頁(yè)面會(huì )自動(dòng)跳轉到這個(gè),生成一個(gè)新的鏈接。如圖所示:
  
  如何抓取頁(yè)面上的信息?
  在分析過(guò)程中,我們發(fā)現有的信息在一級頁(yè)面,有的在二級頁(yè)面。
  在一級頁(yè)面,我們可以得到什么信息?如圖所示:
  
  一共有五個(gè)有效數據:職位、公司名稱(chēng)、學(xué)歷、薪水、地址
  在二級頁(yè)面中,我們來(lái)看看可以獲得哪些有效數據、字段和刻度。如果覺(jué)得階段很重要,也可以納入爬蟲(chóng)的范圍,但我個(gè)人認為這不影響實(shí)習。畢竟,它不是在尋找正式的工作。影響不會(huì )很大,但是招聘的實(shí)習生數量比較重要。這里沒(méi)有顯示新兵的數量,也無(wú)法在圖片上顯示。以后可以添加。
  
  此時(shí),我們一共需要抓取7個(gè)數據,加上“人數”,一共8個(gè)數據,就是我們爬蟲(chóng)最終的目標數據。
  抓取“靜態(tài)”網(wǎng)頁(yè)
  下面分析一下什么是靜態(tài)網(wǎng)頁(yè),什么是動(dòng)態(tài)網(wǎng)頁(yè)。對于靜態(tài)網(wǎng)頁(yè),隨著(zhù)html代碼的生成,頁(yè)面的內容和顯示效果基本不會(huì )改變——除非你修改了頁(yè)面代碼。動(dòng)態(tài)網(wǎng)頁(yè)并非如此。雖然頁(yè)面代碼沒(méi)有改變,但是顯示的內容會(huì )隨著(zhù)時(shí)間、環(huán)境或數據庫操作的結果而改變。
  它們的區別在于靜態(tài)網(wǎng)頁(yè)中的數據是一勞永逸的,也就是說(shuō)一次性給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數據是隨著(zhù)頁(yè)面的逐步加載而逐漸呈現出來(lái)的,也就是說(shuō),如果使用靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù),是無(wú)法獲取其中所有數據的。
  值得強調的是,動(dòng)態(tài)網(wǎng)頁(yè)不應與頁(yè)面內容是否動(dòng)態(tài)相混淆。這里所說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)動(dòng)態(tài)效果沒(méi)有直接關(guān)系。動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文本內容或收錄各種動(dòng)畫(huà)內容。這些只是特定于網(wǎng)頁(yè)。內容的呈現形式,無(wú)論網(wǎng)頁(yè)是否具有動(dòng)態(tài)效果,只要是動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè),都可以稱(chēng)為動(dòng)態(tài)網(wǎng)頁(yè)。
  點(diǎn)擊“鼠標右鍵”,點(diǎn)擊“查看網(wǎng)頁(yè)源代碼”,最終效果如圖(部分截圖):
  
  這是最終反饋給您的數據。如果你發(fā)現你想要的數據都在里面,那么就可以說(shuō)是靜態(tài)頁(yè)面,否則就認為是“動(dòng)態(tài)頁(yè)面”。
  今天這里的案例是一個(gè)靜態(tài)網(wǎng)頁(yè)。
  眾所周知,在編寫(xiě)代碼之前,我們必須知道我們使用哪些方法、庫和模塊來(lái)幫助您解析數據。常用的數據解析方法有:re正則表達式、xpath、beatifulsoup、pyquery等。
  我們需要用到的是xpath解析方法來(lái)分析定位數據。
  二、爬蟲(chóng)代碼說(shuō)明
  導入相關(guān)庫
  爬取的第一步是考慮在爬取過(guò)程中需要哪些庫。您必須知道python是一種依賴(lài)于許多庫的語(yǔ)言。沒(méi)有庫的 Python 是不完整的。
  import pandas as pd # 用于數據存儲
import requests # 用于請求網(wǎng)頁(yè)
import chardet # 用于修改編碼
import re # 用于提取數據
from lxml import etree # 解析數據的庫
import time # 可以粗糙模擬人為請求網(wǎng)頁(yè)的速度
import warnings # 忽略代碼運行時(shí)候的警告信息
warnings.filterwarnings("ignore")
  2、請求一級頁(yè)面的源碼
  url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text)
  這里要注意①和②兩個(gè)地方。①處有兩個(gè)參數,一個(gè)是headers,一個(gè)是verify。其中headers是一種防反爬的措施,它使瀏覽器認為爬蟲(chóng)不是爬蟲(chóng),而是人們使用瀏覽器正常請求網(wǎng)頁(yè)。verify 是忽略安全證書(shū)提示。某些網(wǎng)頁(yè)會(huì )被視為不安全網(wǎng)頁(yè),并會(huì )提示您。只要記住這個(gè)參數。
  在②處,我們已經(jīng)獲得了網(wǎng)頁(yè)的源代碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和你電腦的解析方式,可能存在不一致,返回的結果會(huì )導致亂碼。此時(shí)需要修改編碼方式。chardet 庫可以幫助您自動(dòng)檢測網(wǎng)頁(yè)源代碼的編碼。(一個(gè)非常有用的三方庫chardet檢測文檔編碼)
  3、解析一級頁(yè)面中的信息
  # 1. 公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)
# 4. 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)
# 5. 薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
# 獲取二級頁(yè)面的鏈接
deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
此時(shí),你可以看到,我直接采用xpath一個(gè)個(gè)去解析一級頁(yè)面中的數據分析。在代碼末尾,可以看到:我們獲取到了二級頁(yè)面的鏈接,為我們后面爬取二級頁(yè)面中的信息,做準備。
解析二級頁(yè)面網(wǎng)頁(yè)中的信息
demand_list = []
area_list = []
scale_list = []
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人數
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)
# 7. 公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# 8. 公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
  需要注意的是,二級頁(yè)面也是一個(gè)頁(yè)面,在爬取里面的數據的時(shí)候需要請求這個(gè)頁(yè)面。因此,①②③處的代碼完全相同。
  4、翻頁(yè)操作
  https://www.shixi.com/search/i ... e%3D1
https://www.shixi.com/search/i ... e%3D2
https://www.shixi.com/search/i ... e%3D3
  隨意復制幾個(gè)不同頁(yè)面的 URL 并觀(guān)察差異。這里可以看出page參數后面的數字是不一樣的,哪一頁(yè)是數字,數字就是數字。
  x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
  由于我們已經(jīng)爬取了60頁(yè)的數據,所以這里構造了60個(gè)url,全部存放在url_list列表中。
  現在來(lái)看整個(gè)代碼,我不再用文字描述,直接在代碼中寫(xiě)注釋。
  import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 請求獲取一級頁(yè)面的源代碼
url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)
# 獲取一級頁(yè)面中的信息:一共有5個(gè)信息。
# ①公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
#③地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)
# ④ 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)
# ⑤薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
# ⑥獲取二級頁(yè)面的內容
deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
demand_list = []
area_list = []
scale_list = []
# 獲取二級頁(yè)面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)
#① 需要幾人
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)
# ②公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# ③公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
# ④ 將每個(gè)頁(yè)面獲取到的所有數據,存儲到DataFrame中。
data = pd.DataFrame({&#39;公司名&#39;:company_list,&#39;崗位名&#39;:job_list,&#39;地址&#39;:address_list,"學(xué)歷":degree_list,
&#39;薪資&#39;:salary_list,&#39;崗位需求量&#39;:demand_list,&#39;公司領(lǐng)域&#39;:area_list,&#39;公司規模&#39;:scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=[&#39;公司名&#39;,&#39;崗位名&#39;,&#39;地址&#39;,"學(xué)歷",&#39;薪資&#39;,&#39;崗位需求量&#39;,&#39;公司領(lǐng)域&#39;,&#39;公司規模&#39;])
# 這里進(jìn)行“翻頁(yè)”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存數據
res.to_csv(&#39;aliang.csv&#39;,encoding=&#39;utf_8_sig&#39;)
  這一套之后,爬蟲(chóng)的思路是不是瞬間清晰了?眼睛:我會(huì )的!手:我還是不會(huì )。多加練習。初學(xué)者不要急于求成,項目不多,但有技巧??赐敢粋€(gè)比看十個(gè)要有效得多。
  想要獲取源碼的朋友,點(diǎn)贊+評論,私聊~ 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(新手練習爬蟲(chóng)不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,拿走不謝!)
  最近暑假快到了,很多朋友都在找暑期實(shí)習吧?前幾天,朋友的小弟暑假想找個(gè)實(shí)習來(lái)鍛煉自己,但面對網(wǎng)上千篇一律的實(shí)習招聘信息,不知所措。然后我的朋友給我發(fā)了一條“請求幫助”的消息。得知大致情況后,我立即用爬蟲(chóng)爬取了練習網(wǎng)的信息,并將數據結果發(fā)送過(guò)去,分分鐘解決了問(wèn)題。請我吃飯會(huì )不會(huì )太過(guò)分了?
  
  本爬蟲(chóng)實(shí)戰教程不僅適合新手練習爬蟲(chóng),也適合需要找實(shí)習資料的朋友!
  希望看完這篇文章,能夠清楚的知道整個(gè)爬蟲(chóng)流程,并且能夠獨立完成,二來(lái)可以通過(guò)自己的爬蟲(chóng)實(shí)戰得到自己想要的信息。
  好吧,事不宜遲,讓我們開(kāi)始吧!
  內容主要分為兩部分:
  頁(yè)面分析爬蟲(chóng)步驟詳解
  一、目標頁(yè)面分析
  首先,我們應該知道我們的爬蟲(chóng)目標是什么,對吧?俗話(huà)說(shuō),知己知彼,百戰不殆。我們已經(jīng)知道我們要爬的頁(yè)面是“實(shí)習網(wǎng)”,所以我們首先要到實(shí)習網(wǎng)看看有什么數據。
  實(shí)習網(wǎng)址:
  頁(yè)面如下:
  
  比如我們要找的職位就是“品牌運營(yíng)”職位的數據。因此,您可以直接在網(wǎng)頁(yè)的搜索框中輸入品牌運營(yíng)。您會(huì )注意到網(wǎng)址已更改!
  
  注:我們要抓取的頁(yè)面是這個(gè)頁(yè)面:品牌運營(yíng)
  在我們的爬取頁(yè)面中,我們需要觀(guān)察那里有哪些數據,一個(gè)頁(yè)面中有幾條數據。這點(diǎn)很重要,跟后面的代碼編寫(xiě)有關(guān),可以幫你檢查頁(yè)面上的所有信息是否都被爬取了。
  
  此時(shí),我們要注意的是,我們所在的頁(yè)面是“一級頁(yè)面”。在瀏覽過(guò)程中,我們隨機點(diǎn)擊一個(gè)帖子進(jìn)入后,會(huì )顯示“二級頁(yè)面”。這時(shí)候你也會(huì )發(fā)現url又出現了。改變了。
  比如我們點(diǎn)擊一??個(gè)品牌運營(yíng)實(shí)踐,二級頁(yè)面會(huì )自動(dòng)跳轉到這個(gè),生成一個(gè)新的鏈接。如圖所示:
  
  如何抓取頁(yè)面上的信息?
  在分析過(guò)程中,我們發(fā)現有的信息在一級頁(yè)面,有的在二級頁(yè)面。
  在一級頁(yè)面,我們可以得到什么信息?如圖所示:
  
  一共有五個(gè)有效數據:職位、公司名稱(chēng)、學(xué)歷、薪水、地址
  在二級頁(yè)面中,我們來(lái)看看可以獲得哪些有效數據、字段和刻度。如果覺(jué)得階段很重要,也可以納入爬蟲(chóng)的范圍,但我個(gè)人認為這不影響實(shí)習。畢竟,它不是在尋找正式的工作。影響不會(huì )很大,但是招聘的實(shí)習生數量比較重要。這里沒(méi)有顯示新兵的數量,也無(wú)法在圖片上顯示。以后可以添加。
  
  此時(shí),我們一共需要抓取7個(gè)數據,加上“人數”,一共8個(gè)數據,就是我們爬蟲(chóng)最終的目標數據。
  抓取“靜態(tài)”網(wǎng)頁(yè)
  下面分析一下什么是靜態(tài)網(wǎng)頁(yè),什么是動(dòng)態(tài)網(wǎng)頁(yè)。對于靜態(tài)網(wǎng)頁(yè),隨著(zhù)html代碼的生成,頁(yè)面的內容和顯示效果基本不會(huì )改變——除非你修改了頁(yè)面代碼。動(dòng)態(tài)網(wǎng)頁(yè)并非如此。雖然頁(yè)面代碼沒(méi)有改變,但是顯示的內容會(huì )隨著(zhù)時(shí)間、環(huán)境或數據庫操作的結果而改變。
  它們的區別在于靜態(tài)網(wǎng)頁(yè)中的數據是一勞永逸的,也就是說(shuō)一次性給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數據是隨著(zhù)頁(yè)面的逐步加載而逐漸呈現出來(lái)的,也就是說(shuō),如果使用靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù),是無(wú)法獲取其中所有數據的。
  值得強調的是,動(dòng)態(tài)網(wǎng)頁(yè)不應與頁(yè)面內容是否動(dòng)態(tài)相混淆。這里所說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)動(dòng)態(tài)效果沒(méi)有直接關(guān)系。動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文本內容或收錄各種動(dòng)畫(huà)內容。這些只是特定于網(wǎng)頁(yè)。內容的呈現形式,無(wú)論網(wǎng)頁(yè)是否具有動(dòng)態(tài)效果,只要是動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè),都可以稱(chēng)為動(dòng)態(tài)網(wǎng)頁(yè)。
  點(diǎn)擊“鼠標右鍵”,點(diǎn)擊“查看網(wǎng)頁(yè)源代碼”,最終效果如圖(部分截圖):
  
  這是最終反饋給您的數據。如果你發(fā)現你想要的數據都在里面,那么就可以說(shuō)是靜態(tài)頁(yè)面,否則就認為是“動(dòng)態(tài)頁(yè)面”。
  今天這里的案例是一個(gè)靜態(tài)網(wǎng)頁(yè)。
  眾所周知,在編寫(xiě)代碼之前,我們必須知道我們使用哪些方法、庫和模塊來(lái)幫助您解析數據。常用的數據解析方法有:re正則表達式、xpath、beatifulsoup、pyquery等。
  我們需要用到的是xpath解析方法來(lái)分析定位數據。
  二、爬蟲(chóng)代碼說(shuō)明
  導入相關(guān)庫
  爬取的第一步是考慮在爬取過(guò)程中需要哪些庫。您必須知道python是一種依賴(lài)于許多庫的語(yǔ)言。沒(méi)有庫的 Python 是不完整的。
  import pandas as pd # 用于數據存儲
import requests # 用于請求網(wǎng)頁(yè)
import chardet # 用于修改編碼
import re # 用于提取數據
from lxml import etree # 解析數據的庫
import time # 可以粗糙模擬人為請求網(wǎng)頁(yè)的速度
import warnings # 忽略代碼運行時(shí)候的警告信息
warnings.filterwarnings("ignore")
  2、請求一級頁(yè)面的源碼
  url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text)
  這里要注意①和②兩個(gè)地方。①處有兩個(gè)參數,一個(gè)是headers,一個(gè)是verify。其中headers是一種防反爬的措施,它使瀏覽器認為爬蟲(chóng)不是爬蟲(chóng),而是人們使用瀏覽器正常請求網(wǎng)頁(yè)。verify 是忽略安全證書(shū)提示。某些網(wǎng)頁(yè)會(huì )被視為不安全網(wǎng)頁(yè),并會(huì )提示您。只要記住這個(gè)參數。
  在②處,我們已經(jīng)獲得了網(wǎng)頁(yè)的源代碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和你電腦的解析方式,可能存在不一致,返回的結果會(huì )導致亂碼。此時(shí)需要修改編碼方式。chardet 庫可以幫助您自動(dòng)檢測網(wǎng)頁(yè)源代碼的編碼。(一個(gè)非常有用的三方庫chardet檢測文檔編碼)
  3、解析一級頁(yè)面中的信息
  # 1. 公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)
# 4. 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)
# 5. 薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
# 獲取二級頁(yè)面的鏈接
deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
此時(shí),你可以看到,我直接采用xpath一個(gè)個(gè)去解析一級頁(yè)面中的數據分析。在代碼末尾,可以看到:我們獲取到了二級頁(yè)面的鏈接,為我們后面爬取二級頁(yè)面中的信息,做準備。
解析二級頁(yè)面網(wǎng)頁(yè)中的信息
demand_list = []
area_list = []
scale_list = []
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人數
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)
# 7. 公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# 8. 公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
  需要注意的是,二級頁(yè)面也是一個(gè)頁(yè)面,在爬取里面的數據的時(shí)候需要請求這個(gè)頁(yè)面。因此,①②③處的代碼完全相同。
  4、翻頁(yè)操作
  https://www.shixi.com/search/i ... e%3D1
https://www.shixi.com/search/i ... e%3D2
https://www.shixi.com/search/i ... e%3D3
  隨意復制幾個(gè)不同頁(yè)面的 URL 并觀(guān)察差異。這里可以看出page參數后面的數字是不一樣的,哪一頁(yè)是數字,數字就是數字。
  x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
  由于我們已經(jīng)爬取了60頁(yè)的數據,所以這里構造了60個(gè)url,全部存放在url_list列表中。
  現在來(lái)看整個(gè)代碼,我不再用文字描述,直接在代碼中寫(xiě)注釋。
  import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 請求獲取一級頁(yè)面的源代碼
url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)
# 獲取一級頁(yè)面中的信息:一共有5個(gè)信息。
# ①公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
#③地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)
# ④ 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)
# ⑤薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
# ⑥獲取二級頁(yè)面的內容
deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
demand_list = []
area_list = []
scale_list = []
# 獲取二級頁(yè)面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)
#① 需要幾人
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)
# ②公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# ③公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
# ④ 將每個(gè)頁(yè)面獲取到的所有數據,存儲到DataFrame中。
data = pd.DataFrame({&#39;公司名&#39;:company_list,&#39;崗位名&#39;:job_list,&#39;地址&#39;:address_list,"學(xué)歷":degree_list,
&#39;薪資&#39;:salary_list,&#39;崗位需求量&#39;:demand_list,&#39;公司領(lǐng)域&#39;:area_list,&#39;公司規模&#39;:scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=[&#39;公司名&#39;,&#39;崗位名&#39;,&#39;地址&#39;,"學(xué)歷",&#39;薪資&#39;,&#39;崗位需求量&#39;,&#39;公司領(lǐng)域&#39;,&#39;公司規模&#39;])
# 這里進(jìn)行“翻頁(yè)”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存數據
res.to_csv(&#39;aliang.csv&#39;,encoding=&#39;utf_8_sig&#39;)
  這一套之后,爬蟲(chóng)的思路是不是瞬間清晰了?眼睛:我會(huì )的!手:我還是不會(huì )。多加練習。初學(xué)者不要急于求成,項目不多,但有技巧??赐敢粋€(gè)比看十個(gè)要有效得多。
  想要獲取源碼的朋友,點(diǎn)贊+評論,私聊~

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(1.網(wǎng)絡(luò )爬蟲(chóng)的基本概念網(wǎng)絡(luò )蜘蛛,機器人都能夠做到! )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 48 次瀏覽 ? 2022-01-13 21:28 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(1.網(wǎng)絡(luò )爬蟲(chóng)的基本概念網(wǎng)絡(luò )蜘蛛,機器人都能夠做到!
)
  1.網(wǎng)絡(luò )爬蟲(chóng)基本概念
  網(wǎng)絡(luò )爬蟲(chóng)(也稱(chēng)為網(wǎng)絡(luò )蜘蛛或機器人)是模擬客戶(hù)端發(fā)送網(wǎng)絡(luò )請求并接收請求響應的程序。它是一個(gè)按照一定的規則自動(dòng)抓取互聯(lián)網(wǎng)信息的程序。
  只要瀏覽器能做任何事情,原則上爬蟲(chóng)都能做到。
  2.網(wǎng)絡(luò )爬蟲(chóng)函數
  
  網(wǎng)絡(luò )爬蟲(chóng)可以手動(dòng)替換很多東西,比如用作搜索引擎,或者爬取網(wǎng)站上的圖片。比如有的朋友把一些網(wǎng)站上的所有圖片都爬進(jìn)去,集中在上面??梢赃M(jìn)行投資分析。
  有時(shí)候,可能有幾個(gè)我們比較喜歡的新聞網(wǎng)站,每次瀏覽都單獨打開(kāi)這些新聞網(wǎng)站比較麻煩。這時(shí)候就可以用網(wǎng)絡(luò )爬蟲(chóng)來(lái)爬取這多條新聞網(wǎng)站中的新聞信息,集中閱讀。
  有時(shí)候,我們在網(wǎng)上瀏覽信息的時(shí)候,會(huì )發(fā)現有很多廣告。這時(shí)也可以利用爬蟲(chóng)來(lái)爬取相應網(wǎng)頁(yè)上的信息,從而自動(dòng)過(guò)濾掉這些廣告,方便信息的閱讀和使用。
  有時(shí)候,我們需要做營(yíng)銷(xiāo),所以如何找到目標客戶(hù)和目標客戶(hù)的聯(lián)系方式是一個(gè)關(guān)鍵問(wèn)題。我們可以手動(dòng)搜索互聯(lián)網(wǎng),但這會(huì )非常低效。這時(shí)候,我們可以通過(guò)爬蟲(chóng)設置相應的規則,自動(dòng)采集從互聯(lián)網(wǎng)上獲取目標用戶(hù)的聯(lián)系方式,供我們營(yíng)銷(xiāo)使用。
  有時(shí)候,我們想分析某個(gè)網(wǎng)站的用戶(hù)信息,比如分析網(wǎng)站的用戶(hù)活躍度、發(fā)言次數、熱門(mén)文章等信息,如果我們沒(méi)有網(wǎng)站@ &gt;管理員,手動(dòng)統計將是一個(gè)非常龐大的工程。此時(shí),您可以使用爬蟲(chóng)輕松采集對這些數據進(jìn)行進(jìn)一步分析,并且所有的爬取操作都是自動(dòng)進(jìn)行的,我們只需要編寫(xiě)相應的爬蟲(chóng)并設計相應的爬蟲(chóng)即可。規則會(huì )做。
  此外,爬蟲(chóng)還可以實(shí)現很多強大的功能??傊?,爬蟲(chóng)的出現在一定程度上可以替代人工訪(fǎng)問(wèn)網(wǎng)頁(yè)。因此,我們以前需要手動(dòng)訪(fǎng)問(wèn)互聯(lián)網(wǎng)信息的操作現在可以通過(guò)爬蟲(chóng)實(shí)現自動(dòng)化,從而更有效地使用互聯(lián)網(wǎng)中的有效信息。.
  3.安裝第三方庫
  在爬取和解析數據之前,需要在 Python 運行環(huán)境中下載并安裝第三方庫請求。
  在Windows系統中,打開(kāi)cmd(命令提示符)界面,在界面輸入pip install requests,回車(chē)安裝。(注意連接網(wǎng)絡(luò ))如下圖
  
  安裝完成,如圖
   查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(1.網(wǎng)絡(luò )爬蟲(chóng)的基本概念網(wǎng)絡(luò )蜘蛛,機器人都能夠做到!
)
  1.網(wǎng)絡(luò )爬蟲(chóng)基本概念
  網(wǎng)絡(luò )爬蟲(chóng)(也稱(chēng)為網(wǎng)絡(luò )蜘蛛或機器人)是模擬客戶(hù)端發(fā)送網(wǎng)絡(luò )請求并接收請求響應的程序。它是一個(gè)按照一定的規則自動(dòng)抓取互聯(lián)網(wǎng)信息的程序。
  只要瀏覽器能做任何事情,原則上爬蟲(chóng)都能做到。
  2.網(wǎng)絡(luò )爬蟲(chóng)函數
  
  網(wǎng)絡(luò )爬蟲(chóng)可以手動(dòng)替換很多東西,比如用作搜索引擎,或者爬取網(wǎng)站上的圖片。比如有的朋友把一些網(wǎng)站上的所有圖片都爬進(jìn)去,集中在上面??梢赃M(jìn)行投資分析。
  有時(shí)候,可能有幾個(gè)我們比較喜歡的新聞網(wǎng)站,每次瀏覽都單獨打開(kāi)這些新聞網(wǎng)站比較麻煩。這時(shí)候就可以用網(wǎng)絡(luò )爬蟲(chóng)來(lái)爬取這多條新聞網(wǎng)站中的新聞信息,集中閱讀。
  有時(shí)候,我們在網(wǎng)上瀏覽信息的時(shí)候,會(huì )發(fā)現有很多廣告。這時(shí)也可以利用爬蟲(chóng)來(lái)爬取相應網(wǎng)頁(yè)上的信息,從而自動(dòng)過(guò)濾掉這些廣告,方便信息的閱讀和使用。
  有時(shí)候,我們需要做營(yíng)銷(xiāo),所以如何找到目標客戶(hù)和目標客戶(hù)的聯(lián)系方式是一個(gè)關(guān)鍵問(wèn)題。我們可以手動(dòng)搜索互聯(lián)網(wǎng),但這會(huì )非常低效。這時(shí)候,我們可以通過(guò)爬蟲(chóng)設置相應的規則,自動(dòng)采集從互聯(lián)網(wǎng)上獲取目標用戶(hù)的聯(lián)系方式,供我們營(yíng)銷(xiāo)使用。
  有時(shí)候,我們想分析某個(gè)網(wǎng)站的用戶(hù)信息,比如分析網(wǎng)站的用戶(hù)活躍度、發(fā)言次數、熱門(mén)文章等信息,如果我們沒(méi)有網(wǎng)站@ &gt;管理員,手動(dòng)統計將是一個(gè)非常龐大的工程。此時(shí),您可以使用爬蟲(chóng)輕松采集對這些數據進(jìn)行進(jìn)一步分析,并且所有的爬取操作都是自動(dòng)進(jìn)行的,我們只需要編寫(xiě)相應的爬蟲(chóng)并設計相應的爬蟲(chóng)即可。規則會(huì )做。
  此外,爬蟲(chóng)還可以實(shí)現很多強大的功能??傊?,爬蟲(chóng)的出現在一定程度上可以替代人工訪(fǎng)問(wèn)網(wǎng)頁(yè)。因此,我們以前需要手動(dòng)訪(fǎng)問(wèn)互聯(lián)網(wǎng)信息的操作現在可以通過(guò)爬蟲(chóng)實(shí)現自動(dòng)化,從而更有效地使用互聯(lián)網(wǎng)中的有效信息。.
  3.安裝第三方庫
  在爬取和解析數據之前,需要在 Python 運行環(huán)境中下載并安裝第三方庫請求。
  在Windows系統中,打開(kāi)cmd(命令提示符)界面,在界面輸入pip install requests,回車(chē)安裝。(注意連接網(wǎng)絡(luò ))如下圖
  
  安裝完成,如圖
  

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(頭條搜索爬蟲(chóng)暴力抓取網(wǎng)站內容直接癱瘓百度也沒(méi)有這么折騰)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-01-13 21:25 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(頭條搜索爬蟲(chóng)暴力抓取網(wǎng)站內容直接癱瘓百度也沒(méi)有這么折騰)
  近日,一位站長(cháng)在網(wǎng)上發(fā)帖抱怨字節跳動(dòng)為了快速發(fā)展搜索業(yè)務(wù),派出爬蟲(chóng)暴力抓取網(wǎng)站內容。@>業(yè)主造成了很大的損失和麻煩,嚴重影響了網(wǎng)站的正常用戶(hù)訪(fǎng)問(wèn)。
  站長(cháng)說(shuō),今年7月突然發(fā)現公司的網(wǎng)站不能頻繁打開(kāi),網(wǎng)頁(yè)加載極慢,有時(shí)甚至直接癱瘓。經(jīng)過(guò)一系列排查,在服務(wù)器日志中發(fā)現了bytespider爬蟲(chóng)的蹤跡。爬蟲(chóng)的爬取頻率每天幾百萬(wàn)次,最高的是幾千萬(wàn)次。服務(wù)器帶寬負載飆升至 100%,爬蟲(chóng)在爬取時(shí)完全不遵循 網(wǎng)站 robots 協(xié)議。
  站長(cháng)順著(zhù)爬蟲(chóng)的IP地址查詢(xún),確認該爬蟲(chóng)是字節跳動(dòng)搜索爬蟲(chóng)。
  另外,我還從CSDN、V2EX等技術(shù)論壇了解到,字節跳動(dòng)開(kāi)始搜索后,其實(shí)網(wǎng)上一直有站長(cháng)抱怨頭條搜索爬蟲(chóng)爬得太猛,被字節跳動(dòng)搜索爬蟲(chóng)。這不是個(gè)例,很多小網(wǎng)站他們都沒(méi)有放過(guò)。
  一些網(wǎng)站小站長(cháng)抱怨:字節跳動(dòng)的爬蟲(chóng)“一上午就向網(wǎng)站發(fā)出46萬(wàn)個(gè)請求”,網(wǎng)站癱瘓了,百度也沒(méi)有那么麻煩!
  最后,站長(cháng)說(shuō),對于像我們這樣做SEO的人來(lái)說(shuō),主要目標是希望自己的首頁(yè)網(wǎng)站能夠在主流搜索引擎的搜索結果中排名靠前。360、收錄等搜索引擎的標準爬取很受歡迎,但是今日頭條搜索爬蟲(chóng)的瘋狂爬取內容網(wǎng)站完全癱瘓,不僅沒(méi)有給網(wǎng)站帶來(lái)流量也影響正常用戶(hù)訪(fǎng)問(wèn),不是很“特殊”。
  但字節跳動(dòng)對此的回應是,“網(wǎng)絡(luò )報道不實(shí),目前今日頭條搜索有反饋機制。網(wǎng)站由于爬蟲(chóng)受到影響,可以通過(guò)郵件反饋直接處理?!?明是不準備正面回應的。
  因此,從頭條搜索爬蟲(chóng)暴力爬取網(wǎng)站的內容來(lái)看,雷哥個(gè)人認為字節跳動(dòng)進(jìn)軍全網(wǎng)搜索,攪動(dòng)搜索市場(chǎng)是好事,但為了快速崛起,讓他的爬蟲(chóng)到處亂爬,剛好有問(wèn)題,大網(wǎng)站服務(wù)器配置高,技術(shù)人員多,但是很多小網(wǎng)站受不了字節的折騰- 完全擊敗搜索爬蟲(chóng)。
  搜索引擎的索引數據是一點(diǎn)一點(diǎn)積累的。百度和搜狗.360經(jīng)歷了這么多年的發(fā)展和積累,才走到了今天。今日頭條搜索瘋狂爬取內容。遠離! 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(頭條搜索爬蟲(chóng)暴力抓取網(wǎng)站內容直接癱瘓百度也沒(méi)有這么折騰)
  近日,一位站長(cháng)在網(wǎng)上發(fā)帖抱怨字節跳動(dòng)為了快速發(fā)展搜索業(yè)務(wù),派出爬蟲(chóng)暴力抓取網(wǎng)站內容。@>業(yè)主造成了很大的損失和麻煩,嚴重影響了網(wǎng)站的正常用戶(hù)訪(fǎng)問(wèn)。
  站長(cháng)說(shuō),今年7月突然發(fā)現公司的網(wǎng)站不能頻繁打開(kāi),網(wǎng)頁(yè)加載極慢,有時(shí)甚至直接癱瘓。經(jīng)過(guò)一系列排查,在服務(wù)器日志中發(fā)現了bytespider爬蟲(chóng)的蹤跡。爬蟲(chóng)的爬取頻率每天幾百萬(wàn)次,最高的是幾千萬(wàn)次。服務(wù)器帶寬負載飆升至 100%,爬蟲(chóng)在爬取時(shí)完全不遵循 網(wǎng)站 robots 協(xié)議。
  站長(cháng)順著(zhù)爬蟲(chóng)的IP地址查詢(xún),確認該爬蟲(chóng)是字節跳動(dòng)搜索爬蟲(chóng)。
  另外,我還從CSDN、V2EX等技術(shù)論壇了解到,字節跳動(dòng)開(kāi)始搜索后,其實(shí)網(wǎng)上一直有站長(cháng)抱怨頭條搜索爬蟲(chóng)爬得太猛,被字節跳動(dòng)搜索爬蟲(chóng)。這不是個(gè)例,很多小網(wǎng)站他們都沒(méi)有放過(guò)。
  一些網(wǎng)站小站長(cháng)抱怨:字節跳動(dòng)的爬蟲(chóng)“一上午就向網(wǎng)站發(fā)出46萬(wàn)個(gè)請求”,網(wǎng)站癱瘓了,百度也沒(méi)有那么麻煩!
  最后,站長(cháng)說(shuō),對于像我們這樣做SEO的人來(lái)說(shuō),主要目標是希望自己的首頁(yè)網(wǎng)站能夠在主流搜索引擎的搜索結果中排名靠前。360、收錄等搜索引擎的標準爬取很受歡迎,但是今日頭條搜索爬蟲(chóng)的瘋狂爬取內容網(wǎng)站完全癱瘓,不僅沒(méi)有給網(wǎng)站帶來(lái)流量也影響正常用戶(hù)訪(fǎng)問(wèn),不是很“特殊”。
  但字節跳動(dòng)對此的回應是,“網(wǎng)絡(luò )報道不實(shí),目前今日頭條搜索有反饋機制。網(wǎng)站由于爬蟲(chóng)受到影響,可以通過(guò)郵件反饋直接處理?!?明是不準備正面回應的。
  因此,從頭條搜索爬蟲(chóng)暴力爬取網(wǎng)站的內容來(lái)看,雷哥個(gè)人認為字節跳動(dòng)進(jìn)軍全網(wǎng)搜索,攪動(dòng)搜索市場(chǎng)是好事,但為了快速崛起,讓他的爬蟲(chóng)到處亂爬,剛好有問(wèn)題,大網(wǎng)站服務(wù)器配置高,技術(shù)人員多,但是很多小網(wǎng)站受不了字節的折騰- 完全擊敗搜索爬蟲(chóng)。
  搜索引擎的索引數據是一點(diǎn)一點(diǎn)積累的。百度和搜狗.360經(jīng)歷了這么多年的發(fā)展和積累,才走到了今天。今日頭條搜索瘋狂爬取內容。遠離!

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(入門(mén)文章數據庫入門(mén)指南系列(一)·#11·cdalogic/cdablog)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-01-13 02:01 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(入門(mén)文章數據庫入門(mén)指南系列(一)·#11·cdalogic/cdablog)
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據redis-spider批量下載百度、新浪、鳳凰、搜狐網(wǎng)站所有熱門(mén)話(huà)題內容elasticsearch-parser全文搜索工具elasticsearch-dnspod解析頁(yè)面數據blogger搜索各大人氣博客
  真羨慕你年紀輕輕不急不慢,就開(kāi)始學(xué)計算機技術(shù)。計算機是真正可以學(xué)到一輩子的東西。上面這些我告訴你,一年之后肯定比30歲有技術(shù)有資本的人。
  在計算機領(lǐng)域,
  希望你可以學(xué)習一下數據庫相關(guān)的知識,如nosql或者mongodb,這些都是你大數據開(kāi)發(fā)基礎中必不可少的組成。你可以從學(xué)習數據庫開(kāi)始入手,或者sql開(kāi)始入手,
  netframework不過(guò)呢,看書(shū)理論性太強,光理論書(shū)就夠你看幾年了。還是老老實(shí)實(shí)看視頻吧。
  剛好昨天剛寫(xiě)了一個(gè)數據庫管理員界面,希望對你有所幫助,
  推薦一本數據庫管理員的入門(mén)手冊,
  我寫(xiě)了一篇入門(mén)文章數據庫入門(mén)指南系列(一)·issue#11·cdalogic/cdablog,
  1.推薦《這個(gè)網(wǎng)站是數據庫(databasemanagementtechniquesandtools)》,應該是hadoop之前經(jīng)典書(shū)籍。2.再推薦《數據庫系統概念(databasesystems)》3.又來(lái)個(gè)《數據庫系統概念導論(databasesystems)》4.還有一本《數據庫管理系統(databasemanagementsystems)》。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(入門(mén)文章數據庫入門(mén)指南系列(一)·#11·cdalogic/cdablog)
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據redis-spider批量下載百度、新浪、鳳凰、搜狐網(wǎng)站所有熱門(mén)話(huà)題內容elasticsearch-parser全文搜索工具elasticsearch-dnspod解析頁(yè)面數據blogger搜索各大人氣博客
  真羨慕你年紀輕輕不急不慢,就開(kāi)始學(xué)計算機技術(shù)。計算機是真正可以學(xué)到一輩子的東西。上面這些我告訴你,一年之后肯定比30歲有技術(shù)有資本的人。
  在計算機領(lǐng)域,
  希望你可以學(xué)習一下數據庫相關(guān)的知識,如nosql或者mongodb,這些都是你大數據開(kāi)發(fā)基礎中必不可少的組成。你可以從學(xué)習數據庫開(kāi)始入手,或者sql開(kāi)始入手,
  netframework不過(guò)呢,看書(shū)理論性太強,光理論書(shū)就夠你看幾年了。還是老老實(shí)實(shí)看視頻吧。
  剛好昨天剛寫(xiě)了一個(gè)數據庫管理員界面,希望對你有所幫助,
  推薦一本數據庫管理員的入門(mén)手冊,
  我寫(xiě)了一篇入門(mén)文章數據庫入門(mén)指南系列(一)·issue#11·cdalogic/cdablog,
  1.推薦《這個(gè)網(wǎng)站是數據庫(databasemanagementtechniquesandtools)》,應該是hadoop之前經(jīng)典書(shū)籍。2.再推薦《數據庫系統概念(databasesystems)》3.又來(lái)個(gè)《數據庫系統概念導論(databasesystems)》4.還有一本《數據庫管理系統(databasemanagementsystems)》。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(產(chǎn)品經(jīng)理網(wǎng)站結構比較簡(jiǎn)單的翻太慢錯的方法有哪些)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 55 次瀏覽 ? 2022-01-12 08:09 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(產(chǎn)品經(jīng)理網(wǎng)站結構比較簡(jiǎn)單的翻太慢錯的方法有哪些)
  再次重申:我不是程序員,也沒(méi)有涉及代碼。當頁(yè)面被修改時(shí),我只涉及復制和粘貼。
  要去給朋友圈添點(diǎn)專(zhuān)業(yè)氣息,需要添加一些新的微信ID;
  在哪里可以找到專(zhuān)業(yè)的微信賬號?
  想著(zhù)大家都是產(chǎn)品經(jīng)理,我看到傳播者在文章下的評論里留下微信,但是每個(gè)文章的翻譯太慢了,也許你可以用一個(gè)工具把所有的評論發(fā)到抓住它進(jìn)行過(guò)濾。
  網(wǎng)站結構比較簡(jiǎn)單,這個(gè)應該是簡(jiǎn)單的抓取,到最后會(huì )發(fā)現自己錯了。
  以下簡(jiǎn)稱(chēng)人人為產(chǎn)品經(jīng)理網(wǎng)站;
  上一篇文章中已經(jīng)詳細介紹了常規爬取的過(guò)程,重復部分本文不再贅述;
  思考過(guò)程:如果有需求,找到需求對應的信息,找到信息對應的位置,找到位置對應的工具,找到工具對應的功能或技能。
  一:換算法,使用更準確的方法;
  上一篇文章介紹了一種生成鏈接的方法,大家準備用同樣的方法再做一遍;
  然后遇到第一個(gè)難點(diǎn):大家的鏈接結構不統一,比如:/pmd/1660079.html、/pd/1659496.html、/ai/1648500.html等.;
  總共有10多個(gè)類(lèi)別,最大數量為1,660,079,超過(guò)160萬(wàn)。如果每個(gè)類(lèi)別產(chǎn)生超過(guò)160萬(wàn)個(gè)鏈接,去鏈接審核工具進(jìn)行審核,可能需要十天以上的時(shí)間來(lái)審核鏈接;
  這種方法是行不通的,需要一個(gè)新的方法:網(wǎng)站提供了一個(gè)方便的通道——列表頁(yè),通過(guò)它可以獲得整個(gè)列表的鏈接。
  使用這種方法,從十幾天,這個(gè)步驟可以縮短到幾個(gè)小時(shí)。
  
  二:確定約束條件,根據約束條件改進(jìn)流程
  在得到鏈接之前,我做了一個(gè)計算,有幾萬(wàn)條文章,而文章下的評論就更多了;
  該工具的數據導出限制為 10,000 條。這次真的要花錢(qián)升級嗎?
  又想到一句話(huà):帶枷鎖跳舞,不帶枷鎖跳舞不是技巧,帶枷鎖跳舞是技巧。
  最近一直在思考一個(gè)基本的二元關(guān)系問(wèn)題:A和B之間有多少條路徑?
  對初步思考的回答:A和B之間至少有兩條路徑:AB和BA。
  這說(shuō)明了這樣一個(gè)事實(shí),即兩件事之間必須有兩條路徑,并且除了常規路徑之外至少還有一條其他路徑。
  把這個(gè)結論應用到限定條件上,那么解決問(wèn)題的路徑至少有兩條:
  1:常規路徑:需求(自身)不變,(環(huán)境)極限擴大,極限適應需求;
  2:反向路徑:限制(環(huán)境)不變,壓縮(自己)需求,使需求適應限制;
  第二條反向路徑為解決問(wèn)題帶來(lái)了新的視角,為流程演化建立了新的理論基礎。
  原來(lái)的流程是:
  獲取鏈接—&gt;導出鏈接(限制出現1)—&gt;重新導入—&gt;評論抓取—&gt;導出評論(限制出現2)—&gt;本地過(guò)濾。
  第一個(gè)改進(jìn):重新定義需求,細化獲取環(huán)節:
  其實(shí)第二階段需要的不是任何文章,而是帶注釋的文章(沒(méi)有注釋就不用搶注釋了),在初始條件上加上細化條件提前過(guò)濾,一下子把鏈接數減少了三分之一。
  新流程:獲取精確鏈接—&gt;導出鏈接(限制1)的位置—&gt;重新導入—&gt;評論捕獲—&gt;導出評論(限制2)的位置—&gt;本地過(guò)濾。
  第二次改進(jìn):將新的認識應用到大局中,在第二階段增加細化條件;
  不是所有的評論都要被抓,而是收錄公眾號或微信賬號的評論。
  新流程:獲取精準鏈接—&gt;導出鏈接(限制1)的位置—&gt;重新導入—&gt;準確抓取評論—&gt;導出評論(限制2)的位置—&gt;本地過(guò)濾。
  第三次改進(jìn):合并和推進(jìn)流程
  我在中間去了一次洗手間,洗手間做得很好。在其中,我想到了兩個(gè)過(guò)程。為什么要把這兩個(gè)進(jìn)程分開(kāi)?
  這兩個(gè)階段是一個(gè)連續的過(guò)程,如果這些過(guò)程可以合并,第一階段的限制就會(huì )消失。
  這說(shuō)明除了適應約束之外,還可以選擇合理地調整流程以消除或跳過(guò)約束。
  將兩個(gè)流程合二為一后,新流程:獲取精準鏈接—&gt;準確抓取評論—&gt;導出評論(限制位置2)—&gt;本地過(guò)濾。
  由于重新定義了兩階段要求,最終出口數據中只剩下有意義的部分。
  這個(gè)改進(jìn)過(guò)程也讓我發(fā)現了一個(gè)優(yōu)化的關(guān)鍵點(diǎn):在設計過(guò)程時(shí),結合約束,用約束激發(fā)深度優(yōu)化。
  最終得到了我想要的數據,結果發(fā)現約束不是敵人,約束是持續創(chuàng )新的重要條件。
  這一發(fā)現也為創(chuàng )新開(kāi)辟了一種新的思維方式:自我強加的限制,沒(méi)有限制創(chuàng )造限制。就像這個(gè)文章,本來(lái)是不打算寫(xiě)的,但是我給自己設計了一個(gè)新的限制:把事情做完,從實(shí)踐到總結,就完成了。
  
  在過(guò)濾數據時(shí),我有點(diǎn)氣餒。評論數據是非結構化的,很難快速過(guò)濾此類(lèi)數據。這也讓我有了一個(gè)新的發(fā)現:數據的價(jià)值取決于結構的程度。結構化數據很少。既然如此,與其捕獲雜亂無(wú)章的數據,事后對其進(jìn)行結構化,不如在初始設計中建立結構化的數據捕獲過(guò)程。
  
  結束了嗎?確實(shí)是時(shí)候結束了,本來(lái)預定的數據已經(jīng)拿到了;
  但這并沒(méi)有結束,甚至真正的困難才剛剛開(kāi)始,所以這是一個(gè)意外。
  三:搶公眾號,重新整理全站內容;
  一邊抓著(zhù)上面的微信,一邊也隔出了一部分公眾號,很少。如果能得到更多的公眾號,或許可以做一個(gè)專(zhuān)門(mén)的頁(yè)面來(lái)提供一個(gè)服務(wù),也就是集成即服務(wù)。該方法的效果很差,需要更高效的采集方法;
  我想還有一個(gè)地方也會(huì )放公眾號,每個(gè)文章底部的作者介紹部分:
  
  如果能夠獲取大量數據,就可以形成公眾賬戶(hù)矩陣。據我所知,沒(méi)有這樣的信息庫,信息集中對用戶(hù)也很有價(jià)值;
  準備開(kāi)始抓取,遇到了第一個(gè)難點(diǎn):文章內容很多,如何定位要抓取的對象?
  定位要抓拍的物體有一個(gè)竅門(mén):分析物體的特征,尤其是獨特的特征,通過(guò)獨特的特征準確識別;比如這次要抓的對象是一個(gè)公眾號,而這三個(gè)詞在文章中也經(jīng)常出現,但是出現在文章中的時(shí)候一般不會(huì )跟a : 符號,僅在作者介紹時(shí)才收錄,這是關(guān)鍵特性。
  第一個(gè)改進(jìn):多角度觀(guān)察數據,增加要捕獲的數據類(lèi)型;
  這是一個(gè)非常偶然的想法。我想著(zhù)數據可能可以供官方參考,然后又想到了大家官方需要的數據格式。然后我想到了一個(gè)新的需求場(chǎng)景:如果提供給用戶(hù),用戶(hù)面對的是數據。數據應該如何使用?
  三個(gè)角色:我、用戶(hù)和人人官方。每個(gè)角色需要不同的數據并使用不同的方法。比如我只需要公眾號,用戶(hù)需要更多數據。用戶(hù)將希望執行一些過(guò)濾,以便他們可以找到適合您自己的公共帳戶(hù)。
  
  第二個(gè)改進(jìn):增加輔助判斷條件;
  在爬取中,我們遇到了一個(gè)問(wèn)題:如果沒(méi)有符合設定條件的數據,數據就會(huì )留空。這類(lèi)數據需要丟棄(否則會(huì )占用導出索引)。為了丟棄數據,必須對數據進(jìn)行處理。判斷,進(jìn)行判斷,數據不能為空;
  這里有一個(gè)矛盾或沖突:需要刪除空數據,但只能刪除非空數據;終于找到了一個(gè)辦法:給所有數據加上一個(gè)固定的前綴——delete,這樣無(wú)論數據是否為空,最終都不會(huì )為空;
  比如兩條數據:一條數據為空,需要刪除,加上前綴后,數據變?yōu)椋篸elete;數據B數據不為空,加前綴后數據變?yōu)閯h除+原創(chuàng )數據;要確定哪些數據只收錄刪除,您可以丟棄,因為只有空數據將只收錄添加的前綴。
  
  這種方法是excel中的一個(gè)技巧:當數據本身難以判斷時(shí),加一列輔助判斷,讓具有相同特征的選項轉化為易于識別的數據;如A/A/B/B/C/D,需要確定哪些重復項單獨列出。因為A/B不同,無(wú)法實(shí)現排序。這時(shí)候可以添加一個(gè)單獨的輔助判斷列,將重復項轉換為1,不重復項轉換為0,然后對新列進(jìn)行排序。
  在最后一頁(yè),我也使用了這個(gè)技巧,通過(guò)在未認證的前面加上前綴A,讓未認證的在排序的時(shí)候總是排成一行。
  第三項改進(jìn):增加精準判斷條件;
  由于我不是程序員,對程序了解不多,無(wú)法準確判斷代碼的含義,這就帶來(lái)了一個(gè)問(wèn)題:不知道代碼是否能完全達到目的,同時(shí)處理一些邊緣情況;
  在第一次數據捕獲后,我們發(fā)現了這樣一種情況:當數據中收錄-等符號時(shí),捕獲會(huì )被中斷。很多公眾號都收錄-符號,結果只抓到一半,比如lmh-china,只會(huì )抓lmh。
  這是一個(gè)超出我能力的改進(jìn),所以我準備手動(dòng)修改,但是接近1000個(gè)公眾號,效率太低,如果你能改進(jìn)爬取過(guò)程并修復這個(gè)問(wèn)題,那么你可以重新爬取再次使用正確的數據,我決定試一試。
  最終,我添加了結束條件(正則表達式),必須遇到,或者。會(huì )結束,遇到其他符號也不會(huì )結束。
  這并不意味著(zhù)我可以編寫(xiě)代碼。該工具提供了一個(gè)工具來(lái)幫助生成正則表達式。然后我在互聯(lián)網(wǎng)上搜索答案以找到可能的答案,并不斷嘗試成功。
  PS:寫(xiě)這篇文章的時(shí)候,又查了一遍資料,發(fā)現上次修改沒(méi)有生效,還是老流程。我必須確認未來(lái)的重要步驟,以確認我在做正確的事情。
  改進(jìn)之四:進(jìn)行下一步,從實(shí)際場(chǎng)景中觀(guān)察數據;
  抓數據的時(shí)候想,可能需要一個(gè)地方放數據,這樣方便查看,一張簡(jiǎn)單的表就夠了,還需要排序,這樣就可以根據自己的需要進(jìn)行排序了;
  找了幾個(gè)插件,最后選擇了一個(gè)簡(jiǎn)單的頁(yè)面,經(jīng)過(guò)測試,符合我的要求;
  
  這次提前操作數據讓我決定再次添加一個(gè)數據類(lèi)型,添加一個(gè)經(jīng)過(guò)認證的數據類(lèi)型。人人網(wǎng)網(wǎng)站擁有各類(lèi)認證。添加新的排序字段對用戶(hù)有好處,可以讓我排除官方用戶(hù),排除官方用戶(hù)意味著(zhù)排除非貢獻者的公共賬戶(hù)。
  這些官方發(fā)布的文章中的公眾號是官方轉載的來(lái)源,也很有價(jià)值;它們可以制成單獨的頁(yè)面。
  改進(jìn)之五:試用公共CDN地址查找bug;
  由于所有網(wǎng)頁(yè)都使用開(kāi)源程序,我可以將本地的css和js改成免費的CDN地址,速度更快,節省帶寬;國內外有一些服務(wù)為開(kāi)源程序提供免費CDN,如/,合理節省使用成本;
  
  在不斷測試的過(guò)程中,突然發(fā)現了一個(gè)致命的bug:排序錯誤,這個(gè)bug一下子讓我陷入了深淵。如果存在此錯誤,那么對用戶(hù)最有意義的功能將失?。?br />   
  我沒(méi)有修復錯誤的能力,但我想到了一些可能性。作為一個(gè)開(kāi)源程序,按理說(shuō)這樣明顯的排序bug肯定會(huì )被修復。頁(yè)面使用的版本比較舊。這是原因嗎?
  我去CDN找了最新版本,頁(yè)面直接崩潰了;回去找了個(gè)中間版本,bug修復了,原來(lái)是程序版本問(wèn)題。
  這個(gè)修訂過(guò)程教會(huì )了我一個(gè)反向精益思想:從后到前改進(jìn),提前驗證整個(gè)過(guò)程,如果可能的話(huà),把整個(gè)過(guò)程,特別是還沒(méi)有達到的過(guò)程,并努力做到在少量數據的支持下。實(shí)際場(chǎng)景模擬,去模擬場(chǎng)景看看,這個(gè)模擬有利于整個(gè)過(guò)程的改進(jìn),場(chǎng)景中的思維可以反饋到整個(gè)過(guò)程的改進(jìn)。
  改進(jìn)之六:增加公眾號查詢(xún);
  看了幾個(gè)公眾號,發(fā)現很多公眾號已經(jīng)不存在或者沒(méi)有更新。如果能提供一個(gè)新的篩選維度,讓用戶(hù)可以直接看到公眾號的更新,這個(gè)數據會(huì )更有價(jià)值;
  我知道搜狗搜索提供了微信搜外,我開(kāi)始嘗試爬取搜狗搜索,但是搜狗搜索的反爬蟲(chóng)規則太嚴格了。
  這個(gè)想法失敗了,但我可以提供一個(gè)折衷方案:點(diǎn)擊直接查詢(xún);
  檢查搜狗搜索的鏈接規則后,生成所有公眾號對應的查詢(xún)鏈接。
  
  最終頁(yè)面如下所示:
  
  您可以在頁(yè)面內搜索并按列排序。
  我將頁(yè)面上傳到服務(wù)器,頁(yè)面地址:open.skyfollowsnow.pro/special/woshipm-author/。
  您可以在此處查看本次抓取中使用的工具和知識:open.skyfollowsnow.pro/?thread-55.htm。
  第七項改進(jìn):統一修改位置;
  將文件上傳到服務(wù)器后,我犯了一個(gè)明顯的錯誤:在服務(wù)器中修改文檔,很多修改必須在本地,于是出現了一個(gè)新問(wèn)題:有些東西是在服務(wù)器上修改的,有些東西是在本地修改的,文件兩端不一致;
  雖小,但也是很實(shí)用的一課:統一修改位置,避免協(xié)作時(shí)起點(diǎn)不一致。
  其他:
  在本次爬取中,使用了兩種新的方法來(lái)解決兩個(gè)問(wèn)題:
  1:解決json數據中a標簽不被解析的問(wèn)題;
  作者ID和空格鏈接本來(lái)是兩列,但是我以為可以合并,但是一旦合并就會(huì )報錯,然后我以為我看到了一個(gè)用\符號隔開(kāi)的程序”,于是試了一下,確實(shí)如此。
  2:解決excel列過(guò)多時(shí)合并容易出錯的問(wèn)題;
  最后合并成需要的數據時(shí),需要合并的項很多,很容易發(fā)現順序不對。為了一次性看到所有列的選項,我使用了一個(gè)新工具:桌面紋理工具 Snipaste,這也是我之前見(jiàn)過(guò)的。程序使用的工具正好解決了這個(gè)問(wèn)題:
  
  
  平時(shí)看到新事物的時(shí)候要有點(diǎn)好奇,需要的時(shí)候可能會(huì )想到。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(產(chǎn)品經(jīng)理網(wǎng)站結構比較簡(jiǎn)單的翻太慢錯的方法有哪些)
  再次重申:我不是程序員,也沒(méi)有涉及代碼。當頁(yè)面被修改時(shí),我只涉及復制和粘貼。
  要去給朋友圈添點(diǎn)專(zhuān)業(yè)氣息,需要添加一些新的微信ID;
  在哪里可以找到專(zhuān)業(yè)的微信賬號?
  想著(zhù)大家都是產(chǎn)品經(jīng)理,我看到傳播者在文章下的評論里留下微信,但是每個(gè)文章的翻譯太慢了,也許你可以用一個(gè)工具把所有的評論發(fā)到抓住它進(jìn)行過(guò)濾。
  網(wǎng)站結構比較簡(jiǎn)單,這個(gè)應該是簡(jiǎn)單的抓取,到最后會(huì )發(fā)現自己錯了。
  以下簡(jiǎn)稱(chēng)人人為產(chǎn)品經(jīng)理網(wǎng)站;
  上一篇文章中已經(jīng)詳細介紹了常規爬取的過(guò)程,重復部分本文不再贅述;
  思考過(guò)程:如果有需求,找到需求對應的信息,找到信息對應的位置,找到位置對應的工具,找到工具對應的功能或技能。
  一:換算法,使用更準確的方法;
  上一篇文章介紹了一種生成鏈接的方法,大家準備用同樣的方法再做一遍;
  然后遇到第一個(gè)難點(diǎn):大家的鏈接結構不統一,比如:/pmd/1660079.html、/pd/1659496.html、/ai/1648500.html等.;
  總共有10多個(gè)類(lèi)別,最大數量為1,660,079,超過(guò)160萬(wàn)。如果每個(gè)類(lèi)別產(chǎn)生超過(guò)160萬(wàn)個(gè)鏈接,去鏈接審核工具進(jìn)行審核,可能需要十天以上的時(shí)間來(lái)審核鏈接;
  這種方法是行不通的,需要一個(gè)新的方法:網(wǎng)站提供了一個(gè)方便的通道——列表頁(yè),通過(guò)它可以獲得整個(gè)列表的鏈接。
  使用這種方法,從十幾天,這個(gè)步驟可以縮短到幾個(gè)小時(shí)。
  
  二:確定約束條件,根據約束條件改進(jìn)流程
  在得到鏈接之前,我做了一個(gè)計算,有幾萬(wàn)條文章,而文章下的評論就更多了;
  該工具的數據導出限制為 10,000 條。這次真的要花錢(qián)升級嗎?
  又想到一句話(huà):帶枷鎖跳舞,不帶枷鎖跳舞不是技巧,帶枷鎖跳舞是技巧。
  最近一直在思考一個(gè)基本的二元關(guān)系問(wèn)題:A和B之間有多少條路徑?
  對初步思考的回答:A和B之間至少有兩條路徑:AB和BA。
  這說(shuō)明了這樣一個(gè)事實(shí),即兩件事之間必須有兩條路徑,并且除了常規路徑之外至少還有一條其他路徑。
  把這個(gè)結論應用到限定條件上,那么解決問(wèn)題的路徑至少有兩條:
  1:常規路徑:需求(自身)不變,(環(huán)境)極限擴大,極限適應需求;
  2:反向路徑:限制(環(huán)境)不變,壓縮(自己)需求,使需求適應限制;
  第二條反向路徑為解決問(wèn)題帶來(lái)了新的視角,為流程演化建立了新的理論基礎。
  原來(lái)的流程是:
  獲取鏈接—&gt;導出鏈接(限制出現1)—&gt;重新導入—&gt;評論抓取—&gt;導出評論(限制出現2)—&gt;本地過(guò)濾。
  第一個(gè)改進(jìn):重新定義需求,細化獲取環(huán)節:
  其實(shí)第二階段需要的不是任何文章,而是帶注釋的文章(沒(méi)有注釋就不用搶注釋了),在初始條件上加上細化條件提前過(guò)濾,一下子把鏈接數減少了三分之一。
  新流程:獲取精確鏈接—&gt;導出鏈接(限制1)的位置—&gt;重新導入—&gt;評論捕獲—&gt;導出評論(限制2)的位置—&gt;本地過(guò)濾。
  第二次改進(jìn):將新的認識應用到大局中,在第二階段增加細化條件;
  不是所有的評論都要被抓,而是收錄公眾號或微信賬號的評論。
  新流程:獲取精準鏈接—&gt;導出鏈接(限制1)的位置—&gt;重新導入—&gt;準確抓取評論—&gt;導出評論(限制2)的位置—&gt;本地過(guò)濾。
  第三次改進(jìn):合并和推進(jìn)流程
  我在中間去了一次洗手間,洗手間做得很好。在其中,我想到了兩個(gè)過(guò)程。為什么要把這兩個(gè)進(jìn)程分開(kāi)?
  這兩個(gè)階段是一個(gè)連續的過(guò)程,如果這些過(guò)程可以合并,第一階段的限制就會(huì )消失。
  這說(shuō)明除了適應約束之外,還可以選擇合理地調整流程以消除或跳過(guò)約束。
  將兩個(gè)流程合二為一后,新流程:獲取精準鏈接—&gt;準確抓取評論—&gt;導出評論(限制位置2)—&gt;本地過(guò)濾。
  由于重新定義了兩階段要求,最終出口數據中只剩下有意義的部分。
  這個(gè)改進(jìn)過(guò)程也讓我發(fā)現了一個(gè)優(yōu)化的關(guān)鍵點(diǎn):在設計過(guò)程時(shí),結合約束,用約束激發(fā)深度優(yōu)化。
  最終得到了我想要的數據,結果發(fā)現約束不是敵人,約束是持續創(chuàng )新的重要條件。
  這一發(fā)現也為創(chuàng )新開(kāi)辟了一種新的思維方式:自我強加的限制,沒(méi)有限制創(chuàng )造限制。就像這個(gè)文章,本來(lái)是不打算寫(xiě)的,但是我給自己設計了一個(gè)新的限制:把事情做完,從實(shí)踐到總結,就完成了。
  
  在過(guò)濾數據時(shí),我有點(diǎn)氣餒。評論數據是非結構化的,很難快速過(guò)濾此類(lèi)數據。這也讓我有了一個(gè)新的發(fā)現:數據的價(jià)值取決于結構的程度。結構化數據很少。既然如此,與其捕獲雜亂無(wú)章的數據,事后對其進(jìn)行結構化,不如在初始設計中建立結構化的數據捕獲過(guò)程。
  
  結束了嗎?確實(shí)是時(shí)候結束了,本來(lái)預定的數據已經(jīng)拿到了;
  但這并沒(méi)有結束,甚至真正的困難才剛剛開(kāi)始,所以這是一個(gè)意外。
  三:搶公眾號,重新整理全站內容;
  一邊抓著(zhù)上面的微信,一邊也隔出了一部分公眾號,很少。如果能得到更多的公眾號,或許可以做一個(gè)專(zhuān)門(mén)的頁(yè)面來(lái)提供一個(gè)服務(wù),也就是集成即服務(wù)。該方法的效果很差,需要更高效的采集方法;
  我想還有一個(gè)地方也會(huì )放公眾號,每個(gè)文章底部的作者介紹部分:
  
  如果能夠獲取大量數據,就可以形成公眾賬戶(hù)矩陣。據我所知,沒(méi)有這樣的信息庫,信息集中對用戶(hù)也很有價(jià)值;
  準備開(kāi)始抓取,遇到了第一個(gè)難點(diǎn):文章內容很多,如何定位要抓取的對象?
  定位要抓拍的物體有一個(gè)竅門(mén):分析物體的特征,尤其是獨特的特征,通過(guò)獨特的特征準確識別;比如這次要抓的對象是一個(gè)公眾號,而這三個(gè)詞在文章中也經(jīng)常出現,但是出現在文章中的時(shí)候一般不會(huì )跟a : 符號,僅在作者介紹時(shí)才收錄,這是關(guān)鍵特性。
  第一個(gè)改進(jìn):多角度觀(guān)察數據,增加要捕獲的數據類(lèi)型;
  這是一個(gè)非常偶然的想法。我想著(zhù)數據可能可以供官方參考,然后又想到了大家官方需要的數據格式。然后我想到了一個(gè)新的需求場(chǎng)景:如果提供給用戶(hù),用戶(hù)面對的是數據。數據應該如何使用?
  三個(gè)角色:我、用戶(hù)和人人官方。每個(gè)角色需要不同的數據并使用不同的方法。比如我只需要公眾號,用戶(hù)需要更多數據。用戶(hù)將希望執行一些過(guò)濾,以便他們可以找到適合您自己的公共帳戶(hù)。
  
  第二個(gè)改進(jìn):增加輔助判斷條件;
  在爬取中,我們遇到了一個(gè)問(wèn)題:如果沒(méi)有符合設定條件的數據,數據就會(huì )留空。這類(lèi)數據需要丟棄(否則會(huì )占用導出索引)。為了丟棄數據,必須對數據進(jìn)行處理。判斷,進(jìn)行判斷,數據不能為空;
  這里有一個(gè)矛盾或沖突:需要刪除空數據,但只能刪除非空數據;終于找到了一個(gè)辦法:給所有數據加上一個(gè)固定的前綴——delete,這樣無(wú)論數據是否為空,最終都不會(huì )為空;
  比如兩條數據:一條數據為空,需要刪除,加上前綴后,數據變?yōu)椋篸elete;數據B數據不為空,加前綴后數據變?yōu)閯h除+原創(chuàng )數據;要確定哪些數據只收錄刪除,您可以丟棄,因為只有空數據將只收錄添加的前綴。
  
  這種方法是excel中的一個(gè)技巧:當數據本身難以判斷時(shí),加一列輔助判斷,讓具有相同特征的選項轉化為易于識別的數據;如A/A/B/B/C/D,需要確定哪些重復項單獨列出。因為A/B不同,無(wú)法實(shí)現排序。這時(shí)候可以添加一個(gè)單獨的輔助判斷列,將重復項轉換為1,不重復項轉換為0,然后對新列進(jìn)行排序。
  在最后一頁(yè),我也使用了這個(gè)技巧,通過(guò)在未認證的前面加上前綴A,讓未認證的在排序的時(shí)候總是排成一行。
  第三項改進(jìn):增加精準判斷條件;
  由于我不是程序員,對程序了解不多,無(wú)法準確判斷代碼的含義,這就帶來(lái)了一個(gè)問(wèn)題:不知道代碼是否能完全達到目的,同時(shí)處理一些邊緣情況;
  在第一次數據捕獲后,我們發(fā)現了這樣一種情況:當數據中收錄-等符號時(shí),捕獲會(huì )被中斷。很多公眾號都收錄-符號,結果只抓到一半,比如lmh-china,只會(huì )抓lmh。
  這是一個(gè)超出我能力的改進(jìn),所以我準備手動(dòng)修改,但是接近1000個(gè)公眾號,效率太低,如果你能改進(jìn)爬取過(guò)程并修復這個(gè)問(wèn)題,那么你可以重新爬取再次使用正確的數據,我決定試一試。
  最終,我添加了結束條件(正則表達式),必須遇到,或者。會(huì )結束,遇到其他符號也不會(huì )結束。
  這并不意味著(zhù)我可以編寫(xiě)代碼。該工具提供了一個(gè)工具來(lái)幫助生成正則表達式。然后我在互聯(lián)網(wǎng)上搜索答案以找到可能的答案,并不斷嘗試成功。
  PS:寫(xiě)這篇文章的時(shí)候,又查了一遍資料,發(fā)現上次修改沒(méi)有生效,還是老流程。我必須確認未來(lái)的重要步驟,以確認我在做正確的事情。
  改進(jìn)之四:進(jìn)行下一步,從實(shí)際場(chǎng)景中觀(guān)察數據;
  抓數據的時(shí)候想,可能需要一個(gè)地方放數據,這樣方便查看,一張簡(jiǎn)單的表就夠了,還需要排序,這樣就可以根據自己的需要進(jìn)行排序了;
  找了幾個(gè)插件,最后選擇了一個(gè)簡(jiǎn)單的頁(yè)面,經(jīng)過(guò)測試,符合我的要求;
  
  這次提前操作數據讓我決定再次添加一個(gè)數據類(lèi)型,添加一個(gè)經(jīng)過(guò)認證的數據類(lèi)型。人人網(wǎng)網(wǎng)站擁有各類(lèi)認證。添加新的排序字段對用戶(hù)有好處,可以讓我排除官方用戶(hù),排除官方用戶(hù)意味著(zhù)排除非貢獻者的公共賬戶(hù)。
  這些官方發(fā)布的文章中的公眾號是官方轉載的來(lái)源,也很有價(jià)值;它們可以制成單獨的頁(yè)面。
  改進(jìn)之五:試用公共CDN地址查找bug;
  由于所有網(wǎng)頁(yè)都使用開(kāi)源程序,我可以將本地的css和js改成免費的CDN地址,速度更快,節省帶寬;國內外有一些服務(wù)為開(kāi)源程序提供免費CDN,如/,合理節省使用成本;
  
  在不斷測試的過(guò)程中,突然發(fā)現了一個(gè)致命的bug:排序錯誤,這個(gè)bug一下子讓我陷入了深淵。如果存在此錯誤,那么對用戶(hù)最有意義的功能將失?。?br />   
  我沒(méi)有修復錯誤的能力,但我想到了一些可能性。作為一個(gè)開(kāi)源程序,按理說(shuō)這樣明顯的排序bug肯定會(huì )被修復。頁(yè)面使用的版本比較舊。這是原因嗎?
  我去CDN找了最新版本,頁(yè)面直接崩潰了;回去找了個(gè)中間版本,bug修復了,原來(lái)是程序版本問(wèn)題。
  這個(gè)修訂過(guò)程教會(huì )了我一個(gè)反向精益思想:從后到前改進(jìn),提前驗證整個(gè)過(guò)程,如果可能的話(huà),把整個(gè)過(guò)程,特別是還沒(méi)有達到的過(guò)程,并努力做到在少量數據的支持下。實(shí)際場(chǎng)景模擬,去模擬場(chǎng)景看看,這個(gè)模擬有利于整個(gè)過(guò)程的改進(jìn),場(chǎng)景中的思維可以反饋到整個(gè)過(guò)程的改進(jìn)。
  改進(jìn)之六:增加公眾號查詢(xún);
  看了幾個(gè)公眾號,發(fā)現很多公眾號已經(jīng)不存在或者沒(méi)有更新。如果能提供一個(gè)新的篩選維度,讓用戶(hù)可以直接看到公眾號的更新,這個(gè)數據會(huì )更有價(jià)值;
  我知道搜狗搜索提供了微信搜外,我開(kāi)始嘗試爬取搜狗搜索,但是搜狗搜索的反爬蟲(chóng)規則太嚴格了。
  這個(gè)想法失敗了,但我可以提供一個(gè)折衷方案:點(diǎn)擊直接查詢(xún);
  檢查搜狗搜索的鏈接規則后,生成所有公眾號對應的查詢(xún)鏈接。
  
  最終頁(yè)面如下所示:
  
  您可以在頁(yè)面內搜索并按列排序。
  我將頁(yè)面上傳到服務(wù)器,頁(yè)面地址:open.skyfollowsnow.pro/special/woshipm-author/。
  您可以在此處查看本次抓取中使用的工具和知識:open.skyfollowsnow.pro/?thread-55.htm。
  第七項改進(jìn):統一修改位置;
  將文件上傳到服務(wù)器后,我犯了一個(gè)明顯的錯誤:在服務(wù)器中修改文檔,很多修改必須在本地,于是出現了一個(gè)新問(wèn)題:有些東西是在服務(wù)器上修改的,有些東西是在本地修改的,文件兩端不一致;
  雖小,但也是很實(shí)用的一課:統一修改位置,避免協(xié)作時(shí)起點(diǎn)不一致。
  其他:
  在本次爬取中,使用了兩種新的方法來(lái)解決兩個(gè)問(wèn)題:
  1:解決json數據中a標簽不被解析的問(wèn)題;
  作者ID和空格鏈接本來(lái)是兩列,但是我以為可以合并,但是一旦合并就會(huì )報錯,然后我以為我看到了一個(gè)用\符號隔開(kāi)的程序”,于是試了一下,確實(shí)如此。
  2:解決excel列過(guò)多時(shí)合并容易出錯的問(wèn)題;
  最后合并成需要的數據時(shí),需要合并的項很多,很容易發(fā)現順序不對。為了一次性看到所有列的選項,我使用了一個(gè)新工具:桌面紋理工具 Snipaste,這也是我之前見(jiàn)過(guò)的。程序使用的工具正好解決了這個(gè)問(wèn)題:
  
  
  平時(shí)看到新事物的時(shí)候要有點(diǎn)好奇,需要的時(shí)候可能會(huì )想到。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構環(huán)境?)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-01-12 04:14 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構環(huán)境?)
  萬(wàn)維網(wǎng)的大量信息、股票報價(jià)、電影評論、市場(chǎng)價(jià)格趨勢主題以及幾乎所有內容都可以通過(guò)單擊按鈕找到。在分析數據的過(guò)程中,發(fā)現很多SAS用戶(hù)對網(wǎng)絡(luò )很感興趣,但是你獲取這些數據的SAS環(huán)境呢?有很多方法,例如設計自己的網(wǎng)絡(luò )爬蟲(chóng)或利用 SAS %TMFILTER 文本挖掘的 SAS 數據步驟中的代碼。在本文中,我們將回顧網(wǎng)絡(luò )爬蟲(chóng)的一般架構。我們將討論將 網(wǎng)站 信息導入 SAS 的方法,并在內部查看來(lái)自名為 SAS Search 的實(shí)驗項目的實(shí)驗代碼管道。我們還將提供有關(guān)如何輕松自定義網(wǎng)絡(luò )爬蟲(chóng)以滿(mǎn)足個(gè)人需求以及如何將特定數據導入 SAS Miner 的建議。介紹:互聯(lián)網(wǎng)已成為有用的信息來(lái)源。通常是網(wǎng)絡(luò )上的數據,我們想在SAS內部使用,所以我們需要想辦法獲取這些數據。最好的方法是使用網(wǎng)絡(luò )爬蟲(chóng)。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。
  首先,了解網(wǎng)絡(luò )爬蟲(chóng)的工作原理很重要。在繼續之前,您應該熟悉數據步驟代碼、宏和 SAS 過(guò)程 PROC SQL。網(wǎng)絡(luò )爬蟲(chóng)概述:網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)程序,具有一個(gè)或多個(gè)起始地址作為“種子 URL”,它下載與這些 URL 關(guān)聯(lián)的網(wǎng)頁(yè),提取網(wǎng)頁(yè)中收錄的任何超鏈接,并以遞歸方式繼續這些超鏈接標識下載網(wǎng)頁(yè)。從概念上講,網(wǎng)絡(luò )爬蟲(chóng)很簡(jiǎn)單。網(wǎng)絡(luò )爬蟲(chóng)有四個(gè)職責: 1. 從候選者中選擇一個(gè) URL。2. 下載相關(guān)的 Web 3. 提取網(wǎng)頁(yè)中的 URL(超鏈接)。4. 補充了未遇到的URLs候選集方法1:WEB SAS數據步爬蟲(chóng)中的代碼首先創(chuàng )建了一個(gè)網(wǎng)站網(wǎng)絡(luò )爬蟲(chóng)將啟動(dòng)的URL列表。數據工作.links_to_crawl;長(cháng)度 url $256 inputurl 數據線(xiàn);運行 為確保我們不會(huì )多次抓取同一個(gè) URL,已使用該鏈接創(chuàng )建了數據抓取。當 web 數據集一開(kāi)始是空的,但是一個(gè) 網(wǎng)站 URL 將被添加到數據集爬蟲(chóng)完成對 網(wǎng)站 的爬取。數據work.links_crawled;網(wǎng)址長(cháng)度 256 美元;跑; 現在我們開(kāi)始爬行!此代碼需要我們的 work.links_to_crawl 數據集的第一個(gè) URL。
  在第一個(gè)觀(guān)察“_N_Formula 1”中,URL 被放入一個(gè)名為 next_url 的宏變量中,所有剩余的 URL 都被放回我們的種子 URL 數據集中,以使其在未來(lái)的迭代中可用。nexturl 關(guān)閉 %letnext_url datawork.links_to_crawl; 設置 work.links_to_crawl;callymput("next_url", url); 否則輸出;跑; 現在,從互聯(lián)網(wǎng)上下載網(wǎng)址。創(chuàng )建一個(gè)文件名 _nexturl。我們讓 SAS 知道這是一個(gè) URL,并且可以找到 AT&amp;next_url,這是我們的宏變量,其中收錄我們從 work.links_to_crawl 數據集中提取的 URL。filename_nexturl url "&amp;next_url" 創(chuàng )建一個(gè)對文件名的 URL 引用,它決定了放置我們下載文件的位置。創(chuàng )建另一個(gè)引用文件名的條目,稱(chēng)為 htmlfilm,并將從 url_file.html 采集的信息放在那里。
  查找更多 urls datawork._urls(keep=url); 長(cháng)度 url $256 filehtmlfile; infile _nexturl 長(cháng)度=len;輸入文本 $varying2000. len; 放文字;起始長(cháng)度(文本);使用正則表達式 網(wǎng)站 URL 來(lái)幫助搜索。文本字符串的正則表達式匹配方法,例如單詞、單詞或字符模式。SAS 已經(jīng)提供了許多強大的字符串功能。但是,正則表達式通常提供了一種更簡(jiǎn)潔的方式來(lái)處理和匹配文本。做;保留patternID; pattern '/href=”([^"]+)”/i';patternID prxparse(pattern);end 首先觀(guān)察到,創(chuàng )建 patternID 將使整個(gè)數據步驟保持運行。要查找的模式是:“/href= "([^"]+)"/i'"., 表示我們在尋找字符串 "HREF purpose" 表示使用不區分大小寫(xiě)的方法來(lái)匹配我們的正則表達式。
  PRXNEXT 有五個(gè)參數:我們要查找的正則表達式,開(kāi)始查找正則表達式的開(kāi)始位置,停止正則表達式的結束位置,字符串中一旦找到的位置,以及字符串的長(cháng)度,如果找到的位置將如果未找到字符串,則為 0。PRXNEXT 還更改了 start 參數,以便在找到最后一個(gè)匹配項后重新開(kāi)始搜索。調用 prxnext(patternID, start, stop, text, position, length); 代碼中的循環(huán),顯示在 網(wǎng)站 上的所有鏈接的文本。do while (position substr(text,position+6, length-7); output; call prxnext(patternID, start, stop, text, position, length); end; run; 如果代碼找到一個(gè) URL,它will 檢索在第一個(gè)引號之后開(kāi)始的 URL 的唯一部分。例如,如果代碼找到 href="",那么它應該保存。使用 substr 從 URL 的其余部分中刪除前 6 個(gè)字符和最后一個(gè)字符 work._urls 數據集的輸出?,F在,我們插入 URL 代碼只是為了跟蹤抓取到我們已經(jīng)擁有的名為 work.links_crawled 的數據集,并確保我們不再瀏覽那里。
  currentlink urls我們已經(jīng)爬取了datawork._old_link;網(wǎng)址“&amp;next_url”;運行;proc append base=work.links_crawled data=work._old_link force;跑; 確保: 1. 我們還沒(méi)有抓取它們,也就是說(shuō) URL 不在 work.links_crawled 中)。2.我們沒(méi)有排隊的url進(jìn)行爬?。磚rl不在work.links_to_crawl只添加url我們已經(jīng)爬過(guò)queuedup procsql noprint;創(chuàng )建表work._append selecturl from work._urls where url (selecturl from work.links_crawled) (selecturl from work .links_to_crawl); quit; 然后,我們添加尚未被爬取的 URL,尚未排隊 work.links_to_crawl addnew links procappend base=work.links_to_crawl data=work._append force; run; 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構環(huán)境?)
  萬(wàn)維網(wǎng)的大量信息、股票報價(jià)、電影評論、市場(chǎng)價(jià)格趨勢主題以及幾乎所有內容都可以通過(guò)單擊按鈕找到。在分析數據的過(guò)程中,發(fā)現很多SAS用戶(hù)對網(wǎng)絡(luò )很感興趣,但是你獲取這些數據的SAS環(huán)境呢?有很多方法,例如設計自己的網(wǎng)絡(luò )爬蟲(chóng)或利用 SAS %TMFILTER 文本挖掘的 SAS 數據步驟中的代碼。在本文中,我們將回顧網(wǎng)絡(luò )爬蟲(chóng)的一般架構。我們將討論將 網(wǎng)站 信息導入 SAS 的方法,并在內部查看來(lái)自名為 SAS Search 的實(shí)驗項目的實(shí)驗代碼管道。我們還將提供有關(guān)如何輕松自定義網(wǎng)絡(luò )爬蟲(chóng)以滿(mǎn)足個(gè)人需求以及如何將特定數據導入 SAS Miner 的建議。介紹:互聯(lián)網(wǎng)已成為有用的信息來(lái)源。通常是網(wǎng)絡(luò )上的數據,我們想在SAS內部使用,所以我們需要想辦法獲取這些數據。最好的方法是使用網(wǎng)絡(luò )爬蟲(chóng)。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。SAS 提供了幾種從 Web 爬取和提取信息的方法。您可以使用基本 SAS 數據步驟中的代碼,或 SAS Text Miner 的 %TMFILTER 宏。雖然目前不可用,但 SAS Search Pipeline 將是一個(gè)強大的網(wǎng)絡(luò )爬蟲(chóng)產(chǎn)品,并為網(wǎng)絡(luò )爬蟲(chóng)提供更多工具。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),因此根據您想要實(shí)現的抓取,最好對其進(jìn)行審查。
  首先,了解網(wǎng)絡(luò )爬蟲(chóng)的工作原理很重要。在繼續之前,您應該熟悉數據步驟代碼、宏和 SAS 過(guò)程 PROC SQL。網(wǎng)絡(luò )爬蟲(chóng)概述:網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)程序,具有一個(gè)或多個(gè)起始地址作為“種子 URL”,它下載與這些 URL 關(guān)聯(lián)的網(wǎng)頁(yè),提取網(wǎng)頁(yè)中收錄的任何超鏈接,并以遞歸方式繼續這些超鏈接標識下載網(wǎng)頁(yè)。從概念上講,網(wǎng)絡(luò )爬蟲(chóng)很簡(jiǎn)單。網(wǎng)絡(luò )爬蟲(chóng)有四個(gè)職責: 1. 從候選者中選擇一個(gè) URL。2. 下載相關(guān)的 Web 3. 提取網(wǎng)頁(yè)中的 URL(超鏈接)。4. 補充了未遇到的URLs候選集方法1:WEB SAS數據步爬蟲(chóng)中的代碼首先創(chuàng )建了一個(gè)網(wǎng)站網(wǎng)絡(luò )爬蟲(chóng)將啟動(dòng)的URL列表。數據工作.links_to_crawl;長(cháng)度 url $256 inputurl 數據線(xiàn);運行 為確保我們不會(huì )多次抓取同一個(gè) URL,已使用該鏈接創(chuàng )建了數據抓取。當 web 數據集一開(kāi)始是空的,但是一個(gè) 網(wǎng)站 URL 將被添加到數據集爬蟲(chóng)完成對 網(wǎng)站 的爬取。數據work.links_crawled;網(wǎng)址長(cháng)度 256 美元;跑; 現在我們開(kāi)始爬行!此代碼需要我們的 work.links_to_crawl 數據集的第一個(gè) URL。
  在第一個(gè)觀(guān)察“_N_Formula 1”中,URL 被放入一個(gè)名為 next_url 的宏變量中,所有剩余的 URL 都被放回我們的種子 URL 數據集中,以使其在未來(lái)的迭代中可用。nexturl 關(guān)閉 %letnext_url datawork.links_to_crawl; 設置 work.links_to_crawl;callymput("next_url", url); 否則輸出;跑; 現在,從互聯(lián)網(wǎng)上下載網(wǎng)址。創(chuàng )建一個(gè)文件名 _nexturl。我們讓 SAS 知道這是一個(gè) URL,并且可以找到 AT&amp;next_url,這是我們的宏變量,其中收錄我們從 work.links_to_crawl 數據集中提取的 URL。filename_nexturl url "&amp;next_url" 創(chuàng )建一個(gè)對文件名的 URL 引用,它決定了放置我們下載文件的位置。創(chuàng )建另一個(gè)引用文件名的條目,稱(chēng)為 htmlfilm,并將從 url_file.html 采集的信息放在那里。
  查找更多 urls datawork._urls(keep=url); 長(cháng)度 url $256 filehtmlfile; infile _nexturl 長(cháng)度=len;輸入文本 $varying2000. len; 放文字;起始長(cháng)度(文本);使用正則表達式 網(wǎng)站 URL 來(lái)幫助搜索。文本字符串的正則表達式匹配方法,例如單詞、單詞或字符模式。SAS 已經(jīng)提供了許多強大的字符串功能。但是,正則表達式通常提供了一種更簡(jiǎn)潔的方式來(lái)處理和匹配文本。做;保留patternID; pattern '/href=”([^"]+)”/i';patternID prxparse(pattern);end 首先觀(guān)察到,創(chuàng )建 patternID 將使整個(gè)數據步驟保持運行。要查找的模式是:“/href= "([^"]+)"/i'"., 表示我們在尋找字符串 "HREF purpose" 表示使用不區分大小寫(xiě)的方法來(lái)匹配我們的正則表達式。
  PRXNEXT 有五個(gè)參數:我們要查找的正則表達式,開(kāi)始查找正則表達式的開(kāi)始位置,停止正則表達式的結束位置,字符串中一旦找到的位置,以及字符串的長(cháng)度,如果找到的位置將如果未找到字符串,則為 0。PRXNEXT 還更改了 start 參數,以便在找到最后一個(gè)匹配項后重新開(kāi)始搜索。調用 prxnext(patternID, start, stop, text, position, length); 代碼中的循環(huán),顯示在 網(wǎng)站 上的所有鏈接的文本。do while (position substr(text,position+6, length-7); output; call prxnext(patternID, start, stop, text, position, length); end; run; 如果代碼找到一個(gè) URL,它will 檢索在第一個(gè)引號之后開(kāi)始的 URL 的唯一部分。例如,如果代碼找到 href="",那么它應該保存。使用 substr 從 URL 的其余部分中刪除前 6 個(gè)字符和最后一個(gè)字符 work._urls 數據集的輸出?,F在,我們插入 URL 代碼只是為了跟蹤抓取到我們已經(jīng)擁有的名為 work.links_crawled 的數據集,并確保我們不再瀏覽那里。
  currentlink urls我們已經(jīng)爬取了datawork._old_link;網(wǎng)址“&amp;next_url”;運行;proc append base=work.links_crawled data=work._old_link force;跑; 確保: 1. 我們還沒(méi)有抓取它們,也就是說(shuō) URL 不在 work.links_crawled 中)。2.我們沒(méi)有排隊的url進(jìn)行爬?。磚rl不在work.links_to_crawl只添加url我們已經(jīng)爬過(guò)queuedup procsql noprint;創(chuàng )建表work._append selecturl from work._urls where url (selecturl from work.links_crawled) (selecturl from work .links_to_crawl); quit; 然后,我們添加尚未被爬取的 URL,尚未排隊 work.links_to_crawl addnew links procappend base=work.links_to_crawl data=work._append force; run;

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(三種抓取網(wǎng)頁(yè)數據的方法-2.Beautiful)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 61 次瀏覽 ? 2022-01-10 16:06 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(三種抓取網(wǎng)頁(yè)數據的方法-2.Beautiful)
  下面我們將介紹三種抓取網(wǎng)頁(yè)數據的方法,首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  1. 正則表達式
  如果您是正則表達式的新手,或者需要一些提示,請查看正則表達式 HOWTO 以獲得完整的介紹。
  當我們使用正則表達式抓取國家/地區數據時(shí),我們首先嘗試匹配元素的內容,如下所示:
  >>> import re
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> re.findall(&#39;(.*?)&#39;, html)
[&#39;/places/static/images/flags/gb.png&#39;, &#39;244,820 square kilometres&#39;, &#39;62,348,447&#39;, &#39;GB&#39;, &#39;United Kingdom&#39;, &#39;London&#39;, &#39;EU&#39;, &#39;.uk&#39;, &#39;GBP&#39;, &#39;Pound&#39;, &#39;44&#39;, &#39;@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA&#39;, &#39;^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$&#39;, &#39;en-GB,cy-GB,gd&#39;, &#39;IE &#39;]
>>>
  從以上結果可以看出,標簽用于多個(gè)國家屬性。要隔離 area 屬性,我們只需選擇其中的第二個(gè)元素,如下所示:
  >>> re.findall(&#39;(.*?)&#39;, html)[1]
&#39;244,820 square kilometres&#39;
  雖然這個(gè)方案現在可用,但如果頁(yè)面發(fā)生變化,它很可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使正則表達式更加健壯,我們也可以添加它的父元素。由于元素具有 ID 屬性,因此它應該是唯一的。
  >>> re.findall(&#39;Area: (.*?)&#39;, html)
[&#39;244,820 square kilometres&#39;]
  這個(gè)迭代版本看起來(lái)好一點(diǎn),但是網(wǎng)頁(yè)更新還有很多其他的方式也會(huì )讓這個(gè)正則表達式不令人滿(mǎn)意。例如,將雙引號更改為單引號,在標簽之間添加額外的空格,或者更改 area_label 等。下面是一個(gè)嘗試支持這些可能性的改進(jìn)版本。
  >>> re.findall(&#39;.*?(.*?)&#39;,html)[&#39;244,820 square kilometres&#39;]
  雖然這個(gè)正則表達式更容易適應未來(lái)的變化,但它也存在構造困難、可讀性差的問(wèn)題。此外,還有一些細微的布局更改可能會(huì )使此正則表達式無(wú)法令人滿(mǎn)意,例如為標簽添加標題屬性。
  從這個(gè)例子可以看出,正則表達式為我們提供了一種抓取數據的捷徑,但是這種方法過(guò)于脆弱,在頁(yè)面更新后容易出現問(wèn)題。好在還有一些更好的解決方案,后面會(huì )介紹。
  2. 靚湯
  Beautiful Soup 是一個(gè)非常流行的 Python 模塊。該模塊可以解析網(wǎng)頁(yè)并提供方便的界面來(lái)定位內容。如果您還沒(méi)有安裝該模塊,可以使用以下命令安裝其最新版本(需要先安裝pip,請自行百度):
  pip install beautifulsoup4
  使用 Beautiful Soup 的第一步是將下載的 HTML 內容解析成一個(gè)湯文檔。由于大多數網(wǎng)頁(yè)不是格式良好的 HTML,Beautiful Soup 需要確定它們的實(shí)際格式。例如,在下面這個(gè)簡(jiǎn)單網(wǎng)頁(yè)的清單中,存在屬性值和未閉合標簽周?chē)鄙僖柕膯?wèn)題。
  
Area
Population
  如果 Population 列表項被解析為 Area 列表項的子項,而不是兩個(gè)并排的列表項,我們在抓取時(shí)會(huì )得到錯誤的結果。讓我們看看Beautiful Soup是如何處理它的。
  >>> from bs4 import BeautifulSoup
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, &#39;html.parser&#39;)
>>> fixed_html = soup.prettify()
>>> print fixed_html

Area

Population


  從上面的執行結果可以看出,Beautiful Soup 能夠正確解析缺失的引號并關(guān)閉標簽?,F在我們可以使用 find() 和 find_all() 方法來(lái)定位我們需要的元素。
  >>> ul = soup.find(&#39;ul&#39;, attrs={&#39;class&#39;:&#39;country&#39;})
>>> ul.find(&#39;li&#39;) # return just the first match
AreaPopulation
>>> ul.find_all(&#39;li&#39;) # return all matches
[AreaPopulation, Population]
  注意:由于不同版本的Python內置庫的容錯能力存在差異,處理結果可能與上述不同。詳情請參閱: 。想知道所有的方法和參數,可以參考 Beautiful Soup 的官方文檔
  以下是使用此方法提取樣本國家地區數據的完整代碼。
  >>> from bs4 import BeautifulSoup
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> # locate the area row
>>> tr = soup.find(attrs={&#39;id&#39;:&#39;places_area__row&#39;})
>>> # locate the area tag
>>> td = tr.find(attrs={&#39;class&#39;:&#39;w2p_fw&#39;})
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  此代碼雖然比正則表達式代碼更復雜,但更易于構建和理解。此外,布局中的一些小變化,例如額外的空白和制表符屬性,我們不再需要擔心它了。
  3. Lxml
  Lxml 是基于 XML 解析庫 libxml2 的 Python 包裝器。模塊用C語(yǔ)言編寫(xiě),解析速度比Beautiful Soup快,但安裝過(guò)程比較復雜。最新安裝說(shuō)明可以參考。**
  與 Beautiful Soup 一樣,使用 lxml 模塊的第一步是將可能無(wú)效的 HTML 解析為統一格式。以下是使用此模塊解析不完整 HTML 的示例:
  >>> import lxml.html
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> tree = lxml.html.fromstring(broken_html)
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html
Area
Population
  同樣,lxml 正確解析屬性周?chē)鄙俚囊柌㈥P(guān)閉標簽,但模塊不會(huì )添加和標簽。
  解析輸入后,是時(shí)候選擇元素了。此時(shí),lxml 有幾種不同的方法,例如 XPath 選擇器和 Beautiful Soup 之類(lèi)的 find() 方法。但是,我們將來(lái)會(huì )使用 CSS 選擇器,因為它更簡(jiǎn)潔,可以在解析動(dòng)態(tài)內容時(shí)重用。此外,一些有 jQuery 選擇器經(jīng)驗的讀者會(huì )更熟悉它。
  以下是使用 lxml 的 CSS 選擇器提取區域數據的示例代碼:
  >>> import urllib2
>>> import lxml.html
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect(&#39;tr#places_area__row > td.w2p_fw&#39;)[0] # *行代碼
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  *行代碼會(huì )先找到ID為places_area__row的表格行元素,然后選擇類(lèi)為w2p_fw的表格數據子標簽。
  CSS 選擇器表示用于選擇元素的模式。以下是一些常用選擇器的示例:
  選擇所有標簽: *
選擇 標簽: a
選擇所有 class="link" 的元素: .link
選擇 class="link" 的 標簽: a.link
選擇 id="home" 的 標簽: a#home
選擇父元素為 標簽的所有 子標簽: a > span
選擇 標簽內部的所有 標簽: a span
選擇 title 屬性為"Home"的所有 標簽: a[title=Home]
  W3C 在
  Lxml 已經(jīng)實(shí)現了大部分 CSS3 屬性,其不支持的功能可以在: .
  注意:lxml 的內部實(shí)現實(shí)際上將 CSS 選擇器轉換為等效的 XPath 選擇器。
  4. 性能比較
  在下面的代碼中,每個(gè)爬蟲(chóng)會(huì )執行1000次,每次執行都會(huì )檢查爬取結果是否正確,然后打印總時(shí)間。
  # -*- coding: utf-8 -*-
import csv
import time
import urllib2
import re
import timeit
from bs4 import BeautifulSoup
import lxml.html
FIELDS = (&#39;area&#39;, &#39;population&#39;, &#39;iso&#39;, &#39;country&#39;, &#39;capital&#39;, &#39;continent&#39;, &#39;tld&#39;, &#39;currency_code&#39;, &#39;currency_name&#39;, &#39;phone&#39;, &#39;postal_code_format&#39;, &#39;postal_code_regex&#39;, &#39;languages&#39;, &#39;neighbours&#39;)
def regex_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search(&#39;.*?(.*?)&#39;.format(field), html).groups()[0]
return results
def beautiful_soup_scraper(html):
soup = BeautifulSoup(html, &#39;html.parser&#39;)
results = {}
for field in FIELDS:
results[field] = soup.find(&#39;table&#39;).find(&#39;tr&#39;, id=&#39;places_{}__row&#39;.format(field)).find(&#39;td&#39;, class_=&#39;w2p_fw&#39;).text
return results
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect(&#39;table > tr#places_{}__row > td.w2p_fw&#39;.format(field))[0].text_content()
return results
def main():
times = {}
html = urllib2.urlopen(&#39;http://example.webscraping.com ... %2339;).read()
NUM_ITERATIONS = 1000 # number of times to test each scraper
for name, scraper in (&#39;Regular expressions&#39;, regex_scraper), (&#39;Beautiful Soup&#39;, beautiful_soup_scraper), (&#39;Lxml&#39;, lxml_scraper):
times[name] = []
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == regex_scraper:
# the regular expression module will cache results
# so need to purge this cache for meaningful timings
re.purge() # *行代碼
result = scraper(html)
# check scraped result is as expected
assert(result[&#39;area&#39;] == &#39;244,820 square kilometres&#39;)
times[name].append(time.time() - start)
# record end time of scrape and output the total
end = time.time()
print &#39;{}: {:.2f} seconds&#39;.format(name, end - start)
writer = csv.writer(open(&#39;times.csv&#39;, &#39;w&#39;))
header = sorted(times.keys())
writer.writerow(header)
for row in zip(*[times[scraper] for scraper in header]):
writer.writerow(row)
if __name__ == &#39;__main__&#39;:
main()
  請注意,我們在 *line 代碼中調用了 re.purge() 方法。默認情況下,正則表達式會(huì )緩存搜索結果,公平起見(jiàn),我們需要使用這種方法來(lái)清除緩存。
  這是在我的計算機上運行腳本的結果:
  
  由于硬件條件的不同,不同計算機的執行結果也會(huì )有一定的差異。但是,每種方法之間的相對差異應該具有可比性。從結果可以看出,Beautiful Soup 在爬取我們的示例網(wǎng)頁(yè)時(shí)比其他兩種方法慢 7 倍以上。事實(shí)上,這個(gè)結果是意料之中的,因為 lxml 和正則表達式模塊是用 C 編寫(xiě)的,而 Beautiful Soup 是用純 Python 編寫(xiě)的。一個(gè)有趣的事實(shí)是 lxml 的性能與正則表達式差不多。由于 lxml 必須在搜索元素之前將輸入解析為內部格式,因此會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)。當爬取同一個(gè)網(wǎng)頁(yè)的多個(gè)特征時(shí),這個(gè)初始解析的開(kāi)銷(xiāo)會(huì )減少,lxml會(huì )更有競爭力,所以lxml是一個(gè)強大的模塊。
  5. 總結
  三種網(wǎng)頁(yè)抓取方式的優(yōu)缺點(diǎn):
  抓取方式 性能 使用難度 安裝難度
  正則表達式
  快的
  困難
  簡(jiǎn)單(內置模塊)
  美麗的湯
  慢的
  簡(jiǎn)單的
  簡(jiǎn)單(純 Python)
  lxml
  快的
  簡(jiǎn)單的
  比較困難
  如果您的爬蟲(chóng)的瓶頸是下載頁(yè)面,而不是提取數據,那么使用較慢的方法(如 Beautiful Soup)不是問(wèn)題。正則表達式在一次性提取中非常有用,除了可以避免解析整個(gè)網(wǎng)頁(yè)的開(kāi)銷(xiāo),如果只需要抓取少量數據并想避免額外的依賴(lài),那么正則表達式可能更適合. 但是,總的來(lái)說(shuō),lxml 是抓取數據的最佳選擇,因為它不僅速度更快,功能更強大,而正則表達式和 Beautiful Soup 僅在某些場(chǎng)景下才有用。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(三種抓取網(wǎng)頁(yè)數據的方法-2.Beautiful)
  下面我們將介紹三種抓取網(wǎng)頁(yè)數據的方法,首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  1. 正則表達式
  如果您是正則表達式的新手,或者需要一些提示,請查看正則表達式 HOWTO 以獲得完整的介紹。
  當我們使用正則表達式抓取國家/地區數據時(shí),我們首先嘗試匹配元素的內容,如下所示:
  >>> import re
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> re.findall(&#39;(.*?)&#39;, html)
[&#39;/places/static/images/flags/gb.png&#39;, &#39;244,820 square kilometres&#39;, &#39;62,348,447&#39;, &#39;GB&#39;, &#39;United Kingdom&#39;, &#39;London&#39;, &#39;EU&#39;, &#39;.uk&#39;, &#39;GBP&#39;, &#39;Pound&#39;, &#39;44&#39;, &#39;@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA&#39;, &#39;^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$&#39;, &#39;en-GB,cy-GB,gd&#39;, &#39;IE &#39;]
>>>
  從以上結果可以看出,標簽用于多個(gè)國家屬性。要隔離 area 屬性,我們只需選擇其中的第二個(gè)元素,如下所示:
  >>> re.findall(&#39;(.*?)&#39;, html)[1]
&#39;244,820 square kilometres&#39;
  雖然這個(gè)方案現在可用,但如果頁(yè)面發(fā)生變化,它很可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使正則表達式更加健壯,我們也可以添加它的父元素。由于元素具有 ID 屬性,因此它應該是唯一的。
  >>> re.findall(&#39;Area: (.*?)&#39;, html)
[&#39;244,820 square kilometres&#39;]
  這個(gè)迭代版本看起來(lái)好一點(diǎn),但是網(wǎng)頁(yè)更新還有很多其他的方式也會(huì )讓這個(gè)正則表達式不令人滿(mǎn)意。例如,將雙引號更改為單引號,在標簽之間添加額外的空格,或者更改 area_label 等。下面是一個(gè)嘗試支持這些可能性的改進(jìn)版本。
  >>> re.findall(&#39;.*?(.*?)&#39;,html)[&#39;244,820 square kilometres&#39;]
  雖然這個(gè)正則表達式更容易適應未來(lái)的變化,但它也存在構造困難、可讀性差的問(wèn)題。此外,還有一些細微的布局更改可能會(huì )使此正則表達式無(wú)法令人滿(mǎn)意,例如為標簽添加標題屬性。
  從這個(gè)例子可以看出,正則表達式為我們提供了一種抓取數據的捷徑,但是這種方法過(guò)于脆弱,在頁(yè)面更新后容易出現問(wèn)題。好在還有一些更好的解決方案,后面會(huì )介紹。
  2. 靚湯
  Beautiful Soup 是一個(gè)非常流行的 Python 模塊。該模塊可以解析網(wǎng)頁(yè)并提供方便的界面來(lái)定位內容。如果您還沒(méi)有安裝該模塊,可以使用以下命令安裝其最新版本(需要先安裝pip,請自行百度):
  pip install beautifulsoup4
  使用 Beautiful Soup 的第一步是將下載的 HTML 內容解析成一個(gè)湯文檔。由于大多數網(wǎng)頁(yè)不是格式良好的 HTML,Beautiful Soup 需要確定它們的實(shí)際格式。例如,在下面這個(gè)簡(jiǎn)單網(wǎng)頁(yè)的清單中,存在屬性值和未閉合標簽周?chē)鄙僖柕膯?wèn)題。
  
Area
Population
  如果 Population 列表項被解析為 Area 列表項的子項,而不是兩個(gè)并排的列表項,我們在抓取時(shí)會(huì )得到錯誤的結果。讓我們看看Beautiful Soup是如何處理它的。
  >>> from bs4 import BeautifulSoup
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, &#39;html.parser&#39;)
>>> fixed_html = soup.prettify()
>>> print fixed_html

Area

Population


  從上面的執行結果可以看出,Beautiful Soup 能夠正確解析缺失的引號并關(guān)閉標簽?,F在我們可以使用 find() 和 find_all() 方法來(lái)定位我們需要的元素。
  >>> ul = soup.find(&#39;ul&#39;, attrs={&#39;class&#39;:&#39;country&#39;})
>>> ul.find(&#39;li&#39;) # return just the first match
AreaPopulation
>>> ul.find_all(&#39;li&#39;) # return all matches
[AreaPopulation, Population]
  注意:由于不同版本的Python內置庫的容錯能力存在差異,處理結果可能與上述不同。詳情請參閱: 。想知道所有的方法和參數,可以參考 Beautiful Soup 的官方文檔
  以下是使用此方法提取樣本國家地區數據的完整代碼。
  >>> from bs4 import BeautifulSoup
>>> import urllib2
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> # locate the area row
>>> tr = soup.find(attrs={&#39;id&#39;:&#39;places_area__row&#39;})
>>> # locate the area tag
>>> td = tr.find(attrs={&#39;class&#39;:&#39;w2p_fw&#39;})
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  此代碼雖然比正則表達式代碼更復雜,但更易于構建和理解。此外,布局中的一些小變化,例如額外的空白和制表符屬性,我們不再需要擔心它了。
  3. Lxml
  Lxml 是基于 XML 解析庫 libxml2 的 Python 包裝器。模塊用C語(yǔ)言編寫(xiě),解析速度比Beautiful Soup快,但安裝過(guò)程比較復雜。最新安裝說(shuō)明可以參考。**
  與 Beautiful Soup 一樣,使用 lxml 模塊的第一步是將可能無(wú)效的 HTML 解析為統一格式。以下是使用此模塊解析不完整 HTML 的示例:
  >>> import lxml.html
>>> broken_html = &#39;AreaPopulation&#39;
>>> # parse the HTML
>>> tree = lxml.html.fromstring(broken_html)
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html
Area
Population
  同樣,lxml 正確解析屬性周?chē)鄙俚囊柌㈥P(guān)閉標簽,但模塊不會(huì )添加和標簽。
  解析輸入后,是時(shí)候選擇元素了。此時(shí),lxml 有幾種不同的方法,例如 XPath 選擇器和 Beautiful Soup 之類(lèi)的 find() 方法。但是,我們將來(lái)會(huì )使用 CSS 選擇器,因為它更簡(jiǎn)潔,可以在解析動(dòng)態(tài)內容時(shí)重用。此外,一些有 jQuery 選擇器經(jīng)驗的讀者會(huì )更熟悉它。
  以下是使用 lxml 的 CSS 選擇器提取區域數據的示例代碼:
  >>> import urllib2
>>> import lxml.html
>>> url = &#39;http://example.webscraping.com ... 39%3B
>>> html = urllib2.urlopen(url).read()
>>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect(&#39;tr#places_area__row > td.w2p_fw&#39;)[0] # *行代碼
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  *行代碼會(huì )先找到ID為places_area__row的表格行元素,然后選擇類(lèi)為w2p_fw的表格數據子標簽。
  CSS 選擇器表示用于選擇元素的模式。以下是一些常用選擇器的示例:
  選擇所有標簽: *
選擇 標簽: a
選擇所有 class="link" 的元素: .link
選擇 class="link" 的 標簽: a.link
選擇 id="home" 的 標簽: a#home
選擇父元素為 標簽的所有 子標簽: a > span
選擇 標簽內部的所有 標簽: a span
選擇 title 屬性為"Home"的所有 標簽: a[title=Home]
  W3C 在
  Lxml 已經(jīng)實(shí)現了大部分 CSS3 屬性,其不支持的功能可以在: .
  注意:lxml 的內部實(shí)現實(shí)際上將 CSS 選擇器轉換為等效的 XPath 選擇器。
  4. 性能比較
  在下面的代碼中,每個(gè)爬蟲(chóng)會(huì )執行1000次,每次執行都會(huì )檢查爬取結果是否正確,然后打印總時(shí)間。
  # -*- coding: utf-8 -*-
import csv
import time
import urllib2
import re
import timeit
from bs4 import BeautifulSoup
import lxml.html
FIELDS = (&#39;area&#39;, &#39;population&#39;, &#39;iso&#39;, &#39;country&#39;, &#39;capital&#39;, &#39;continent&#39;, &#39;tld&#39;, &#39;currency_code&#39;, &#39;currency_name&#39;, &#39;phone&#39;, &#39;postal_code_format&#39;, &#39;postal_code_regex&#39;, &#39;languages&#39;, &#39;neighbours&#39;)
def regex_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search(&#39;.*?(.*?)&#39;.format(field), html).groups()[0]
return results
def beautiful_soup_scraper(html):
soup = BeautifulSoup(html, &#39;html.parser&#39;)
results = {}
for field in FIELDS:
results[field] = soup.find(&#39;table&#39;).find(&#39;tr&#39;, id=&#39;places_{}__row&#39;.format(field)).find(&#39;td&#39;, class_=&#39;w2p_fw&#39;).text
return results
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect(&#39;table > tr#places_{}__row > td.w2p_fw&#39;.format(field))[0].text_content()
return results
def main():
times = {}
html = urllib2.urlopen(&#39;http://example.webscraping.com ... %2339;).read()
NUM_ITERATIONS = 1000 # number of times to test each scraper
for name, scraper in (&#39;Regular expressions&#39;, regex_scraper), (&#39;Beautiful Soup&#39;, beautiful_soup_scraper), (&#39;Lxml&#39;, lxml_scraper):
times[name] = []
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == regex_scraper:
# the regular expression module will cache results
# so need to purge this cache for meaningful timings
re.purge() # *行代碼
result = scraper(html)
# check scraped result is as expected
assert(result[&#39;area&#39;] == &#39;244,820 square kilometres&#39;)
times[name].append(time.time() - start)
# record end time of scrape and output the total
end = time.time()
print &#39;{}: {:.2f} seconds&#39;.format(name, end - start)
writer = csv.writer(open(&#39;times.csv&#39;, &#39;w&#39;))
header = sorted(times.keys())
writer.writerow(header)
for row in zip(*[times[scraper] for scraper in header]):
writer.writerow(row)
if __name__ == &#39;__main__&#39;:
main()
  請注意,我們在 *line 代碼中調用了 re.purge() 方法。默認情況下,正則表達式會(huì )緩存搜索結果,公平起見(jiàn),我們需要使用這種方法來(lái)清除緩存。
  這是在我的計算機上運行腳本的結果:
  
  由于硬件條件的不同,不同計算機的執行結果也會(huì )有一定的差異。但是,每種方法之間的相對差異應該具有可比性。從結果可以看出,Beautiful Soup 在爬取我們的示例網(wǎng)頁(yè)時(shí)比其他兩種方法慢 7 倍以上。事實(shí)上,這個(gè)結果是意料之中的,因為 lxml 和正則表達式模塊是用 C 編寫(xiě)的,而 Beautiful Soup 是用純 Python 編寫(xiě)的。一個(gè)有趣的事實(shí)是 lxml 的性能與正則表達式差不多。由于 lxml 必須在搜索元素之前將輸入解析為內部格式,因此會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)。當爬取同一個(gè)網(wǎng)頁(yè)的多個(gè)特征時(shí),這個(gè)初始解析的開(kāi)銷(xiāo)會(huì )減少,lxml會(huì )更有競爭力,所以lxml是一個(gè)強大的模塊。
  5. 總結
  三種網(wǎng)頁(yè)抓取方式的優(yōu)缺點(diǎn):
  抓取方式 性能 使用難度 安裝難度
  正則表達式
  快的
  困難
  簡(jiǎn)單(內置模塊)
  美麗的湯
  慢的
  簡(jiǎn)單的
  簡(jiǎn)單(純 Python)
  lxml
  快的
  簡(jiǎn)單的
  比較困難
  如果您的爬蟲(chóng)的瓶頸是下載頁(yè)面,而不是提取數據,那么使用較慢的方法(如 Beautiful Soup)不是問(wèn)題。正則表達式在一次性提取中非常有用,除了可以避免解析整個(gè)網(wǎng)頁(yè)的開(kāi)銷(xiāo),如果只需要抓取少量數據并想避免額外的依賴(lài),那么正則表達式可能更適合. 但是,總的來(lái)說(shuō),lxml 是抓取數據的最佳選擇,因為它不僅速度更快,功能更強大,而正則表達式和 Beautiful Soup 僅在某些場(chǎng)景下才有用。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬取的人物畫(huà)像(數據的實(shí)時(shí)性)難點(diǎn)打賞禮物)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 64 次瀏覽 ? 2022-01-09 10:13 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬取的人物畫(huà)像(數據的實(shí)時(shí)性)難點(diǎn)打賞禮物)
  后臺抓取某直播平臺信息和普通網(wǎng)站直播平臺數據有熱門(mén)主播在線(xiàn)數,經(jīng)常,熱門(mén)直播的送禮情況(粉絲頭像) 送禮難度人像httpswss(實(shí)時(shí)數據),需要模擬匿名用戶(hù)的訪(fǎng)問(wèn)。一個(gè)直播的wss數據網(wǎng)站是一個(gè)大二進(jìn)制數據頭的js代碼。您需要先模擬匿名登錄才能獲取二進(jìn)制數據。然后分析網(wǎng)站的js代碼進(jìn)行分析。找到工具chrome developer tool,選擇f12 ws,你只能看到幀在移動(dòng)和我們兩個(gè)不認識的二進(jìn)制。Wireshark,遺憾的是,我報了很大的希望,但是通過(guò)websocket找不到,我馬上分析了一下。我想我不知道如何攔截它。稍后我會(huì )研究如何使用它??吹接腥苏f(shuō)直接搜索websocket就可以看到。. 但是通過(guò)websocket過(guò)濾器我真的找不到我想要的數據。除非通過(guò)ip.addr ip.src 等charles,意外發(fā)現。名副其實(shí),查爾斯。雖然一開(kāi)始不太好用,但總算搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具 一開(kāi)始不太好用,終于搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具 一開(kāi)始不太好用,終于搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具
  // Charles Proxy License
// 適用于Charles任意版本的注冊碼,誰(shuí)還會(huì )想要使用破解版呢。
// Charles 4.2目前是最新版,可用。
Registered Name: https://zhile.io
License Key: 48891cf209c6d32bf4
  安裝 ssl 證書(shū)支持
  help->SSL proxying->install charles root certificate
下面這篇文章說(shuō)的非常好
https://www.cnblogs.com/ceshij ... .html
  設置代理,和上面的文章一樣,但是我推薦使用*:443查看結果。在瀏覽器上訪(fǎng)問(wèn)你要訪(fǎng)問(wèn)的網(wǎng)站普通https網(wǎng)頁(yè)。您已經(jīng)可以看到背面的內容。同樣wss的爬取也出來(lái)了,只是具體的二進(jìn)制數據。還是需要你自己分析
  
  
  目前可以抓到數據,下一步就是對二進(jìn)制數據進(jìn)行分析解析,得到有價(jià)值的數據。
  原創(chuàng )文章,版權所有,禁止抄襲,違者必究?。?!請注明出處?。?!技術(shù)需求請聯(lián)系。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(爬取的人物畫(huà)像(數據的實(shí)時(shí)性)難點(diǎn)打賞禮物)
  后臺抓取某直播平臺信息和普通網(wǎng)站直播平臺數據有熱門(mén)主播在線(xiàn)數,經(jīng)常,熱門(mén)直播的送禮情況(粉絲頭像) 送禮難度人像httpswss(實(shí)時(shí)數據),需要模擬匿名用戶(hù)的訪(fǎng)問(wèn)。一個(gè)直播的wss數據網(wǎng)站是一個(gè)大二進(jìn)制數據頭的js代碼。您需要先模擬匿名登錄才能獲取二進(jìn)制數據。然后分析網(wǎng)站的js代碼進(jìn)行分析。找到工具chrome developer tool,選擇f12 ws,你只能看到幀在移動(dòng)和我們兩個(gè)不認識的二進(jìn)制。Wireshark,遺憾的是,我報了很大的希望,但是通過(guò)websocket找不到,我馬上分析了一下。我想我不知道如何攔截它。稍后我會(huì )研究如何使用它??吹接腥苏f(shuō)直接搜索websocket就可以看到。. 但是通過(guò)websocket過(guò)濾器我真的找不到我想要的數據。除非通過(guò)ip.addr ip.src 等charles,意外發(fā)現。名副其實(shí),查爾斯。雖然一開(kāi)始不太好用,但總算搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具 一開(kāi)始不太好用,終于搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具 一開(kāi)始不太好用,終于搞定了,下面詳細說(shuō)說(shuō)怎么用。首先激活charles工具
  // Charles Proxy License
// 適用于Charles任意版本的注冊碼,誰(shuí)還會(huì )想要使用破解版呢。
// Charles 4.2目前是最新版,可用。
Registered Name: https://zhile.io
License Key: 48891cf209c6d32bf4
  安裝 ssl 證書(shū)支持
  help->SSL proxying->install charles root certificate
下面這篇文章說(shuō)的非常好
https://www.cnblogs.com/ceshij ... .html
  設置代理,和上面的文章一樣,但是我推薦使用*:443查看結果。在瀏覽器上訪(fǎng)問(wèn)你要訪(fǎng)問(wèn)的網(wǎng)站普通https網(wǎng)頁(yè)。您已經(jīng)可以看到背面的內容。同樣wss的爬取也出來(lái)了,只是具體的二進(jìn)制數據。還是需要你自己分析
  
  
  目前可以抓到數據,下一步就是對二進(jìn)制數據進(jìn)行分析解析,得到有價(jià)值的數據。
  原創(chuàng )文章,版權所有,禁止抄襲,違者必究?。?!請注明出處?。?!技術(shù)需求請聯(lián)系。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(talkischeap,showmethecodeshowthe )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-01-09 10:10 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(talkischeap,showmethecodeshowthe
)
  談話(huà)很便宜,給我看代碼:
  #coding=utf-8
import sys
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
import json
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)
class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains=[""]
start_urls=["http://www.jjkjj.gov.cn/"]
def parse(self,response):
filename = response.url.split("/")[-2]
titles=[] titles.extend(response.selector.xpath(&#39;//div[@class ="Work_News_line"]/a/text()&#39;).extract())
open(filename,&#39;w&#39;).write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))
  我們來(lái)分析一下代碼:
  from scrapy.spider import BaseSpider
  這是基于單頁(yè)的爬取,所以使用BaseSpider,基于鏈接跳轉的爬蟲(chóng)可以看第二篇文章
   name = "dmoz"
allowed_domains=[""]
start_urls=["http://www.jjkjj.gov.cn/"]
  start_urls是主域名,
  所以 allowed_domain 設置為空
   def parse(self,response):
filename = response.url.split("/")[-2]
titles=[] titles.extend(response.selector.xpath(&#39;//div[@class ="Work_News_line"]/a/text()&#39;).extract())
  這個(gè)markdown編輯器的縮進(jìn)有問(wèn)題,titles.extend... 這行要和上一行保持一樣的縮進(jìn),否則會(huì )報錯
  Python 運行時(shí)錯誤,引發(fā) notImplementedError
  遇到此類(lèi)錯誤,檢查縮進(jìn),一般可以解決
  接下來(lái)看xpath表達式,
  具體含義是:找到class屬性為“Work_News_line”的div,以及它下面label的值
  extract()函數 返回一個(gè)unicode字符串,該字符串為XPath選擇器返回的數據
  xpath的使用有幾點(diǎn)需要注意
  上面第二篇文章中,xpath的使用方式是:
  sel=Selector(response) item=DoubanmoiveItem() item[&#39;name&#39;]=sel.xpath(&#39;//[@id="content"]/h1/span[1]/text()&#39;).extract()
  新版本的scrapy不建議這樣做
  
  所以我把它改成了上面的
  接下來(lái)是最頭疼的中文顯示問(wèn)題
  在shell中查看xpath查詢(xún)結果:
  
  一堆Unicode字符,其實(shí)這也算是捕獲成功了,但是基本不可用,還是需要轉成中文的。
  感覺(jué)scrapy,甚至python,在字符集上都不是很好,
  再看上面的代碼:
  titles=[] titles.extend(response.selector.xpath(&#39;//div[@class ="Work_News_line"]/a/text()&#39;).extract())
  這里聲明了一個(gè)列表。每次查詢(xún)到一個(gè)值,就將其放入列表中,然后列表需要轉換成字符串寫(xiě)入文件。
  python本身提供了str()方法可以將任意對象轉換成字符串,但是不支持中文,轉換后的字符串還是unicode編碼的。
  詳情見(jiàn)此貼:str字符串轉換
  一種解決方法是使用python自帶的json模塊
  open(filename,&#39;w&#39;).write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))
  沒(méi)關(guān)系
  我們將捕獲的數據寫(xiě)入文件,我們來(lái)看看結果:
   查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(talkischeap,showmethecodeshowthe
)
  談話(huà)很便宜,給我看代碼:
  #coding=utf-8
import sys
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
import json
reload(sys)
sys.setdefaultencoding(&#39;utf8&#39;)
class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains=[""]
start_urls=["http://www.jjkjj.gov.cn/"]
def parse(self,response):
filename = response.url.split("/")[-2]
titles=[] titles.extend(response.selector.xpath(&#39;//div[@class ="Work_News_line"]/a/text()&#39;).extract())
open(filename,&#39;w&#39;).write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))
  我們來(lái)分析一下代碼:
  from scrapy.spider import BaseSpider
  這是基于單頁(yè)的爬取,所以使用BaseSpider,基于鏈接跳轉的爬蟲(chóng)可以看第二篇文章
   name = "dmoz"
allowed_domains=[""]
start_urls=["http://www.jjkjj.gov.cn/"]
  start_urls是主域名,
  所以 allowed_domain 設置為空
   def parse(self,response):
filename = response.url.split("/")[-2]
titles=[] titles.extend(response.selector.xpath(&#39;//div[@class ="Work_News_line"]/a/text()&#39;).extract())
  這個(gè)markdown編輯器的縮進(jìn)有問(wèn)題,titles.extend... 這行要和上一行保持一樣的縮進(jìn),否則會(huì )報錯
  Python 運行時(shí)錯誤,引發(fā) notImplementedError
  遇到此類(lèi)錯誤,檢查縮進(jìn),一般可以解決
  接下來(lái)看xpath表達式,
  具體含義是:找到class屬性為“Work_News_line”的div,以及它下面label的值
  extract()函數 返回一個(gè)unicode字符串,該字符串為XPath選擇器返回的數據
  xpath的使用有幾點(diǎn)需要注意
  上面第二篇文章中,xpath的使用方式是:
  sel=Selector(response) item=DoubanmoiveItem() item[&#39;name&#39;]=sel.xpath(&#39;//[@id="content"]/h1/span[1]/text()&#39;).extract()
  新版本的scrapy不建議這樣做
  
  所以我把它改成了上面的
  接下來(lái)是最頭疼的中文顯示問(wèn)題
  在shell中查看xpath查詢(xún)結果:
  
  一堆Unicode字符,其實(shí)這也算是捕獲成功了,但是基本不可用,還是需要轉成中文的。
  感覺(jué)scrapy,甚至python,在字符集上都不是很好,
  再看上面的代碼:
  titles=[] titles.extend(response.selector.xpath(&#39;//div[@class ="Work_News_line"]/a/text()&#39;).extract())
  這里聲明了一個(gè)列表。每次查詢(xún)到一個(gè)值,就將其放入列表中,然后列表需要轉換成字符串寫(xiě)入文件。
  python本身提供了str()方法可以將任意對象轉換成字符串,但是不支持中文,轉換后的字符串還是unicode編碼的。
  詳情見(jiàn)此貼:str字符串轉換
  一種解決方法是使用python自帶的json模塊
  open(filename,&#39;w&#39;).write(json.dumps(titles, encoding="gb2312", ensure_ascii=False))
  沒(méi)關(guān)系
  我們將捕獲的數據寫(xiě)入文件,我們來(lái)看看結果:
  

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目1WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 66 次瀏覽 ? 2022-01-08 00:16 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目1WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目)
  WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目1 WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目文檔版本:1.0.0.1 作者:Dane IT Training Group C++教學(xué)研發(fā)部作者:Min Wei 定稿日期:11月,星期五20, 2015 WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目21. 項目概述 互聯(lián)網(wǎng)產(chǎn)品種類(lèi)繁多,以產(chǎn)品為導向,以營(yíng)銷(xiāo)為導向,以技術(shù)為導向,但掌握技術(shù)的互聯(lián)網(wǎng)產(chǎn)品占比較高。更小。搜索引擎是目前互聯(lián)網(wǎng)產(chǎn)品中技術(shù)最先進(jìn)的產(chǎn)品,如果不是唯一的,至少也是其中之一。經(jīng)過(guò)十多年的發(fā)展,搜索引擎已經(jīng)成為互聯(lián)網(wǎng)的重要門(mén)戶(hù)之一。Twitter聯(lián)合創(chuàng )始人埃文威廉姆斯提出“
  WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)訓練項目3這樣海量的數據如何獲取、存儲和計算?如何快速響應用戶(hù)查詢(xún)?如何讓搜索結果盡可能滿(mǎn)足用戶(hù)對信息的需求?這些都是搜索引擎設計者必須面對的技術(shù)挑戰。下圖展示了一個(gè)通用搜索引擎的基本結構。商業(yè)級搜索引擎通常由許多獨立的模塊組成。每個(gè)模塊只負責搜索引擎的部分功能,相互配合形成一個(gè)完整的搜索引擎:搜索引擎的信息源來(lái)自網(wǎng)頁(yè),整個(gè)“網(wǎng)絡(luò )爬蟲(chóng)”的信息“互聯(lián)網(wǎng)”在本地獲取,由于網(wǎng)頁(yè)上的大部分內容完全相同或幾乎重復,“網(wǎng)頁(yè)去重”模塊會(huì )檢測到并刪除重復的內容。之后,搜索引擎將解析網(wǎng)頁(yè),提取網(wǎng)頁(yè)的主要內容,以及指向該網(wǎng)頁(yè)中收錄的其他頁(yè)面的所謂超鏈接。為了加快用戶(hù)查詢(xún)的響應速度,通過(guò)“倒排索引”的高效查詢(xún)數據結構保存網(wǎng)頁(yè)內容,同時(shí)保存網(wǎng)頁(yè)之間的鏈接關(guān)系。之所以保存鏈接關(guān)系,是因為在網(wǎng)頁(yè)的相關(guān)性排名階段,這個(gè)關(guān)系是可用的。頁(yè)面的相對重要性可以通過(guò)“鏈接分析”來(lái)判斷,這對于為用戶(hù)提供準確的搜索結果非常有幫助。由于網(wǎng)頁(yè)數量眾多,搜索引擎不僅需要保存網(wǎng)頁(yè)的原創(chuàng )信息,還需要保存一些中間處理結果。使用單臺計算機或少量計算機顯然是不現實(shí)的。
  谷歌等商業(yè)搜索引擎提供商為此開(kāi)發(fā)了一套完整的云存儲和云計算平臺,利用數以萬(wàn)計的普通PCWEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)訓練項目4,構建了海量信息作為搜索的可靠存儲和計算架構引擎及其相關(guān)應用的基礎支持。優(yōu)秀的云存儲和云計算平臺已成為大型商業(yè)搜索引擎的核心競爭力。以上就是搜索引擎獲取和存儲海量網(wǎng)頁(yè)相關(guān)信息的方式。由于這些功能不需要實(shí)時(shí)計算,可以看作是搜索引擎的后端計算系統。搜索引擎的首要目標當然是為用戶(hù)提供準確、全面的搜索結果。因此,實(shí)時(shí)響應用戶(hù)查詢(xún)并提供準確結果構成了搜索引擎的前端計算系統。搜索引擎收到用戶(hù)的查詢(xún)請求后,首先需要對查詢(xún)詞進(jìn)行分析,并通過(guò)與用戶(hù)信息的結合,正確推斷出用戶(hù)的真實(shí)搜索意圖。之后,首先查看“緩存系統”維護的緩存。搜索引擎的緩存存儲了不同的搜索意圖及其對應的搜索結果。如果在緩存中找到滿(mǎn)足用戶(hù)需求的信息,則直接將搜索結果返回給用戶(hù)。這不僅節省了重復計算的資源消耗,同時(shí)也加快了整個(gè)搜索過(guò)程的響應速度。而如果緩存中沒(méi)有找到滿(mǎn)足用戶(hù)需求的信息,則需要使用“頁(yè)面排序”,根據用戶(hù)的搜索意圖實(shí)時(shí)計算哪些網(wǎng)頁(yè)滿(mǎn)足用戶(hù)需求,并將輸出排序為搜索結果。
  網(wǎng)頁(yè)排名最重要的兩個(gè)參考因素是“內容相似度”,即哪些網(wǎng)頁(yè)與用戶(hù)的搜索意圖密切相關(guān);另一個(gè)是網(wǎng)頁(yè)重要性,即哪些網(wǎng)頁(yè)質(zhì)量好或相對重要。這通??梢詮摹版溄臃治觥钡慕Y果中獲得。結合以上兩種考慮,前端系統將網(wǎng)頁(yè)進(jìn)行排序,作為搜索的最終結果。除了上述功能模塊外,搜索引擎的“反作弊”模塊近年來(lái)也越來(lái)越受到關(guān)注。搜索引擎作為網(wǎng)民上網(wǎng)的入口,對網(wǎng)絡(luò )流量的引導和分流至關(guān)重要,甚至可以說(shuō)起到了舉足輕重的作用。因此,各種“作弊” 方法逐漸流行起來(lái)。各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰已經(jīng)成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰已經(jīng)成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目1WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)實(shí)訓項目)
  WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目1 WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目文檔版本:1.0.0.1 作者:Dane IT Training Group C++教學(xué)研發(fā)部作者:Min Wei 定稿日期:11月,星期五20, 2015 WEBCRAWLER 網(wǎng)絡(luò )爬蟲(chóng)培訓項目21. 項目概述 互聯(lián)網(wǎng)產(chǎn)品種類(lèi)繁多,以產(chǎn)品為導向,以營(yíng)銷(xiāo)為導向,以技術(shù)為導向,但掌握技術(shù)的互聯(lián)網(wǎng)產(chǎn)品占比較高。更小。搜索引擎是目前互聯(lián)網(wǎng)產(chǎn)品中技術(shù)最先進(jìn)的產(chǎn)品,如果不是唯一的,至少也是其中之一。經(jīng)過(guò)十多年的發(fā)展,搜索引擎已經(jīng)成為互聯(lián)網(wǎng)的重要門(mén)戶(hù)之一。Twitter聯(lián)合創(chuàng )始人埃文威廉姆斯提出“
  WEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)訓練項目3這樣海量的數據如何獲取、存儲和計算?如何快速響應用戶(hù)查詢(xún)?如何讓搜索結果盡可能滿(mǎn)足用戶(hù)對信息的需求?這些都是搜索引擎設計者必須面對的技術(shù)挑戰。下圖展示了一個(gè)通用搜索引擎的基本結構。商業(yè)級搜索引擎通常由許多獨立的模塊組成。每個(gè)模塊只負責搜索引擎的部分功能,相互配合形成一個(gè)完整的搜索引擎:搜索引擎的信息源來(lái)自網(wǎng)頁(yè),整個(gè)“網(wǎng)絡(luò )爬蟲(chóng)”的信息“互聯(lián)網(wǎng)”在本地獲取,由于網(wǎng)頁(yè)上的大部分內容完全相同或幾乎重復,“網(wǎng)頁(yè)去重”模塊會(huì )檢測到并刪除重復的內容。之后,搜索引擎將解析網(wǎng)頁(yè),提取網(wǎng)頁(yè)的主要內容,以及指向該網(wǎng)頁(yè)中收錄的其他頁(yè)面的所謂超鏈接。為了加快用戶(hù)查詢(xún)的響應速度,通過(guò)“倒排索引”的高效查詢(xún)數據結構保存網(wǎng)頁(yè)內容,同時(shí)保存網(wǎng)頁(yè)之間的鏈接關(guān)系。之所以保存鏈接關(guān)系,是因為在網(wǎng)頁(yè)的相關(guān)性排名階段,這個(gè)關(guān)系是可用的。頁(yè)面的相對重要性可以通過(guò)“鏈接分析”來(lái)判斷,這對于為用戶(hù)提供準確的搜索結果非常有幫助。由于網(wǎng)頁(yè)數量眾多,搜索引擎不僅需要保存網(wǎng)頁(yè)的原創(chuàng )信息,還需要保存一些中間處理結果。使用單臺計算機或少量計算機顯然是不現實(shí)的。
  谷歌等商業(yè)搜索引擎提供商為此開(kāi)發(fā)了一套完整的云存儲和云計算平臺,利用數以萬(wàn)計的普通PCWEBCRAWLER網(wǎng)絡(luò )爬蟲(chóng)訓練項目4,構建了海量信息作為搜索的可靠存儲和計算架構引擎及其相關(guān)應用的基礎支持。優(yōu)秀的云存儲和云計算平臺已成為大型商業(yè)搜索引擎的核心競爭力。以上就是搜索引擎獲取和存儲海量網(wǎng)頁(yè)相關(guān)信息的方式。由于這些功能不需要實(shí)時(shí)計算,可以看作是搜索引擎的后端計算系統。搜索引擎的首要目標當然是為用戶(hù)提供準確、全面的搜索結果。因此,實(shí)時(shí)響應用戶(hù)查詢(xún)并提供準確結果構成了搜索引擎的前端計算系統。搜索引擎收到用戶(hù)的查詢(xún)請求后,首先需要對查詢(xún)詞進(jìn)行分析,并通過(guò)與用戶(hù)信息的結合,正確推斷出用戶(hù)的真實(shí)搜索意圖。之后,首先查看“緩存系統”維護的緩存。搜索引擎的緩存存儲了不同的搜索意圖及其對應的搜索結果。如果在緩存中找到滿(mǎn)足用戶(hù)需求的信息,則直接將搜索結果返回給用戶(hù)。這不僅節省了重復計算的資源消耗,同時(shí)也加快了整個(gè)搜索過(guò)程的響應速度。而如果緩存中沒(méi)有找到滿(mǎn)足用戶(hù)需求的信息,則需要使用“頁(yè)面排序”,根據用戶(hù)的搜索意圖實(shí)時(shí)計算哪些網(wǎng)頁(yè)滿(mǎn)足用戶(hù)需求,并將輸出排序為搜索結果。
  網(wǎng)頁(yè)排名最重要的兩個(gè)參考因素是“內容相似度”,即哪些網(wǎng)頁(yè)與用戶(hù)的搜索意圖密切相關(guān);另一個(gè)是網(wǎng)頁(yè)重要性,即哪些網(wǎng)頁(yè)質(zhì)量好或相對重要。這通??梢詮摹版溄臃治觥钡慕Y果中獲得。結合以上兩種考慮,前端系統將網(wǎng)頁(yè)進(jìn)行排序,作為搜索的最終結果。除了上述功能模塊外,搜索引擎的“反作弊”模塊近年來(lái)也越來(lái)越受到關(guān)注。搜索引擎作為網(wǎng)民上網(wǎng)的入口,對網(wǎng)絡(luò )流量的引導和分流至關(guān)重要,甚至可以說(shuō)起到了舉足輕重的作用。因此,各種“作弊” 方法逐漸流行起來(lái)。各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 各種方法被用來(lái)將網(wǎng)頁(yè)的搜索排名提升到與網(wǎng)頁(yè)質(zhì)量不相稱(chēng)的位置,這將嚴重影響用戶(hù)的搜索體驗。因此,如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰,成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰已經(jīng)成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián) 如何自動(dòng)發(fā)現作弊網(wǎng)頁(yè)并給予相應的懲罰已經(jīng)成為搜索引擎非常重要的功能之一。1.2. 網(wǎng)絡(luò )爬蟲(chóng)通用搜索引擎的處理對象是互聯(lián)網(wǎng)網(wǎng)頁(yè)。到目前為止,網(wǎng)頁(yè)數量已達數百萬(wàn),因此搜索引擎面臨的第一個(gè)問(wèn)題是如何設計一個(gè)高效的下載系統。將如此大量的網(wǎng)頁(yè)數據發(fā)送到本地,在本地形成互聯(lián)

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(具有一定的參考價(jià)值安裝mysql需要屏蔽掉相關(guān)代碼:抓取網(wǎng)頁(yè)數據格式)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 58 次瀏覽 ? 2022-01-07 19:14 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(具有一定的參考價(jià)值安裝mysql需要屏蔽掉相關(guān)代碼:抓取網(wǎng)頁(yè)數據格式)
  本文文章主要介紹python2.7,詳細實(shí)現爬蟲(chóng)網(wǎng)頁(yè)數據。有一定的參考價(jià)值,感興趣的朋友可以參考
  最近剛學(xué)了Python,做了一個(gè)簡(jiǎn)單的爬蟲(chóng)。作為一個(gè)簡(jiǎn)單的demo,希望對我這樣的初學(xué)者有所幫助。
  代碼使用python制作的爬蟲(chóng)2.7抓取51job上的職位名稱(chēng)、公司名稱(chēng)、工資、發(fā)布時(shí)間等。
  直接上代碼。代碼中的注釋相當清楚。如果沒(méi)有安裝mysql,需要屏蔽相關(guān)代碼:
   #!/usr/bin/python # -*- coding: UTF-8 -*- from bs4 import BeautifulSoup import urllib import urllib2 import codecs import re import time import logging import MySQLdb class Jobs(object): # 初始化 """docstring for Jobs""" def __init__(self): super(Jobs, self).__init__() logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') #數據庫的操作,沒(méi)有mysql可以做屏蔽 self.db = MySQLdb.connect('127.0.0.1','root','rootroot','MySQL_Test',charset='utf8') self.cursor = self.db.cursor() #log日志的顯示 self.logger = logging.getLogger("sjk") self.logger.setLevel(level=logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler = logging.FileHandler('log.txt') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) self.logger.addHandler(handler) self.logger.info('初始化完成') # 模擬請求數據 def jobshtml(self, key, page='1'): try: self.logger.info('開(kāi)始請求第' + page + '頁(yè)') #網(wǎng)頁(yè)url searchurl = "https://search.51job.com/list/040000,000000,0000,00,9,99,{key},2,{page}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=" user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0' #設置請求頭 header = {'User-Agent': user_agent, 'Host': 'search.51job.com', 'Referer': 'https://www.51job.com/'} #拼接url finalUrl = searchurl.format(key=key, page=page) request = urllib2.Request(finalUrl, headers=header) response = urllib2.urlopen(request) #等待網(wǎng)頁(yè)加載完成 time.sleep(3) #gbk格式解碼 info = response.read().decode('gbk') self.logger.info('請求網(wǎng)頁(yè)網(wǎng)頁(yè)') self.decodeHtml(info=info, key=key, page=page) except urllib2.HTTPError as e: print e.reason # 解析網(wǎng)頁(yè)數據 def decodeHtml(self, info, key, page): self.logger.info('開(kāi)始解析網(wǎng)頁(yè)數據') #BeautifulSoup 解析網(wǎng)頁(yè) soup = BeautifulSoup(info, 'html.parser') #找到class = t1 t2 t3 t4 t5 的標簽數據 ps = soup.find_all(attrs={"class": re.compile(r'^t[1-5].*')}) #打開(kāi)txt文件 a+ 代表追加 f = codecs.open(key + '.txt', 'a+', 'UTF-8') #清除之前的數據信息 f.truncate() f.write('\n------------' + page + '--------------\n') count = 1 arr = [] #做一些字符串的處理,形成數據格式 iOS開(kāi)發(fā)工程師 有限公司 深圳-南山區 0.9-1.6萬(wàn)/月 05-16 for pi in ps: spe = " " finalstr = pi.getText().strip() arr.append(finalstr) if count % 5 == 0: #每一條數據插入數據庫,如果沒(méi)有安裝mysql 可以將當前行注釋掉 self.connectMySQL(arr=arr) arr = [] spe = "\n" writestr = finalstr + spe count += 1 f.write(writestr) f.close() self.logger.info('解析完成') #數據庫操作 沒(méi)有安裝mysql 可以屏蔽掉 def connectMySQL(self,arr): work=arr[0] company=arr[1] place=arr[2] salary=arr[3] time=arr[4] query = "select * from Jobs_tab where \ company_name='%s' and work_name='%s' and work_place='%s' \ and salary='%s' and time='%s'" %(company,work,place,salary,time) self.cursor.execute(query) queryresult = self.cursor.fetchall() #數據庫中不存在就插入數據 存在就可以更新數據 不過(guò)我這邊沒(méi)有寫(xiě) if len(queryresult) > 0: sql = "insert into Jobs_tab(work_name,company_name,work_place,salary\ ,time) values('%s','%s','%s','%s','%s')" %(work,company,place,salary,time) try: self.cursor.execute(sql) self.db.commit() except Exception as e: self.logger.info('寫(xiě)入數據庫失敗') #模擬登陸 # def login(self): # data = {'action':'save','isread':'on','loginname':'18086514327','password':'kui4131sjk'} # 開(kāi)始抓取 主函數 def run(self, key): # 只要前5頁(yè)的數據 key代表搜索工做類(lèi)型 這邊我是用的ios page是頁(yè)數 for x in xrange(1, 6): self.jobshtml(key=key, page=str(x)) self.logger.info('寫(xiě)入數據庫完成') self.db.close() if __name__ == '__main__': Jobs().run(key='iOS')
  這種方式抓取的網(wǎng)頁(yè)數據格式如下:
  
  以上是python2.7實(shí)現抓取網(wǎng)頁(yè)數據的詳細內容。更多詳情請關(guān)注其他相關(guān)html中文網(wǎng)站文章! 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(具有一定的參考價(jià)值安裝mysql需要屏蔽掉相關(guān)代碼:抓取網(wǎng)頁(yè)數據格式)
  本文文章主要介紹python2.7,詳細實(shí)現爬蟲(chóng)網(wǎng)頁(yè)數據。有一定的參考價(jià)值,感興趣的朋友可以參考
  最近剛學(xué)了Python,做了一個(gè)簡(jiǎn)單的爬蟲(chóng)。作為一個(gè)簡(jiǎn)單的demo,希望對我這樣的初學(xué)者有所幫助。
  代碼使用python制作的爬蟲(chóng)2.7抓取51job上的職位名稱(chēng)、公司名稱(chēng)、工資、發(fā)布時(shí)間等。
  直接上代碼。代碼中的注釋相當清楚。如果沒(méi)有安裝mysql,需要屏蔽相關(guān)代碼:
   #!/usr/bin/python # -*- coding: UTF-8 -*- from bs4 import BeautifulSoup import urllib import urllib2 import codecs import re import time import logging import MySQLdb class Jobs(object): # 初始化 """docstring for Jobs""" def __init__(self): super(Jobs, self).__init__() logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s') #數據庫的操作,沒(méi)有mysql可以做屏蔽 self.db = MySQLdb.connect('127.0.0.1','root','rootroot','MySQL_Test',charset='utf8') self.cursor = self.db.cursor() #log日志的顯示 self.logger = logging.getLogger("sjk") self.logger.setLevel(level=logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') handler = logging.FileHandler('log.txt') handler.setFormatter(formatter) handler.setLevel(logging.DEBUG) self.logger.addHandler(handler) self.logger.info('初始化完成') # 模擬請求數據 def jobshtml(self, key, page='1'): try: self.logger.info('開(kāi)始請求第' + page + '頁(yè)') #網(wǎng)頁(yè)url searchurl = "https://search.51job.com/list/040000,000000,0000,00,9,99,{key},2,{page}.html?lang=c&stype=&postchannel=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare=" user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:59.0) Gecko/20100101 Firefox/59.0' #設置請求頭 header = {'User-Agent': user_agent, 'Host': 'search.51job.com', 'Referer': 'https://www.51job.com/'} #拼接url finalUrl = searchurl.format(key=key, page=page) request = urllib2.Request(finalUrl, headers=header) response = urllib2.urlopen(request) #等待網(wǎng)頁(yè)加載完成 time.sleep(3) #gbk格式解碼 info = response.read().decode('gbk') self.logger.info('請求網(wǎng)頁(yè)網(wǎng)頁(yè)') self.decodeHtml(info=info, key=key, page=page) except urllib2.HTTPError as e: print e.reason # 解析網(wǎng)頁(yè)數據 def decodeHtml(self, info, key, page): self.logger.info('開(kāi)始解析網(wǎng)頁(yè)數據') #BeautifulSoup 解析網(wǎng)頁(yè) soup = BeautifulSoup(info, 'html.parser') #找到class = t1 t2 t3 t4 t5 的標簽數據 ps = soup.find_all(attrs={"class": re.compile(r'^t[1-5].*')}) #打開(kāi)txt文件 a+ 代表追加 f = codecs.open(key + '.txt', 'a+', 'UTF-8') #清除之前的數據信息 f.truncate() f.write('\n------------' + page + '--------------\n') count = 1 arr = [] #做一些字符串的處理,形成數據格式 iOS開(kāi)發(fā)工程師 有限公司 深圳-南山區 0.9-1.6萬(wàn)/月 05-16 for pi in ps: spe = " " finalstr = pi.getText().strip() arr.append(finalstr) if count % 5 == 0: #每一條數據插入數據庫,如果沒(méi)有安裝mysql 可以將當前行注釋掉 self.connectMySQL(arr=arr) arr = [] spe = "\n" writestr = finalstr + spe count += 1 f.write(writestr) f.close() self.logger.info('解析完成') #數據庫操作 沒(méi)有安裝mysql 可以屏蔽掉 def connectMySQL(self,arr): work=arr[0] company=arr[1] place=arr[2] salary=arr[3] time=arr[4] query = "select * from Jobs_tab where \ company_name='%s' and work_name='%s' and work_place='%s' \ and salary='%s' and time='%s'" %(company,work,place,salary,time) self.cursor.execute(query) queryresult = self.cursor.fetchall() #數據庫中不存在就插入數據 存在就可以更新數據 不過(guò)我這邊沒(méi)有寫(xiě) if len(queryresult) > 0: sql = "insert into Jobs_tab(work_name,company_name,work_place,salary\ ,time) values('%s','%s','%s','%s','%s')" %(work,company,place,salary,time) try: self.cursor.execute(sql) self.db.commit() except Exception as e: self.logger.info('寫(xiě)入數據庫失敗') #模擬登陸 # def login(self): # data = {'action':'save','isread':'on','loginname':'18086514327','password':'kui4131sjk'} # 開(kāi)始抓取 主函數 def run(self, key): # 只要前5頁(yè)的數據 key代表搜索工做類(lèi)型 這邊我是用的ios page是頁(yè)數 for x in xrange(1, 6): self.jobshtml(key=key, page=str(x)) self.logger.info('寫(xiě)入數據庫完成') self.db.close() if __name__ == '__main__': Jobs().run(key='iOS')
  這種方式抓取的網(wǎng)頁(yè)數據格式如下:
  
  以上是python2.7實(shí)現抓取網(wǎng)頁(yè)數據的詳細內容。更多詳情請關(guān)注其他相關(guān)html中文網(wǎng)站文章!

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(待URL隊列中的URL以什么樣的順序排列算法的思想 )

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 67 次瀏覽 ? 2022-01-07 00:03 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(待URL隊列中的URL以什么樣的順序排列算法的思想
)
  遍歷策略是爬蟲(chóng)的核心問(wèn)題。在爬蟲(chóng)系統中,要爬取的URL隊列是一個(gè)非常重要的部分。URL隊列中要爬取的URL的順序也是一個(gè)很重要的問(wèn)題,因為它涉及到先爬取那個(gè)頁(yè)面,再爬到哪個(gè)頁(yè)面來(lái)確定這些URL的順序,這就是爬取策略爬蟲(chóng)。主要有以下幾種策略:
  1.深度優(yōu)先遍歷策略:
  深度優(yōu)先遍歷測試是指網(wǎng)絡(luò )爬蟲(chóng)會(huì )從起始頁(yè)開(kāi)始,逐個(gè)跟蹤每一個(gè)鏈接。處理完該行的鏈接后,會(huì )轉到下一個(gè)起始頁(yè),繼續跟蹤該鏈接。我們用下圖為例:
  走過(guò)的路徑是:AFG EHI BCD
  但是,我們在做爬蟲(chóng)的時(shí)候,深度優(yōu)先策略可能并不是所有情況都適用。如果深度優(yōu)先誤入無(wú)限分支(深度無(wú)限),則無(wú)法找到目標節點(diǎn)。
  二、廣度優(yōu)先遍歷策略:
  廣度優(yōu)先策略是根據樹(shù)的級別進(jìn)行搜索。如果在這一層沒(méi)有完成搜索,則不會(huì )進(jìn)入下一層搜索。即先完成一層搜索,再進(jìn)行下一層,也稱(chēng)為分層處理。我們也以上圖為例:
  遍歷路徑為:第一次遍歷:ABCDEF,第二次遍歷:GH,第三次遍歷:I
  然而,廣度優(yōu)先遍歷策略是一種盲目搜索。它沒(méi)有考慮結果的可能位置,會(huì )徹底搜索整個(gè)圖像,因此效率低。但是,如果您想覆蓋盡可能多的網(wǎng)頁(yè),廣度優(yōu)先搜索方法是更好的選擇。
  三、部分PageRank策略:
  PageRank算法的思想:對于下載的網(wǎng)頁(yè),連同要爬取的URL隊列的URL,組成一個(gè)網(wǎng)頁(yè)集,計算每個(gè)頁(yè)面的PageRank值(PageRank算法參考:PageRank算法-從原理到實(shí)現),計算完成后,根據頁(yè)面級別的值排列待爬取隊列中的URL,依次爬取URL頁(yè)面。
  如果每次都爬一個(gè)新的頁(yè)面,重新計算出來(lái)的PageRank值顯然效率太低了。折中是保存足夠的網(wǎng)頁(yè)來(lái)計算一次。
  下圖是web級策略的示意圖:
  為每下載 3 個(gè)網(wǎng)頁(yè)設置一個(gè)新的 PageRank 計算。此時(shí),本地已經(jīng)下載了3個(gè)網(wǎng)頁(yè){1,2,3}。這三個(gè)網(wǎng)頁(yè)中收錄的鏈接指向{4,5,6},即要爬取的URL隊列。如何確定下載順序?
  把這6個(gè)網(wǎng)頁(yè)組成一個(gè)新的集合,計算這個(gè)集合的PageRank值,這樣4、5、6就會(huì )得到各自對應的頁(yè)面排名值,從大到小排序,就可以得到假設的順序下載順序為5,4,6,當下載55頁(yè)時(shí),提取鏈接指向第8頁(yè),此時(shí)臨時(shí)分配PageRank值為8。如果該值大于 4 和 6 的 PageRank,則將首先下載第 8 頁(yè),依此類(lèi)推。循環(huán),即不完全頁(yè)面級策略的計算思想形成。
  四、OPIC策略策略(在線(xiàn)頁(yè)面重要性計算):
  基本思想:在算法開(kāi)始之前,給所有頁(yè)面相同的初始現金(cash)。下載一個(gè)頁(yè)面P后,將P的現金分配給所有從P解析出來(lái)的鏈接,并清空P的現金。所有要爬取的URL隊列中的頁(yè)面按照現金的數量進(jìn)行排序。
  與PageRank不同的是:PageRank每次都需要迭代計算,而OPIC策略不需要迭代過(guò)程,所以計算速度比PageRank快很多,適合實(shí)時(shí)計算。
  五、各大站優(yōu)先策略:
  策略:以網(wǎng)站為單位選擇網(wǎng)頁(yè)的重要性。對于URL隊列中待抓取的網(wǎng)頁(yè),根據自己的網(wǎng)站進(jìn)行分類(lèi)。如果哪個(gè)網(wǎng)站等待下載的頁(yè)面最多,先下載這些鏈接,本質(zhì)思路傾向于優(yōu)先下載大的網(wǎng)站。因為大 網(wǎng)站 往往收錄更多頁(yè)面。鑒于大型網(wǎng)站往往是知名公司的內容,而且他們的網(wǎng)頁(yè)一般都是高質(zhì)量的,這個(gè)想法很簡(jiǎn)單,但是有一定的依據。實(shí)驗表明,該算法的效果也應該略?xún)?yōu)于寬度優(yōu)先遍歷策略。
  花生代理動(dòng)態(tài)IP更改軟件可實(shí)現全國城市IP自動(dòng)切換,千萬(wàn)級動(dòng)態(tài)IP池,支持過(guò)濾,支持電腦手機多終端使用,數萬(wàn)條隨機撥號線(xiàn)路, 24小時(shí)不間斷提供動(dòng)態(tài)IP。
   查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(待URL隊列中的URL以什么樣的順序排列算法的思想
)
  遍歷策略是爬蟲(chóng)的核心問(wèn)題。在爬蟲(chóng)系統中,要爬取的URL隊列是一個(gè)非常重要的部分。URL隊列中要爬取的URL的順序也是一個(gè)很重要的問(wèn)題,因為它涉及到先爬取那個(gè)頁(yè)面,再爬到哪個(gè)頁(yè)面來(lái)確定這些URL的順序,這就是爬取策略爬蟲(chóng)。主要有以下幾種策略:
  1.深度優(yōu)先遍歷策略:
  深度優(yōu)先遍歷測試是指網(wǎng)絡(luò )爬蟲(chóng)會(huì )從起始頁(yè)開(kāi)始,逐個(gè)跟蹤每一個(gè)鏈接。處理完該行的鏈接后,會(huì )轉到下一個(gè)起始頁(yè),繼續跟蹤該鏈接。我們用下圖為例:
  走過(guò)的路徑是:AFG EHI BCD
  但是,我們在做爬蟲(chóng)的時(shí)候,深度優(yōu)先策略可能并不是所有情況都適用。如果深度優(yōu)先誤入無(wú)限分支(深度無(wú)限),則無(wú)法找到目標節點(diǎn)。
  二、廣度優(yōu)先遍歷策略:
  廣度優(yōu)先策略是根據樹(shù)的級別進(jìn)行搜索。如果在這一層沒(méi)有完成搜索,則不會(huì )進(jìn)入下一層搜索。即先完成一層搜索,再進(jìn)行下一層,也稱(chēng)為分層處理。我們也以上圖為例:
  遍歷路徑為:第一次遍歷:ABCDEF,第二次遍歷:GH,第三次遍歷:I
  然而,廣度優(yōu)先遍歷策略是一種盲目搜索。它沒(méi)有考慮結果的可能位置,會(huì )徹底搜索整個(gè)圖像,因此效率低。但是,如果您想覆蓋盡可能多的網(wǎng)頁(yè),廣度優(yōu)先搜索方法是更好的選擇。
  三、部分PageRank策略:
  PageRank算法的思想:對于下載的網(wǎng)頁(yè),連同要爬取的URL隊列的URL,組成一個(gè)網(wǎng)頁(yè)集,計算每個(gè)頁(yè)面的PageRank值(PageRank算法參考:PageRank算法-從原理到實(shí)現),計算完成后,根據頁(yè)面級別的值排列待爬取隊列中的URL,依次爬取URL頁(yè)面。
  如果每次都爬一個(gè)新的頁(yè)面,重新計算出來(lái)的PageRank值顯然效率太低了。折中是保存足夠的網(wǎng)頁(yè)來(lái)計算一次。
  下圖是web級策略的示意圖:
  為每下載 3 個(gè)網(wǎng)頁(yè)設置一個(gè)新的 PageRank 計算。此時(shí),本地已經(jīng)下載了3個(gè)網(wǎng)頁(yè){1,2,3}。這三個(gè)網(wǎng)頁(yè)中收錄的鏈接指向{4,5,6},即要爬取的URL隊列。如何確定下載順序?
  把這6個(gè)網(wǎng)頁(yè)組成一個(gè)新的集合,計算這個(gè)集合的PageRank值,這樣4、5、6就會(huì )得到各自對應的頁(yè)面排名值,從大到小排序,就可以得到假設的順序下載順序為5,4,6,當下載55頁(yè)時(shí),提取鏈接指向第8頁(yè),此時(shí)臨時(shí)分配PageRank值為8。如果該值大于 4 和 6 的 PageRank,則將首先下載第 8 頁(yè),依此類(lèi)推。循環(huán),即不完全頁(yè)面級策略的計算思想形成。
  四、OPIC策略策略(在線(xiàn)頁(yè)面重要性計算):
  基本思想:在算法開(kāi)始之前,給所有頁(yè)面相同的初始現金(cash)。下載一個(gè)頁(yè)面P后,將P的現金分配給所有從P解析出來(lái)的鏈接,并清空P的現金。所有要爬取的URL隊列中的頁(yè)面按照現金的數量進(jìn)行排序。
  與PageRank不同的是:PageRank每次都需要迭代計算,而OPIC策略不需要迭代過(guò)程,所以計算速度比PageRank快很多,適合實(shí)時(shí)計算。
  五、各大站優(yōu)先策略:
  策略:以網(wǎng)站為單位選擇網(wǎng)頁(yè)的重要性。對于URL隊列中待抓取的網(wǎng)頁(yè),根據自己的網(wǎng)站進(jìn)行分類(lèi)。如果哪個(gè)網(wǎng)站等待下載的頁(yè)面最多,先下載這些鏈接,本質(zhì)思路傾向于優(yōu)先下載大的網(wǎng)站。因為大 網(wǎng)站 往往收錄更多頁(yè)面。鑒于大型網(wǎng)站往往是知名公司的內容,而且他們的網(wǎng)頁(yè)一般都是高質(zhì)量的,這個(gè)想法很簡(jiǎn)單,但是有一定的依據。實(shí)驗表明,該算法的效果也應該略?xún)?yōu)于寬度優(yōu)先遍歷策略。
  花生代理動(dòng)態(tài)IP更改軟件可實(shí)現全國城市IP自動(dòng)切換,千萬(wàn)級動(dòng)態(tài)IP池,支持過(guò)濾,支持電腦手機多終端使用,數萬(wàn)條隨機撥號線(xiàn)路, 24小時(shí)不間斷提供動(dòng)態(tài)IP。
  

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 循環(huán)來(lái)實(shí)現所有網(wǎng)頁(yè)的爬取總結(圖))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 51 次瀏覽 ? 2022-01-06 17:16 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
循環(huán)來(lái)實(shí)現所有網(wǎng)頁(yè)的爬取總結(圖))
  public static List ParseLink(string html)
{
List res = new List();
var doc = new HtmlDocument();
doc.LoadHtml(html);
var linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
foreach (var linkNode in linkNodes)
{
string link = linkNode.GetAttributeValue("href", "");
if (link.StartsWith("/lishi/beijing/month"))
{
res.Add(link);
}
}
return res;
}
  到目前為止,我們已經(jīng)解析出網(wǎng)站上所有收錄過(guò)去時(shí)間段的鏈接。接下來(lái),我們需要分析每個(gè)鏈接對應的特定網(wǎng)頁(yè)的結構,從中獲取天氣信息。
  分析天氣網(wǎng)頁(yè)的結構
  上一個(gè)鏈接是站點(diǎn)鏈接。上一節分析了特定天氣網(wǎng)頁(yè)對應的鏈接集合,例如。
  
  現在我們需要從這個(gè)頁(yè)面分析天氣,就像解析站點(diǎn)結構中的目標鏈接一樣,在瀏覽器中觀(guān)察Html代碼,發(fā)現天氣的目標內容在一個(gè)表格中,所以我們只需要選擇節點(diǎn),因為一個(gè)節點(diǎn)代表某一天的天氣(天氣狀況、溫度和風(fēng)向)。
  
  public static void ParseDailyWeather(string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
var rows = doc.DocumentNode.SelectNodes("//tr");
StringBuilder sb = new StringBuilder();
rows.RemoveAt(0);
foreach (var row in rows)
{
var cols = row.SelectNodes("td");
foreach (var col in cols)
{
string temp = col.InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
sb.Append(temp + ",");
}
sb.Append("\r\n");
}
FileStream fs = new FileStream("output.csv", FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("gbk"));
sw.WriteLine(sb);
sw.Close();
fs.Close();
}
  最后,為了實(shí)現對網(wǎng)站的爬取,需要一個(gè)循環(huán)來(lái)實(shí)現對所有網(wǎng)頁(yè)的爬取
  public static void ParseWebsite(string url)
{
string html = Weather.GetHtml(url);
var links = Weather.ParseLink(html);
foreach (var link in links)
{
url = "http://www.tianqihoubao.com" + link;
html = Weather.GetHtml(url);
Weather.ParseDailyWeather(html);
}
}
  總結
  靜態(tài)網(wǎng)頁(yè)的爬取比較簡(jiǎn)單,可以分為以下幾個(gè)步驟 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
循環(huán)來(lái)實(shí)現所有網(wǎng)頁(yè)的爬取總結(圖))
  public static List ParseLink(string html)
{
List res = new List();
var doc = new HtmlDocument();
doc.LoadHtml(html);
var linkNodes = doc.DocumentNode.SelectNodes("//a[@href]");
foreach (var linkNode in linkNodes)
{
string link = linkNode.GetAttributeValue("href", "");
if (link.StartsWith("/lishi/beijing/month"))
{
res.Add(link);
}
}
return res;
}
  到目前為止,我們已經(jīng)解析出網(wǎng)站上所有收錄過(guò)去時(shí)間段的鏈接。接下來(lái),我們需要分析每個(gè)鏈接對應的特定網(wǎng)頁(yè)的結構,從中獲取天氣信息。
  分析天氣網(wǎng)頁(yè)的結構
  上一個(gè)鏈接是站點(diǎn)鏈接。上一節分析了特定天氣網(wǎng)頁(yè)對應的鏈接集合,例如。
  
  現在我們需要從這個(gè)頁(yè)面分析天氣,就像解析站點(diǎn)結構中的目標鏈接一樣,在瀏覽器中觀(guān)察Html代碼,發(fā)現天氣的目標內容在一個(gè)表格中,所以我們只需要選擇節點(diǎn),因為一個(gè)節點(diǎn)代表某一天的天氣(天氣狀況、溫度和風(fēng)向)。
  
  public static void ParseDailyWeather(string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
var rows = doc.DocumentNode.SelectNodes("//tr");
StringBuilder sb = new StringBuilder();
rows.RemoveAt(0);
foreach (var row in rows)
{
var cols = row.SelectNodes("td");
foreach (var col in cols)
{
string temp = col.InnerText.Replace("\r\n", "").Replace(" ", "").Trim();
sb.Append(temp + ",");
}
sb.Append("\r\n");
}
FileStream fs = new FileStream("output.csv", FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("gbk"));
sw.WriteLine(sb);
sw.Close();
fs.Close();
}
  最后,為了實(shí)現對網(wǎng)站的爬取,需要一個(gè)循環(huán)來(lái)實(shí)現對所有網(wǎng)頁(yè)的爬取
  public static void ParseWebsite(string url)
{
string html = Weather.GetHtml(url);
var links = Weather.ParseLink(html);
foreach (var link in links)
{
url = "http://www.tianqihoubao.com" + link;
html = Weather.GetHtml(url);
Weather.ParseDailyWeather(html);
}
}
  總結
  靜態(tài)網(wǎng)頁(yè)的爬取比較簡(jiǎn)單,可以分為以下幾個(gè)步驟

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下新建項目(Project)文件的作用和作用)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 62 次瀏覽 ? 2022-01-04 02:18 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下新建項目(Project)文件的作用和作用)
  網(wǎng)絡(luò )爬蟲(chóng)是在互聯(lián)網(wǎng)上爬取數據的程序,用它來(lái)爬取特定網(wǎng)頁(yè)的 HTML 數據。雖然我們使用一些庫來(lái)開(kāi)發(fā)爬蟲(chóng)程序,但是使用框架可以大大提高效率,縮短開(kāi)發(fā)時(shí)間。 Scrapy是用Python編寫(xiě)的,輕量級,簡(jiǎn)單輕便,使用起來(lái)非常方便。使用Scrapy可以很方便的完成在線(xiàn)數據采集的工作,它已經(jīng)為我們完成了很多工作,不需要花大力氣去開(kāi)發(fā)。
  首先,我們必須回答一個(gè)問(wèn)題。
  問(wèn):網(wǎng)站安裝到爬蟲(chóng)需要幾步?
  答案很簡(jiǎn)單,四步:
  新建項目(Project):新建一個(gè)爬蟲(chóng)項目
  清除目標(Items):清除你要爬取的目標
  制作蜘蛛:制作蜘蛛并開(kāi)始抓取網(wǎng)頁(yè)
  存儲內容(管道):設計管道來(lái)存儲抓取的內容
  好了,基本流程確定了,接下來(lái)就是一步步完成了。
  1.新建項目(Project)
  在空目錄下按住Shift鍵右鍵,選擇“在此處打開(kāi)命令窗口”,輸入命令:
  代碼如下:
  scrapy startproject 教程
  其中,tutorial 為項目名稱(chēng)。
  可以看到會(huì )創(chuàng )建一個(gè)tutorial文件夾,目錄結構如下:
  代碼如下:
  教程/
  scrapy.cfg
  教程/
  __init__.py
  items.py
  pipelines.py
  settings.py
  蜘蛛/
  __init__.py
  ...
  簡(jiǎn)單介紹一下各個(gè)文件的作用:
  scrapy.cfg:項目配置文件
  tutorial/:項目的Python模塊,代碼會(huì )從這里引用
  tutorial/items.py:項目的items文件
  tutorial/pipelines.py:項目的流水線(xiàn)文件
  tutorial/settings.py:項目設置文件
  tutorial/spiders/:蜘蛛存放的目錄
  2.明確目標(Item)
  在 Scrapy 中,items 是用于加載爬取內容的容器,有點(diǎn)像 Python 中的 Dic,它是一個(gè)字典,但提供了一些額外的保護以減少錯誤。
  一般來(lái)說(shuō)item可以用scrapy.item.Item類(lèi)創(chuàng )建,scrapy.item.Field對象用來(lái)定義屬性(可以理解為類(lèi)似于ORM的映射關(guān)系)。
  接下來(lái),我們開(kāi)始構建項目模型。
  首先,我們想要的是:
  姓名(姓名)
  鏈接(網(wǎng)址)
  說(shuō)明
  修改tutorial目錄下的items.py文件,在原來(lái)的類(lèi)之后添加我們自己的類(lèi)。
  因為我們要抓取網(wǎng)站的內容,所以可以命名為DmozItem:
  代碼如下:
  # 在此處定義已抓取項目的模型
  #
  # 查看文檔:
  #
  從scrapy.item導入項目,字段
  class TutorialItem(Item):
  # 在此處定義您的項目的字段,例如:
  # name = Field()
  通過(guò)
  類(lèi) DmozItem(Item):
  title = Field()
  link = Field()
  desc = Field()
  乍一看可能有點(diǎn)難以理解,但定義這些項目會(huì )讓您在使用其他組件時(shí)了解您的項目是什么。
  Item 可以簡(jiǎn)單理解為一個(gè)封裝的類(lèi)對象。
  3.制作蜘蛛(Spider)
  做一個(gè)爬蟲(chóng),一般有兩個(gè)步驟:先爬后取。
  也就是說(shuō),首先你需要獲取整個(gè)網(wǎng)頁(yè)的所有內容,然后取出對你有用的部分。
  3.1 次攀爬
  Spider 是用戶(hù)編寫(xiě)的一個(gè)類(lèi),用于從域(或域組)中獲取信息。
  它們定義了用于下載的 URL 列表、跟蹤鏈接的方案以及解析 Web 內容以提取項目的方法。
  要創(chuàng )建蜘蛛,您必須使用scrapy.spider.BaseSpider 創(chuàng )建一個(gè)子類(lèi)并確定三個(gè)必需屬性:
  name:爬蟲(chóng)的標識名,必須是唯一的。您必須在不同的爬蟲(chóng)中定義不同的名稱(chēng)。
  start_urls:抓取的 URL 列表。爬蟲(chóng)從這里開(kāi)始抓取數據,所以第一次下載數據會(huì )從這些url開(kāi)始。其他子 URL 將從這些起始 URL 繼承。
  parse():解析方法,調用時(shí)將每個(gè)URL返回的Response對象作為唯一參數傳入,負責解析匹配捕獲的數據(解析為item),跟蹤更多的URL。
<p>這里可以參考寬度爬蟲(chóng)教程中提到的思路幫助理解,教程傳輸:【Java】知乎下巴第五集:使用HttpClient工具包和寬度爬蟲(chóng)。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(一下新建項目(Project)文件的作用和作用)
  網(wǎng)絡(luò )爬蟲(chóng)是在互聯(lián)網(wǎng)上爬取數據的程序,用它來(lái)爬取特定網(wǎng)頁(yè)的 HTML 數據。雖然我們使用一些庫來(lái)開(kāi)發(fā)爬蟲(chóng)程序,但是使用框架可以大大提高效率,縮短開(kāi)發(fā)時(shí)間。 Scrapy是用Python編寫(xiě)的,輕量級,簡(jiǎn)單輕便,使用起來(lái)非常方便。使用Scrapy可以很方便的完成在線(xiàn)數據采集的工作,它已經(jīng)為我們完成了很多工作,不需要花大力氣去開(kāi)發(fā)。
  首先,我們必須回答一個(gè)問(wèn)題。
  問(wèn):網(wǎng)站安裝到爬蟲(chóng)需要幾步?
  答案很簡(jiǎn)單,四步:
  新建項目(Project):新建一個(gè)爬蟲(chóng)項目
  清除目標(Items):清除你要爬取的目標
  制作蜘蛛:制作蜘蛛并開(kāi)始抓取網(wǎng)頁(yè)
  存儲內容(管道):設計管道來(lái)存儲抓取的內容
  好了,基本流程確定了,接下來(lái)就是一步步完成了。
  1.新建項目(Project)
  在空目錄下按住Shift鍵右鍵,選擇“在此處打開(kāi)命令窗口”,輸入命令:
  代碼如下:
  scrapy startproject 教程
  其中,tutorial 為項目名稱(chēng)。
  可以看到會(huì )創(chuàng )建一個(gè)tutorial文件夾,目錄結構如下:
  代碼如下:
  教程/
  scrapy.cfg
  教程/
  __init__.py
  items.py
  pipelines.py
  settings.py
  蜘蛛/
  __init__.py
  ...
  簡(jiǎn)單介紹一下各個(gè)文件的作用:
  scrapy.cfg:項目配置文件
  tutorial/:項目的Python模塊,代碼會(huì )從這里引用
  tutorial/items.py:項目的items文件
  tutorial/pipelines.py:項目的流水線(xiàn)文件
  tutorial/settings.py:項目設置文件
  tutorial/spiders/:蜘蛛存放的目錄
  2.明確目標(Item)
  在 Scrapy 中,items 是用于加載爬取內容的容器,有點(diǎn)像 Python 中的 Dic,它是一個(gè)字典,但提供了一些額外的保護以減少錯誤。
  一般來(lái)說(shuō)item可以用scrapy.item.Item類(lèi)創(chuàng )建,scrapy.item.Field對象用來(lái)定義屬性(可以理解為類(lèi)似于ORM的映射關(guān)系)。
  接下來(lái),我們開(kāi)始構建項目模型。
  首先,我們想要的是:
  姓名(姓名)
  鏈接(網(wǎng)址)
  說(shuō)明
  修改tutorial目錄下的items.py文件,在原來(lái)的類(lèi)之后添加我們自己的類(lèi)。
  因為我們要抓取網(wǎng)站的內容,所以可以命名為DmozItem:
  代碼如下:
  # 在此處定義已抓取項目的模型
  #
  # 查看文檔:
  #
  從scrapy.item導入項目,字段
  class TutorialItem(Item):
  # 在此處定義您的項目的字段,例如:
  # name = Field()
  通過(guò)
  類(lèi) DmozItem(Item):
  title = Field()
  link = Field()
  desc = Field()
  乍一看可能有點(diǎn)難以理解,但定義這些項目會(huì )讓您在使用其他組件時(shí)了解您的項目是什么。
  Item 可以簡(jiǎn)單理解為一個(gè)封裝的類(lèi)對象。
  3.制作蜘蛛(Spider)
  做一個(gè)爬蟲(chóng),一般有兩個(gè)步驟:先爬后取。
  也就是說(shuō),首先你需要獲取整個(gè)網(wǎng)頁(yè)的所有內容,然后取出對你有用的部分。
  3.1 次攀爬
  Spider 是用戶(hù)編寫(xiě)的一個(gè)類(lèi),用于從域(或域組)中獲取信息。
  它們定義了用于下載的 URL 列表、跟蹤鏈接的方案以及解析 Web 內容以提取項目的方法。
  要創(chuàng )建蜘蛛,您必須使用scrapy.spider.BaseSpider 創(chuàng )建一個(gè)子類(lèi)并確定三個(gè)必需屬性:
  name:爬蟲(chóng)的標識名,必須是唯一的。您必須在不同的爬蟲(chóng)中定義不同的名稱(chēng)。
  start_urls:抓取的 URL 列表。爬蟲(chóng)從這里開(kāi)始抓取數據,所以第一次下載數據會(huì )從這些url開(kāi)始。其他子 URL 將從這些起始 URL 繼承。
  parse():解析方法,調用時(shí)將每個(gè)URL返回的Response對象作為唯一參數傳入,負責解析匹配捕獲的數據(解析為item),跟蹤更多的URL。
<p>這里可以參考寬度爬蟲(chóng)教程中提到的思路幫助理解,教程傳輸:【Java】知乎下巴第五集:使用HttpClient工具包和寬度爬蟲(chóng)。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(網(wǎng)絡(luò )爬蟲(chóng)提取出該網(wǎng)頁(yè)中的新一輪URL的抓取環(huán)路)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 53 次瀏覽 ? 2022-01-03 21:17 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(網(wǎng)絡(luò )爬蟲(chóng)提取出該網(wǎng)頁(yè)中的新一輪URL的抓取環(huán)路)
  一般我們要抓取一個(gè)網(wǎng)站的所有網(wǎng)址,先傳遞起始網(wǎng)址,然后通過(guò)網(wǎng)絡(luò )爬蟲(chóng)提取網(wǎng)頁(yè)中的所有網(wǎng)址鏈接,然后進(jìn)行每一個(gè)網(wǎng)址抓取的提取,在每個(gè)網(wǎng)頁(yè)中提取新一輪的 URL,依此類(lèi)推??傮w感覺(jué)是從上到下爬取網(wǎng)頁(yè)中的鏈接。理論上,您可以抓取整個(gè)網(wǎng)站上的所有鏈接。但問(wèn)題來(lái)了。 網(wǎng)站 中的網(wǎng)頁(yè)鏈接有循環(huán)。
  
  比如在網(wǎng)站的首頁(yè),我們可以看到首頁(yè)的鏈接,然后我們也可能在子頁(yè)面中看到首頁(yè)的鏈接,可能會(huì )有對應的子子-頁(yè)面。該鏈接指向主頁(yè)。按照我們之前的邏輯,抓取每個(gè)網(wǎng)頁(yè)中的所有鏈接,然后繼續抓取所有鏈接。以首頁(yè)為例。我們爬行的第一件事就是它。然后子頁(yè)面里面有一個(gè)到首頁(yè)的鏈接,子子頁(yè)面也有一個(gè)到首頁(yè)的鏈接。進(jìn)行這種爬取會(huì )導致網(wǎng)頁(yè)的重復爬取。其他的根本就沒(méi)有抓取網(wǎng)頁(yè)的機會(huì ),無(wú)法想象~~解決這個(gè)問(wèn)題不難。這時(shí)候就需要用到網(wǎng)絡(luò )爬蟲(chóng)中一個(gè)很重要的知識點(diǎn),就是網(wǎng)頁(yè)去重。
  
  先介紹一個(gè)簡(jiǎn)單的思路,也是一個(gè)常用的思路。我們將抓取到的網(wǎng)頁(yè)放到一個(gè)列表中。以首頁(yè)為例。抓取主頁(yè)后,將主頁(yè)放入列表中。那么當我們抓取子頁(yè)面的時(shí)候,如果再次觸摸首頁(yè),并且首頁(yè)已經(jīng)被抓取了。這時(shí)候可以跳過(guò)首頁(yè),繼續爬取其他網(wǎng)頁(yè),避免重復爬取首頁(yè)。這樣在爬取整個(gè)站點(diǎn)的時(shí)候就不會(huì )出現循環(huán)了。路。以這個(gè)思路為出發(fā)點(diǎn),將訪(fǎng)問(wèn)過(guò)的URL保存在數據庫中,當獲取到下一個(gè)URL時(shí),到數據庫中查看該URL是否被訪(fǎng)問(wèn)過(guò)。雖然數據庫有緩存,但是在數據庫中查詢(xún)每個(gè)URL時(shí),效率會(huì )下降的很快,所以這個(gè)策略用的不多,但是是最簡(jiǎn)單的方法。
  
  第二種方法是將訪(fǎng)問(wèn)過(guò)的URL保存在集合中。這種方式獲取URL的速度非???,基本不用查詢(xún)。但是這種方法有一個(gè)缺點(diǎn)。保存集合中的URL實(shí)際上是將其保存在內存中。當 URL 數據量較大(如 1 億)時(shí),內存壓力會(huì )增加。對于小型爬蟲(chóng),這種方法是非??扇〉?,但對于大型網(wǎng)絡(luò )爬蟲(chóng)來(lái)說(shuō),這種方法很難實(shí)現。
  
  第三種方式是對md5中的字符進(jìn)行編碼,md5編碼可以將字符縮減為固定長(cháng)度。一般來(lái)說(shuō),md5編碼的長(cháng)度在128bit左右,約等于16byte。在縮減之前,假設一個(gè)URL占用的內存大小為50字節,1字節等于2字節,相當于100字節??梢钥闯?,經(jīng)過(guò)md5編碼后,節省了大量的內存空間。通過(guò)md5,可以將任意長(cháng)度的URL壓縮成相同長(cháng)度的md5字符串,不會(huì )有重復,可以達到去重的效果。這樣,在很大程度上節省了內存。 scrapy框架采用的方法與md5方法有些類(lèi)似。因此,一般情況下,即使URL的量級達到億級,scrapy占用的內存也比set方法高。少很多。
  
  第四種方式是使用位圖方法進(jìn)一步壓縮字符。這種方法的意思是在計算機中申請8位,即8位,每一位用0或1表示,是計算機中的最小單位。如果8位組成一個(gè)字節,一位代表一個(gè)URL,為什么一位可以確定一個(gè)URL?因為我們可以對一個(gè) URL 執行哈希函數,然后將其映射到位。例如,假設我們有8個(gè)URL,對應8位,然后通過(guò)位上的0和1的狀態(tài),就可以表明這個(gè)URL是否存在,這種方法可以進(jìn)一步壓縮內存。
  
  但是位圖方法有一個(gè)非常大的缺點(diǎn),就是它的沖突會(huì )非常高,因為使用了同一個(gè)hash函數,很有可能將兩個(gè)不同的URL或者多個(gè)不同的URL映射到一個(gè)位置。其實(shí)這個(gè)hash方法也是set方法的一個(gè)實(shí)現原理。它對 URL 執行函數計算,然后將其映射到位的位置。因此,這種方法可以大大壓縮內存。簡(jiǎn)單計算一下,還是用1億個(gè)URL來(lái)計算,相當于1億比特。通過(guò)計算,相當于1250萬(wàn)字節。除以1024之后,大約是12207KB,也就是大約12MB的空間。在實(shí)際過(guò)程中,內存占用可能會(huì )大于12MB,但即便如此,與前三種方法相比,這種方法又大大減少了內存占用的空間。但同時(shí),與此方法沖突的可能性非常高,因此此方法不是很適用。那么有沒(méi)有辦法進(jìn)一步優(yōu)化位圖,這是一種重內存壓縮的方法,以減少沖突的可能性?答案是肯定的,是第五種方式。
  
  第五種方法是bloomfilter,改進(jìn)位圖。它可以通過(guò)多個(gè)散列函數減少沖突的可能性。這樣一來(lái),一方面不僅可以減少位圖方法的內存,另一方面,同時(shí)也起到了減少沖突的作用。關(guān)于bloomfilter的原理和實(shí)現,后期我一定會(huì )介紹給大家的。今天就讓大家有個(gè)簡(jiǎn)單的了解。 Bloomfilter適用于大型網(wǎng)絡(luò )爬蟲(chóng),尤其是數量級超大的時(shí)候。布隆過(guò)濾器方法可以事半功倍。也經(jīng)常與分布式爬蟲(chóng)配合,達到爬取的目的。
  
  我是來(lái)為大家介紹爬網(wǎng)過(guò)程中去重策略的五種方法的。如果你不明白,你應該知道它。在科普下,問(wèn)題不大。希望對朋友的學(xué)習有所幫助。 . 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(網(wǎng)絡(luò )爬蟲(chóng)提取出該網(wǎng)頁(yè)中的新一輪URL的抓取環(huán)路)
  一般我們要抓取一個(gè)網(wǎng)站的所有網(wǎng)址,先傳遞起始網(wǎng)址,然后通過(guò)網(wǎng)絡(luò )爬蟲(chóng)提取網(wǎng)頁(yè)中的所有網(wǎng)址鏈接,然后進(jìn)行每一個(gè)網(wǎng)址抓取的提取,在每個(gè)網(wǎng)頁(yè)中提取新一輪的 URL,依此類(lèi)推??傮w感覺(jué)是從上到下爬取網(wǎng)頁(yè)中的鏈接。理論上,您可以抓取整個(gè)網(wǎng)站上的所有鏈接。但問(wèn)題來(lái)了。 網(wǎng)站 中的網(wǎng)頁(yè)鏈接有循環(huán)。
  
  比如在網(wǎng)站的首頁(yè),我們可以看到首頁(yè)的鏈接,然后我們也可能在子頁(yè)面中看到首頁(yè)的鏈接,可能會(huì )有對應的子子-頁(yè)面。該鏈接指向主頁(yè)。按照我們之前的邏輯,抓取每個(gè)網(wǎng)頁(yè)中的所有鏈接,然后繼續抓取所有鏈接。以首頁(yè)為例。我們爬行的第一件事就是它。然后子頁(yè)面里面有一個(gè)到首頁(yè)的鏈接,子子頁(yè)面也有一個(gè)到首頁(yè)的鏈接。進(jìn)行這種爬取會(huì )導致網(wǎng)頁(yè)的重復爬取。其他的根本就沒(méi)有抓取網(wǎng)頁(yè)的機會(huì ),無(wú)法想象~~解決這個(gè)問(wèn)題不難。這時(shí)候就需要用到網(wǎng)絡(luò )爬蟲(chóng)中一個(gè)很重要的知識點(diǎn),就是網(wǎng)頁(yè)去重。
  
  先介紹一個(gè)簡(jiǎn)單的思路,也是一個(gè)常用的思路。我們將抓取到的網(wǎng)頁(yè)放到一個(gè)列表中。以首頁(yè)為例。抓取主頁(yè)后,將主頁(yè)放入列表中。那么當我們抓取子頁(yè)面的時(shí)候,如果再次觸摸首頁(yè),并且首頁(yè)已經(jīng)被抓取了。這時(shí)候可以跳過(guò)首頁(yè),繼續爬取其他網(wǎng)頁(yè),避免重復爬取首頁(yè)。這樣在爬取整個(gè)站點(diǎn)的時(shí)候就不會(huì )出現循環(huán)了。路。以這個(gè)思路為出發(fā)點(diǎn),將訪(fǎng)問(wèn)過(guò)的URL保存在數據庫中,當獲取到下一個(gè)URL時(shí),到數據庫中查看該URL是否被訪(fǎng)問(wèn)過(guò)。雖然數據庫有緩存,但是在數據庫中查詢(xún)每個(gè)URL時(shí),效率會(huì )下降的很快,所以這個(gè)策略用的不多,但是是最簡(jiǎn)單的方法。
  
  第二種方法是將訪(fǎng)問(wèn)過(guò)的URL保存在集合中。這種方式獲取URL的速度非???,基本不用查詢(xún)。但是這種方法有一個(gè)缺點(diǎn)。保存集合中的URL實(shí)際上是將其保存在內存中。當 URL 數據量較大(如 1 億)時(shí),內存壓力會(huì )增加。對于小型爬蟲(chóng),這種方法是非??扇〉?,但對于大型網(wǎng)絡(luò )爬蟲(chóng)來(lái)說(shuō),這種方法很難實(shí)現。
  
  第三種方式是對md5中的字符進(jìn)行編碼,md5編碼可以將字符縮減為固定長(cháng)度。一般來(lái)說(shuō),md5編碼的長(cháng)度在128bit左右,約等于16byte。在縮減之前,假設一個(gè)URL占用的內存大小為50字節,1字節等于2字節,相當于100字節??梢钥闯?,經(jīng)過(guò)md5編碼后,節省了大量的內存空間。通過(guò)md5,可以將任意長(cháng)度的URL壓縮成相同長(cháng)度的md5字符串,不會(huì )有重復,可以達到去重的效果。這樣,在很大程度上節省了內存。 scrapy框架采用的方法與md5方法有些類(lèi)似。因此,一般情況下,即使URL的量級達到億級,scrapy占用的內存也比set方法高。少很多。
  
  第四種方式是使用位圖方法進(jìn)一步壓縮字符。這種方法的意思是在計算機中申請8位,即8位,每一位用0或1表示,是計算機中的最小單位。如果8位組成一個(gè)字節,一位代表一個(gè)URL,為什么一位可以確定一個(gè)URL?因為我們可以對一個(gè) URL 執行哈希函數,然后將其映射到位。例如,假設我們有8個(gè)URL,對應8位,然后通過(guò)位上的0和1的狀態(tài),就可以表明這個(gè)URL是否存在,這種方法可以進(jìn)一步壓縮內存。
  
  但是位圖方法有一個(gè)非常大的缺點(diǎn),就是它的沖突會(huì )非常高,因為使用了同一個(gè)hash函數,很有可能將兩個(gè)不同的URL或者多個(gè)不同的URL映射到一個(gè)位置。其實(shí)這個(gè)hash方法也是set方法的一個(gè)實(shí)現原理。它對 URL 執行函數計算,然后將其映射到位的位置。因此,這種方法可以大大壓縮內存。簡(jiǎn)單計算一下,還是用1億個(gè)URL來(lái)計算,相當于1億比特。通過(guò)計算,相當于1250萬(wàn)字節。除以1024之后,大約是12207KB,也就是大約12MB的空間。在實(shí)際過(guò)程中,內存占用可能會(huì )大于12MB,但即便如此,與前三種方法相比,這種方法又大大減少了內存占用的空間。但同時(shí),與此方法沖突的可能性非常高,因此此方法不是很適用。那么有沒(méi)有辦法進(jìn)一步優(yōu)化位圖,這是一種重內存壓縮的方法,以減少沖突的可能性?答案是肯定的,是第五種方式。
  
  第五種方法是bloomfilter,改進(jìn)位圖。它可以通過(guò)多個(gè)散列函數減少沖突的可能性。這樣一來(lái),一方面不僅可以減少位圖方法的內存,另一方面,同時(shí)也起到了減少沖突的作用。關(guān)于bloomfilter的原理和實(shí)現,后期我一定會(huì )介紹給大家的。今天就讓大家有個(gè)簡(jiǎn)單的了解。 Bloomfilter適用于大型網(wǎng)絡(luò )爬蟲(chóng),尤其是數量級超大的時(shí)候。布隆過(guò)濾器方法可以事半功倍。也經(jīng)常與分布式爬蟲(chóng)配合,達到爬取的目的。
  
  我是來(lái)為大家介紹爬網(wǎng)過(guò)程中去重策略的五種方法的。如果你不明白,你應該知道它。在科普下,問(wèn)題不大。希望對朋友的學(xué)習有所幫助。 .

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(這請我吃一頓飯不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,不僅適合新手練習爬蟲(chóng))

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 70 次瀏覽 ? 2022-01-01 12:21 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(這請我吃一頓飯不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,不僅適合新手練習爬蟲(chóng))
  暑假已經(jīng)開(kāi)始很久了,但是還有很多朋友沒(méi)有找到暑期實(shí)習?前幾天,我朋友的弟弟想在暑假找一份實(shí)習來(lái)鍛煉自己,但面對網(wǎng)上成千上萬(wàn)的實(shí)習招聘信息,簡(jiǎn)直讓人望而生畏。然后我的朋友給我發(fā)了一條“幫助”信息。了解了大致情況后,我立即用爬蟲(chóng)爬取了實(shí)習網(wǎng)的信息,并貼出了數據結果。問(wèn)題在幾分鐘內得到解決。請我吃飯會(huì )不會(huì )過(guò)分?
  
  本爬蟲(chóng)實(shí)戰教程不僅適合新手練習爬蟲(chóng),也適合需要找實(shí)習信息的朋友!
  希望看完這篇文章后,能夠清楚的了解整個(gè)爬蟲(chóng)流程,能夠獨立完成。其次,可以通過(guò)自己的爬蟲(chóng)實(shí)戰獲取自己想要的信息。
  好了,話(huà)不多說(shuō),開(kāi)始吧!
  內容主要分為三部分:
  1、頁(yè)面分析
  2、爬蟲(chóng)步驟詳解
  一、目標頁(yè)面分析
  首先我們要知道我們的爬蟲(chóng)目標是什么?俗話(huà)說(shuō),知己知彼,百戰不殆。我們已經(jīng)知道我們要爬取的頁(yè)面是“實(shí)習網(wǎng)”,所以我們首先要去實(shí)習網(wǎng)看看里面有什么數據。
  實(shí)習網(wǎng)址:
  頁(yè)面如下:
  
  比如我們要找的職位是“品牌運營(yíng)”職位的數據。因此,直接在網(wǎng)頁(yè)的搜索框中輸入品牌操作即可。你會(huì )發(fā)現url變了!
  
  注意:我們要抓取的頁(yè)面是這個(gè)頁(yè)面:品牌運營(yíng)
  在我們的抓取頁(yè)面中,我們需要觀(guān)察有哪些數據,一個(gè)頁(yè)面中有幾條數據。這一點(diǎn)很重要,關(guān)系到后續的代碼編寫(xiě),可以幫助你檢查頁(yè)面上的信息是否全部被抓取。
  此時(shí)需要注意的是,我們所在的頁(yè)面是“一級頁(yè)面”。在瀏覽過(guò)程中,我們點(diǎn)擊任意一個(gè)帖子進(jìn)入,就會(huì )顯示“二級頁(yè)面”。這時(shí)候你也會(huì )發(fā)現url又變了。
  比如我們點(diǎn)擊一??個(gè)品牌運營(yíng)實(shí)習,二級頁(yè)面會(huì )自動(dòng)跳轉到這個(gè),并且會(huì )生成一個(gè)新的鏈接。如圖:
  
  應該在頁(yè)面上抓取哪些信息?
  我們在分析中發(fā)現,有的信息在一級頁(yè)面,有的在二級頁(yè)面。
  在一級頁(yè)面上我們可以得到什么樣的信息?如圖:
  
  一共有五個(gè)有效數據:職位、公司名稱(chēng)、學(xué)歷、薪水、地址
  在二級頁(yè)面中,我們來(lái)看看可以獲取哪些有效數據、字段和比例。如果你覺(jué)得階段很重要,也可以把它包括在爬蟲(chóng)的范圍內,不過(guò)我個(gè)人認為這不影響實(shí)習,畢竟不是找正式工作不會(huì )有很大影響。相反,招聘的實(shí)習生人數更為重要。新兵人數這里沒(méi)有顯示,無(wú)法在圖片上顯示,以后可以添加。
  
  這里,我們需要抓取一共7條數據,加上“人數”一共8條數據,就是我們爬蟲(chóng)最終的目標數據。
  抓取“靜態(tài)”網(wǎng)頁(yè)
  這里分析一下什么是靜態(tài)網(wǎng)頁(yè),什么是動(dòng)態(tài)網(wǎng)頁(yè)。對于靜態(tài)網(wǎng)頁(yè),隨著(zhù)html代碼的生成,頁(yè)面的內容和顯示效果基本不會(huì )發(fā)生變化——除非你修改頁(yè)面代碼。這不是動(dòng)態(tài)網(wǎng)頁(yè)的情況。雖然頁(yè)面代碼沒(méi)有改變,但顯示的內容會(huì )隨著(zhù)時(shí)間、環(huán)境或數據庫操作的結果而改變。
  它們的區別在于:靜態(tài)網(wǎng)頁(yè)中的數據是一勞永逸的,也就是說(shuō)一次性全部給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數據是隨著(zhù)頁(yè)面的逐步加載而逐漸呈現的,即靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù)無(wú)法獲取其中的所有數據。
  值得強調的是,不要將動(dòng)態(tài)網(wǎng)頁(yè)與動(dòng)態(tài)頁(yè)面內容混淆。這里所說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)動(dòng)態(tài)效果無(wú)關(guān)。動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文本內容,也可以收錄各種動(dòng)畫(huà)內容。這些只是網(wǎng)頁(yè)的細節。內容的呈現形式,無(wú)論網(wǎng)頁(yè)是否有動(dòng)態(tài)效果,只要是使用動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè),都可以稱(chēng)為動(dòng)態(tài)網(wǎng)頁(yè)。
  點(diǎn)擊“鼠標右鍵”,點(diǎn)擊“查看網(wǎng)頁(yè)源代碼”,最終效果如圖(部分截圖):
  
  這是最終反饋給你的數據。如果你發(fā)現你想要的所有數據都在里面,你可以說(shuō)它是一個(gè)靜態(tài)頁(yè)面。如果不是,則將其視為“動(dòng)態(tài)頁(yè)面”。
  今天的案例是一個(gè)靜態(tài)網(wǎng)頁(yè)。
  大家都知道,在編寫(xiě)代碼之前,我們首先要知道我們將使用哪些方法、庫和模塊來(lái)幫助您解析數據。常用的解析數據的方法有:re正則表達式、xpath、beatifulsoup、pyquery等
  我們需要使用的是xpath分析方法來(lái)分析定位數據。
  二、爬蟲(chóng)代碼說(shuō)明1、導入相關(guān)庫
  爬蟲(chóng)的第一步是考慮在爬蟲(chóng)過(guò)程中需要哪些庫。你要知道python是一種依賴(lài)很多庫的語(yǔ)言。沒(méi)有庫的 Python 是不完整的。
  import pandas as pd # 用于數據存儲
import requests # 用于請求網(wǎng)頁(yè)
import chardet # 用于修改編碼
import re # 用于提取數據
from lxml import etree # 解析數據的庫
import time # 可以粗糙模擬人為請求網(wǎng)頁(yè)的速度
import warnings # 忽略代碼運行時(shí)候的警告信息
warnings.filterwarnings("ignore")
  2、請求一級頁(yè)面源碼
  url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text)
  這里要注意兩個(gè)地方①②。 ①處有兩個(gè)參數,一個(gè)是headers,一個(gè)是verify。其中,headers是一種反亂碼措施,使瀏覽器認為爬蟲(chóng)不是爬蟲(chóng),而是人們在正常使用瀏覽器請求網(wǎng)頁(yè)。驗證是忽略安全證書(shū)提示。某些網(wǎng)頁(yè)將被視為不安全并會(huì )提示您。記住這個(gè)參數就行了。
  在②處,我們已經(jīng)獲得了網(wǎng)頁(yè)的源代碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和您電腦的解析方式,可能會(huì )出現不一致的情況,返回結果會(huì )造成亂碼。此時(shí)需要修改編碼方式,chardet庫可以幫你自動(dòng)檢測網(wǎng)頁(yè)源代碼的編碼方式。 (一個(gè)非常有用的檢測文檔編碼的三方庫chardet)
  3、解析一級頁(yè)面網(wǎng)頁(yè)中的信息
  # 1. 公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)
# 4. 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)
# 5. 薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
  4、獲取二級頁(yè)面的鏈接
  deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
  這時(shí)候可以看到我直接用xpath對一級頁(yè)面中的數據分析進(jìn)行了分析。代碼最后可以看到:我們已經(jīng)獲取到了二級頁(yè)面的鏈接,為我們后續抓取二級頁(yè)面的信息做準備。
  分析二級頁(yè)面網(wǎng)頁(yè)中的信息
  需求列表 = []
  area_list = []
  scale_list = []
  對于 deep_url_list 中的 deep_url:
  rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人數
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)
# 7. 公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# 8. 公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
  需要注意的是,二級頁(yè)面也是一個(gè)頁(yè)面,爬取其中的數據時(shí)需要請求該頁(yè)面。因此,①②③處的代碼完全相同。
  5、翻頁(yè)操作
  隨意復制幾個(gè)不同頁(yè)面的URL,觀(guān)察差異。這里可以看到page參數后面的數字不同,是第一頁(yè),數字就是數字。
  x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,21)]
  由于我們抓取了 20 頁(yè)數據,這里構造了 20 個(gè) URL,它們都存在于 url_list 列表中。
  現在讓我們看一下整個(gè)代碼。不再用文字描述,直接在代碼中寫(xiě)注釋。
  import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 請求獲取一級頁(yè)面的源代碼
url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)

# 獲取一級頁(yè)面中的信息:一共有5個(gè)信息。
# ①公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]

#③地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)

# ④ 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)


# ⑤薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
# ⑥獲取二級頁(yè)面的內容
deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]

demand_list = []
area_list = []
scale_list = []
# 獲取二級頁(yè)面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)

#① 需要幾人
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)

# ②公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# ③公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)

demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)

# ④ 將每個(gè)頁(yè)面獲取到的所有數據,存儲到DataFrame中。
data = pd.DataFrame({&#39;公司名&#39;:company_list,&#39;崗位名&#39;:job_list,&#39;地址&#39;:address_list,"學(xué)歷":degree_list,
&#39;薪資&#39;:salary_list,&#39;崗位需求量&#39;:demand_list,&#39;公司領(lǐng)域&#39;:area_list,&#39;公司規模&#39;:scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=[&#39;公司名&#39;,&#39;崗位名&#39;,&#39;地址&#39;,"學(xué)歷",&#39;薪資&#39;,&#39;崗位需求量&#39;,&#39;公司領(lǐng)域&#39;,&#39;公司規模&#39;])
# 這里進(jìn)行“翻頁(yè)”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存數據
res.to_csv(&#39;aliang.csv&#39;,encoding=&#39;utf_8_sig&#39;)
  有了這樣的一套,爬蟲(chóng)的思路會(huì )不會(huì )瞬間清晰?眼睛:我會(huì )的!手:我還是不會(huì )。多練。初學(xué)者不要急于求成,項目不多,但要精髓。吃一個(gè)比看十個(gè)更有效。
  來(lái)自: 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(這請我吃一頓飯不過(guò)分吧?這篇爬蟲(chóng)實(shí)戰教程,不僅適合新手練習爬蟲(chóng))
  暑假已經(jīng)開(kāi)始很久了,但是還有很多朋友沒(méi)有找到暑期實(shí)習?前幾天,我朋友的弟弟想在暑假找一份實(shí)習來(lái)鍛煉自己,但面對網(wǎng)上成千上萬(wàn)的實(shí)習招聘信息,簡(jiǎn)直讓人望而生畏。然后我的朋友給我發(fā)了一條“幫助”信息。了解了大致情況后,我立即用爬蟲(chóng)爬取了實(shí)習網(wǎng)的信息,并貼出了數據結果。問(wèn)題在幾分鐘內得到解決。請我吃飯會(huì )不會(huì )過(guò)分?
  
  本爬蟲(chóng)實(shí)戰教程不僅適合新手練習爬蟲(chóng),也適合需要找實(shí)習信息的朋友!
  希望看完這篇文章后,能夠清楚的了解整個(gè)爬蟲(chóng)流程,能夠獨立完成。其次,可以通過(guò)自己的爬蟲(chóng)實(shí)戰獲取自己想要的信息。
  好了,話(huà)不多說(shuō),開(kāi)始吧!
  內容主要分為三部分:
  1、頁(yè)面分析
  2、爬蟲(chóng)步驟詳解
  一、目標頁(yè)面分析
  首先我們要知道我們的爬蟲(chóng)目標是什么?俗話(huà)說(shuō),知己知彼,百戰不殆。我們已經(jīng)知道我們要爬取的頁(yè)面是“實(shí)習網(wǎng)”,所以我們首先要去實(shí)習網(wǎng)看看里面有什么數據。
  實(shí)習網(wǎng)址:
  頁(yè)面如下:
  
  比如我們要找的職位是“品牌運營(yíng)”職位的數據。因此,直接在網(wǎng)頁(yè)的搜索框中輸入品牌操作即可。你會(huì )發(fā)現url變了!
  
  注意:我們要抓取的頁(yè)面是這個(gè)頁(yè)面:品牌運營(yíng)
  在我們的抓取頁(yè)面中,我們需要觀(guān)察有哪些數據,一個(gè)頁(yè)面中有幾條數據。這一點(diǎn)很重要,關(guān)系到后續的代碼編寫(xiě),可以幫助你檢查頁(yè)面上的信息是否全部被抓取。
  此時(shí)需要注意的是,我們所在的頁(yè)面是“一級頁(yè)面”。在瀏覽過(guò)程中,我們點(diǎn)擊任意一個(gè)帖子進(jìn)入,就會(huì )顯示“二級頁(yè)面”。這時(shí)候你也會(huì )發(fā)現url又變了。
  比如我們點(diǎn)擊一??個(gè)品牌運營(yíng)實(shí)習,二級頁(yè)面會(huì )自動(dòng)跳轉到這個(gè),并且會(huì )生成一個(gè)新的鏈接。如圖:
  
  應該在頁(yè)面上抓取哪些信息?
  我們在分析中發(fā)現,有的信息在一級頁(yè)面,有的在二級頁(yè)面。
  在一級頁(yè)面上我們可以得到什么樣的信息?如圖:
  
  一共有五個(gè)有效數據:職位、公司名稱(chēng)、學(xué)歷、薪水、地址
  在二級頁(yè)面中,我們來(lái)看看可以獲取哪些有效數據、字段和比例。如果你覺(jué)得階段很重要,也可以把它包括在爬蟲(chóng)的范圍內,不過(guò)我個(gè)人認為這不影響實(shí)習,畢竟不是找正式工作不會(huì )有很大影響。相反,招聘的實(shí)習生人數更為重要。新兵人數這里沒(méi)有顯示,無(wú)法在圖片上顯示,以后可以添加。
  
  這里,我們需要抓取一共7條數據,加上“人數”一共8條數據,就是我們爬蟲(chóng)最終的目標數據。
  抓取“靜態(tài)”網(wǎng)頁(yè)
  這里分析一下什么是靜態(tài)網(wǎng)頁(yè),什么是動(dòng)態(tài)網(wǎng)頁(yè)。對于靜態(tài)網(wǎng)頁(yè),隨著(zhù)html代碼的生成,頁(yè)面的內容和顯示效果基本不會(huì )發(fā)生變化——除非你修改頁(yè)面代碼。這不是動(dòng)態(tài)網(wǎng)頁(yè)的情況。雖然頁(yè)面代碼沒(méi)有改變,但顯示的內容會(huì )隨著(zhù)時(shí)間、環(huán)境或數據庫操作的結果而改變。
  它們的區別在于:靜態(tài)網(wǎng)頁(yè)中的數據是一勞永逸的,也就是說(shuō)一次性全部給你。動(dòng)態(tài)網(wǎng)頁(yè)中的數據是隨著(zhù)頁(yè)面的逐步加載而逐漸呈現的,即靜態(tài)網(wǎng)頁(yè)的爬蟲(chóng)技術(shù)無(wú)法獲取其中的所有數據。
  值得強調的是,不要將動(dòng)態(tài)網(wǎng)頁(yè)與動(dòng)態(tài)頁(yè)面內容混淆。這里所說(shuō)的動(dòng)態(tài)網(wǎng)頁(yè)與網(wǎng)頁(yè)上的各種動(dòng)畫(huà)、滾動(dòng)字幕等視覺(jué)動(dòng)態(tài)效果無(wú)關(guān)。動(dòng)態(tài)網(wǎng)頁(yè)也可以是純文本內容,也可以收錄各種動(dòng)畫(huà)內容。這些只是網(wǎng)頁(yè)的細節。內容的呈現形式,無(wú)論網(wǎng)頁(yè)是否有動(dòng)態(tài)效果,只要是使用動(dòng)態(tài)網(wǎng)站技術(shù)生成的網(wǎng)頁(yè),都可以稱(chēng)為動(dòng)態(tài)網(wǎng)頁(yè)。
  點(diǎn)擊“鼠標右鍵”,點(diǎn)擊“查看網(wǎng)頁(yè)源代碼”,最終效果如圖(部分截圖):
  
  這是最終反饋給你的數據。如果你發(fā)現你想要的所有數據都在里面,你可以說(shuō)它是一個(gè)靜態(tài)頁(yè)面。如果不是,則將其視為“動(dòng)態(tài)頁(yè)面”。
  今天的案例是一個(gè)靜態(tài)網(wǎng)頁(yè)。
  大家都知道,在編寫(xiě)代碼之前,我們首先要知道我們將使用哪些方法、庫和模塊來(lái)幫助您解析數據。常用的解析數據的方法有:re正則表達式、xpath、beatifulsoup、pyquery等
  我們需要使用的是xpath分析方法來(lái)分析定位數據。
  二、爬蟲(chóng)代碼說(shuō)明1、導入相關(guān)庫
  爬蟲(chóng)的第一步是考慮在爬蟲(chóng)過(guò)程中需要哪些庫。你要知道python是一種依賴(lài)很多庫的語(yǔ)言。沒(méi)有庫的 Python 是不完整的。
  import pandas as pd # 用于數據存儲
import requests # 用于請求網(wǎng)頁(yè)
import chardet # 用于修改編碼
import re # 用于提取數據
from lxml import etree # 解析數據的庫
import time # 可以粗糙模擬人為請求網(wǎng)頁(yè)的速度
import warnings # 忽略代碼運行時(shí)候的警告信息
warnings.filterwarnings("ignore")
  2、請求一級頁(yè)面源碼
  url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text)
  這里要注意兩個(gè)地方①②。 ①處有兩個(gè)參數,一個(gè)是headers,一個(gè)是verify。其中,headers是一種反亂碼措施,使瀏覽器認為爬蟲(chóng)不是爬蟲(chóng),而是人們在正常使用瀏覽器請求網(wǎng)頁(yè)。驗證是忽略安全證書(shū)提示。某些網(wǎng)頁(yè)將被視為不安全并會(huì )提示您。記住這個(gè)參數就行了。
  在②處,我們已經(jīng)獲得了網(wǎng)頁(yè)的源代碼。但是由于網(wǎng)頁(yè)源代碼的編碼方式和您電腦的解析方式,可能會(huì )出現不一致的情況,返回結果會(huì )造成亂碼。此時(shí)需要修改編碼方式,chardet庫可以幫你自動(dòng)檢測網(wǎng)頁(yè)源代碼的編碼方式。 (一個(gè)非常有用的檢測文檔編碼的三方庫chardet)
  3、解析一級頁(yè)面網(wǎng)頁(yè)中的信息
  # 1. 公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
# 2. 崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]
# 3. 地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)
# 4. 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)
# 5. 薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
  4、獲取二級頁(yè)面的鏈接
  deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]
  這時(shí)候可以看到我直接用xpath對一級頁(yè)面中的數據分析進(jìn)行了分析。代碼最后可以看到:我們已經(jīng)獲取到了二級頁(yè)面的鏈接,為我們后續抓取二級頁(yè)面的信息做準備。
  分析二級頁(yè)面網(wǎng)頁(yè)中的信息
  需求列表 = []
  area_list = []
  scale_list = []
  對于 deep_url_list 中的 deep_url:
  rqg = requests.get(deep_url, headers=headers, verify=False) ①
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;] ②
html = etree.HTML(rqg.text) ③
# 6. 招聘人數
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)
# 7. 公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# 8. 公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)
demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)
  需要注意的是,二級頁(yè)面也是一個(gè)頁(yè)面,爬取其中的數據時(shí)需要請求該頁(yè)面。因此,①②③處的代碼完全相同。
  5、翻頁(yè)操作
  隨意復制幾個(gè)不同頁(yè)面的URL,觀(guān)察差異。這里可以看到page參數后面的數字不同,是第一頁(yè),數字就是數字。
  x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,21)]
  由于我們抓取了 20 頁(yè)數據,這里構造了 20 個(gè) URL,它們都存在于 url_list 列表中。
  現在讓我們看一下整個(gè)代碼。不再用文字描述,直接在代碼中寫(xiě)注釋。
  import pandas as pd
import requests
import chardet
import re
from lxml import etree
import time
import warnings
warnings.filterwarnings("ignore")
def get_CI(url):
# 請求獲取一級頁(yè)面的源代碼
url = &#39;https://www.shixi.com/search/index?key=品牌運營(yíng)&districts=&education=0&full_opportunity=0&stage=0&practice_days=0&nature=0&trades=&lang=zh_cn&#39;
headers = {&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36&#39;}
rqg = requests.get(url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)

# 獲取一級頁(yè)面中的信息:一共有5個(gè)信息。
# ①公司名
company_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
company_list = [company_list[i].strip() for i in range(len(company_list)) if i % 2 != 0]
#②崗位名
job_list = html.xpath(&#39;//div[@class="job-pannel-list"]//div[@class="job-pannel-one"]//a/text()&#39;)
job_list = [job_list[i].strip() for i in range(len(job_list)) if i % 2 == 0]

#③地址
address_list = html.xpath(&#39;//div[@class="job-pannel-two"]//a/text()&#39;)

# ④ 學(xué)歷
degree_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dd[@class="job-des"]/span/text()&#39;)


# ⑤薪資
salary_list = html.xpath(&#39;//div[@class="job-pannel-two"]//div[@class="company-info-des"]/text()&#39;)
salary_list = [i.strip() for i in salary_list]
# ⑥獲取二級頁(yè)面的內容
deep_url_list = html.xpath(&#39;//div[@class="job-pannel-list"]//dt/a/@href&#39;)
x = "https://www.shixi.com"
deep_url_list = [x + i for i in deep_url_list]

demand_list = []
area_list = []
scale_list = []
# 獲取二級頁(yè)面中的信息:
for deep_url in deep_url_list:
rqg = requests.get(deep_url, headers=headers, verify=False)
rqg.encoding = chardet.detect(rqg.content)[&#39;encoding&#39;]
html = etree.HTML(rqg.text)

#① 需要幾人
demand = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="intros"]/span[2]/text()&#39;)

# ②公司領(lǐng)域
area = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[1]/span/text()&#39;)
# ③公司規模
scale = html.xpath(&#39;//div[@class="container-fluid"]//div[@class="detail-intro-title"]//p[2]/span/text()&#39;)

demand_list.append(demand)
area_list.append(area)
scale_list.append(scale)

# ④ 將每個(gè)頁(yè)面獲取到的所有數據,存儲到DataFrame中。
data = pd.DataFrame({&#39;公司名&#39;:company_list,&#39;崗位名&#39;:job_list,&#39;地址&#39;:address_list,"學(xué)歷":degree_list,
&#39;薪資&#39;:salary_list,&#39;崗位需求量&#39;:demand_list,&#39;公司領(lǐng)域&#39;:area_list,&#39;公司規模&#39;:scale_list})
return(data)
x = "https://www.shixi.com/search/index?key=數據分析&page="
url_list = [x + str(i) for i in range(1,61)]
res = pd.DataFrame(columns=[&#39;公司名&#39;,&#39;崗位名&#39;,&#39;地址&#39;,"學(xué)歷",&#39;薪資&#39;,&#39;崗位需求量&#39;,&#39;公司領(lǐng)域&#39;,&#39;公司規模&#39;])
# 這里進(jìn)行“翻頁(yè)”操作
for url in url_list:
res0 = get_CI(url)
res = pd.concat([res,res0])
time.sleep(3)
# 保存數據
res.to_csv(&#39;aliang.csv&#39;,encoding=&#39;utf_8_sig&#39;)
  有了這樣的一套,爬蟲(chóng)的思路會(huì )不會(huì )瞬間清晰?眼睛:我會(huì )的!手:我還是不會(huì )。多練。初學(xué)者不要急于求成,項目不多,但要精髓。吃一個(gè)比看十個(gè)更有效。
  來(lái)自:

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),利用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 57 次瀏覽 ? 2021-12-31 13:29 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),利用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序)
  摘要:基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),采用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序,對廣電總局電視劇電子政務(wù)平臺的電視劇記錄數據進(jìn)行爬取。此外,還對抓取的電視劇記錄數據進(jìn)行了統計分析,得出了相關(guān)結論。
  關(guān)鍵詞:Python;爬蟲(chóng);數據分析
  中文圖書(shū)館分類(lèi)號:TP311.11 文獻識別碼:A 文章 編號:1007-9416 (2017)09-0035-02
  1 爬蟲(chóng)技術(shù)介紹
  網(wǎng)絡(luò )爬蟲(chóng)是一種通過(guò)既定規則自動(dòng)抓取網(wǎng)絡(luò )信息的計算機程序。爬蟲(chóng)的目的是將目標網(wǎng)頁(yè)數據下載到本地進(jìn)行后續的數據分析。爬蟲(chóng)技術(shù)的興起源于海量網(wǎng)絡(luò )數據的可用性。通過(guò)爬蟲(chóng)技術(shù),我們可以輕松獲取網(wǎng)絡(luò )數據,通過(guò)數據分析得出有價(jià)值的結論。
  Python語(yǔ)言簡(jiǎn)單易用,現成的爬蟲(chóng)框架和工具包降低了使用門(mén)檻。正則表達式的具體使用,使得數據采集工作生動(dòng)有趣。
  2 案例分析
  2.1 網(wǎng)頁(yè)描述
  目標數據是歷年全國電視劇拍攝的記錄數據。數據來(lái)源于廣電總局電視劇電子政務(wù)平臺公開(kāi)信息,如圖1所示。 具體網(wǎng)址:“http:
  // /tims/site/views/applications.shanty? 應用名稱(chēng)=注釋”。
  我們需要爬取歷年來(lái)每個(gè)月的記錄公開(kāi)信息列表數據,如圖2所示,并進(jìn)行匯總分析。
  2.2 爬蟲(chóng)程序的設計與實(shí)現
  首先,我們使用 BeautifulSoup 解析器來(lái)解析 URL 的文本信息。在分析了網(wǎng)頁(yè)的 HTML 文本和頁(yè)面規則后,我們制定了以下步驟來(lái)捕獲目標數據。
 ?、僮ト〉谝豁?yè)碼和最后頁(yè)碼后,循環(huán)抓取列表頁(yè)信息; 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),利用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序)
  摘要:基于Python爬蟲(chóng)技術(shù)簡(jiǎn)單易用的特點(diǎn),采用python語(yǔ)言編寫(xiě)爬蟲(chóng)程序,對廣電總局電視劇電子政務(wù)平臺的電視劇記錄數據進(jìn)行爬取。此外,還對抓取的電視劇記錄數據進(jìn)行了統計分析,得出了相關(guān)結論。
  關(guān)鍵詞:Python;爬蟲(chóng);數據分析
  中文圖書(shū)館分類(lèi)號:TP311.11 文獻識別碼:A 文章 編號:1007-9416 (2017)09-0035-02
  1 爬蟲(chóng)技術(shù)介紹
  網(wǎng)絡(luò )爬蟲(chóng)是一種通過(guò)既定規則自動(dòng)抓取網(wǎng)絡(luò )信息的計算機程序。爬蟲(chóng)的目的是將目標網(wǎng)頁(yè)數據下載到本地進(jìn)行后續的數據分析。爬蟲(chóng)技術(shù)的興起源于海量網(wǎng)絡(luò )數據的可用性。通過(guò)爬蟲(chóng)技術(shù),我們可以輕松獲取網(wǎng)絡(luò )數據,通過(guò)數據分析得出有價(jià)值的結論。
  Python語(yǔ)言簡(jiǎn)單易用,現成的爬蟲(chóng)框架和工具包降低了使用門(mén)檻。正則表達式的具體使用,使得數據采集工作生動(dòng)有趣。
  2 案例分析
  2.1 網(wǎng)頁(yè)描述
  目標數據是歷年全國電視劇拍攝的記錄數據。數據來(lái)源于廣電總局電視劇電子政務(wù)平臺公開(kāi)信息,如圖1所示。 具體網(wǎng)址:“http:
  // /tims/site/views/applications.shanty? 應用名稱(chēng)=注釋”。
  我們需要爬取歷年來(lái)每個(gè)月的記錄公開(kāi)信息列表數據,如圖2所示,并進(jìn)行匯總分析。
  2.2 爬蟲(chóng)程序的設計與實(shí)現
  首先,我們使用 BeautifulSoup 解析器來(lái)解析 URL 的文本信息。在分析了網(wǎng)頁(yè)的 HTML 文本和頁(yè)面規則后,我們制定了以下步驟來(lái)捕獲目標數據。
 ?、僮ト〉谝豁?yè)碼和最后頁(yè)碼后,循環(huán)抓取列表頁(yè)信息;

官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久