摘要:主要元素是身體內(nèi)容,可以表示為。提取每個(gè)元素的文本并最終組成單個(gè)文本。我們將使用故意慢的服務(wù)器來(lái)顯示這一點(diǎn)。是表示值的承諾的對(duì)象。我們將使用倉(cāng)庫(kù)中提供的準(zhǔn)備示例作為示例。請(qǐng)注意,其余代碼基本上不受影響除了返回函數(shù)中的源鏈接。
來(lái)源 | 愿碼(ChainDesk.CN)內(nèi)容編輯
愿碼Slogan | 連接每個(gè)程序員的故事
網(wǎng)站 | http://chaindesk.cn
愿碼愿景 | 打造全學(xué)科IT系統(tǒng)免費(fèi)課程,助力小白用戶、初級(jí)工程師0成本免費(fèi)系統(tǒng)學(xué)習(xí)、低成本進(jìn)階,幫助BAT一線資深工程師成長(zhǎng)并利用自身優(yōu)勢(shì)創(chuàng)造睡后收入。
官方公眾號(hào) | 愿碼 | 愿碼服務(wù)號(hào) | 區(qū)塊鏈部落
免費(fèi)加入愿碼全思維工程師社群 | 任一公眾號(hào)回復(fù)“愿碼”兩個(gè)字獲取入群二維碼
本文閱讀時(shí)長(zhǎng):15min
在本文中,我們將學(xué)習(xí)以編程方式執(zhí)行操作以自動(dòng)檢索和處理信息。Python??requests模塊使得執(zhí)行這些操作變得非常容易。
本文知識(shí)點(diǎn):
下載網(wǎng)頁(yè)
解析HTML
抓取網(wǎng)絡(luò)
訪問(wèn)受密碼保護(hù)的頁(yè)面
加快網(wǎng)絡(luò)抓取速度
下載網(wǎng)頁(yè)下載網(wǎng)頁(yè)的基本功能包括GET針對(duì)URL?發(fā)出HTTP?請(qǐng)求。這是任何Web瀏覽器的基本操作。我們將在此配方中看到如何獲取獲取網(wǎng)頁(yè)的簡(jiǎn)單請(qǐng)求。
安裝??requests模塊:
$ echo "requests==2.18.3" >> requirements.txt $ source .venv/bin/activate (.venv) $ pip install -r requirements.txt
導(dǎo)入requests模塊:
>>> import requests
請(qǐng)求URL,這需要一兩秒鐘:
>>> url = "http://www.columbia.edu/~fdc/sample.html" >>> response = requests.get(url)
檢查返回的對(duì)象狀態(tài)代碼:
>>> response.status_code 200
檢查結(jié)果的內(nèi)容:
>>> response.text " ... FULL BODY ... "
檢查正在進(jìn)行的和返回的標(biāo)題:
>>> response.request.headers {"User-Agent": "python-requests/2.18.4", "Accept-Encoding": "gzip, deflate", "Accept": "*/*", "Connection": "keep-alive"} >>> response.headers {"Date": "Fri, 25 May 2018 21:51:47 GMT", "Server": "Apache", "Last-Modified": "Thu, 22 Apr 2004 15:52:25 GMT", "Accept-Ranges": "bytes", "Vary": "Accept-Encoding,User-Agent", "Content-Encoding": "gzip", "Content-Length": "8664", "Keep-Alive": "timeout=15, max=85", "Connection": "Keep-Alive", "Content-Type": "text/html", "Set-Cookie": "BIGipServer~CUIT~www.columbia.edu-80-pool=1764244352.20480.0000; expires=Sat, 26-May-2018 03:51:47 GMT; path=/; Httponly"}
操作requests非常簡(jiǎn)單;?GET在這種情況下,通過(guò)URL?執(zhí)行操作。這將返回result可以分析的對(duì)象。主要元素是status_code身體內(nèi)容,可以表示為text。
可以在request現(xiàn)場(chǎng)檢查完整請(qǐng)求:
>>> response.request >>> response.request.url "http://www.columbia.edu/~fdc/sample.html"解析HTML
我們將使用Beautiful Soup模塊將HTML文本解析為可以分析的內(nèi)存對(duì)象。我們需要使用該??beautifulsoup4?包來(lái)使用可用的Python?3版本。將軟件包添加到您requirements.txt的虛擬環(huán)境中并安裝依賴(lài)項(xiàng):
$ echo "beautifulsoup4==4.6.0" >> requirements.txt $ pip install -r requirements.txt
導(dǎo)入BeautifulSoup和requests:
>>> import requests >>> from bs4 import BeautifulSoup
設(shè)置要下載和檢索的頁(yè)面的URL:
>>> URL = "http://www.columbia.edu/~fdc/sample.html" >>> response = requests.get(URL) >>> response
解析下載的頁(yè)面:
>>> page = BeautifulSoup(response.text, "html.parser")
獲取頁(yè)面標(biāo)題。看到它與瀏覽器中顯示的內(nèi)容相同:
>>> page.title Sample Web Page >>> page.title.string "Sample Web Page"
查找h3頁(yè)面中的所有元素,以確定現(xiàn)有部分:
>>> page.find_all("h3") [CONTENTS, 1. Creating a Web Page, 2. HTML Syntax, 3. Special Characters, 4. Converting Plain Text to HTML, 5. Effects, 6. Lists, 7. Links, 8. Tables, 9. Installing Your Web Page on the Internet, 10. Where to go from here]
提取部分鏈接上的文本。當(dāng)你到達(dá)下一個(gè)時(shí)停止
標(biāo)簽:
>>> link_section = page.find("a", attrs={"name": "links"}) >>> section = [] >>> for element in link_section.next_elements: ... if element.name == "h3": ... break ... section.append(element.string or "") ... >>> result = "".join(section) >>> result "7. Links Links can be internal within a Web page (like to the Table of ContentsTable of Contents at the top), or they can be to external web pages or pictures on the same website, or they can be to websites, pages, or pictures anywhere else in the world. Here is a link to the Kermit Project home pageKermit Project home page. Here is a link to Section 5Section 5 of this document. Here is a link to Section 4.0Section 4.0 of the C-Kermit for Unix Installation InstructionsC-Kermit for Unix Installation Instructions. Here is a link to a picture: CLICK HERECLICK HERE to see it. "
請(qǐng)注意,沒(méi)有HTML標(biāo)記;?這都是原始文本。
第一步是下載頁(yè)面。然后,可以解析原始文本,如步驟3所示。結(jié)果??page?對(duì)象包含解析的信息。BeautifulSoup允許我們搜索HTML元素。它可以搜索第一個(gè).find()?或返回列表??.find_all()。在步驟5中,它搜索具有特定屬性的特定標(biāo)簽name=link。之后,它繼續(xù)迭代,.next_elements直到找到下一個(gè)h3標(biāo)記,標(biāo)記該部分的結(jié)尾。
提取每個(gè)元素的文本并最終組成單個(gè)文本。請(qǐng)注意or,避免存儲(chǔ)None,當(dāng)元素沒(méi)有文本時(shí)返回。
抓取網(wǎng)絡(luò)鑒于超鏈接頁(yè)面的性質(zhì),從一個(gè)已知的地方開(kāi)始,并在鏈接到其他頁(yè)面后,在抓取網(wǎng)絡(luò)時(shí),這是一個(gè)非常重要的工具。
為此,我們抓取一個(gè)尋找小短語(yǔ)的頁(yè)面,并打印包含它的任何段落。我們只會(huì)搜索屬于同一網(wǎng)站的網(wǎng)頁(yè)。即只有以www.somesite.com開(kāi)頭的網(wǎng)址。我們不會(huì)關(guān)注指向外部網(wǎng)站的鏈接。
我們將使用GitHub倉(cāng)庫(kù)中提供的準(zhǔn)備示例作為示例。?下載整個(gè)站點(diǎn)并運(yùn)行包含的腳本。
$ python simple_delay_server.py
這為URL中的站點(diǎn)提供服務(wù)http://localhost:8000。您可以在瀏覽器上查看它。這是一個(gè)有三個(gè)條目的簡(jiǎn)單博客。大部分都是無(wú)趣的,但我們添加了幾個(gè)包含關(guān)鍵字的段落python。
完整的腳本crawling_web_step1.py可以在GitHub中找到。這里顯示最相關(guān)的位:
... def process_link(source_link, text): logging.info(f"Extracting links from {source_link}") parsed_source = urlparse(source_link) result = requests.get(source_link) # Error handling. See GitHub for details ... page = BeautifulSoup(result.text, "html.parser") search_text(source_link, page, text) return get_links(parsed_source, page) def get_links(parsed_source, page): """Retrieve the links on the page""" links = [] for element in page.find_all("a"): link = element.get("href") # Validate is a valid link. See GitHub for details ... links.append(link) return links
搜索引用python,以返回包含包含它的URL和段落的列表。請(qǐng)注意,由于鏈接斷開(kāi),存在一些錯(cuò)誤:
$ python crawling_web_step1.py https://localhost:8000/ -p python Link http://localhost:8000/: --> A smaller article , that contains a reference to Python Link http://localhost:8000/files/5eabef23f63024c20389c34b94dee593-1.html: --> A smaller article , that contains a reference to Python Link http://localhost:8000/files/33714fc865e02aeda2dabb9a42a787b2-0.html: --> This is the actual bit with a python reference that we are interested in. Link http://localhost:8000/files/archive-september-2018.html: --> A smaller article , that contains a reference to Python Link http://localhost:8000/index.html: --> A smaller article , that contains a reference to Python
另一個(gè)很好的搜索詞是crocodile。試試看:
$ python crawling_web_step1.py http://localhost:8000/ -p crocodile
讓我們看看腳本的每個(gè)組件:
在main函數(shù)中遍歷所有找到的鏈接的循環(huán):
在process_link函數(shù)中下載和解析鏈接:
它會(huì)下載文件,并檢查狀態(tài)是否正確,以跳過(guò)鏈接斷開(kāi)等錯(cuò)誤。它還會(huì)檢查類(lèi)型(如上所述??Content-Type)是否為HTML頁(yè)面以跳過(guò)PDF和其他格式。最后,它將原始HTML解析為一個(gè)BeautifulSoup對(duì)象。
它還使用解析源鏈接urlparse,因此稍后在步驟4中,它可以跳過(guò)對(duì)外部源的所有引用。?urlparse將URL劃分為其組成元素:
>>> from urllib.parse import urlparse >>> >>> urlparse("http://localhost:8000/files/b93bec5d9681df87e6e8d5703ed7cd81-2.html") ParseResult(scheme="http", netloc="localhost:8000", path="/files/b93bec5d9681df87e6e8d5703ed7cd81-2.html", params="", query="", fragment="")
它在search_text函數(shù)中找到要搜索的文本:
它在解析的對(duì)象中搜索指定的文本。請(qǐng)注意,搜索僅作為a?regex并在文本中完成。它打印生成的匹配項(xiàng),包括source_link引用找到匹配項(xiàng)的URL:
for element in page.find_all(text=re.compile(text)): print(f"Link {source_link}: --> {element}")
該get_links?函數(shù)檢索頁(yè)面上的所有鏈接:
它在解析的頁(yè)面中搜索所有元素,并檢索href元素,但僅檢索具有此類(lèi)href元素且是完全限定URL(以...開(kāi)頭http)的元素。這將刪除不是URL的"#"鏈接,例如鏈接或頁(yè)面內(nèi)部的鏈接。
進(jìn)行額外檢查以檢查它們是否與原始鏈接具有相同的來(lái)源,然后將它們注冊(cè)為有效鏈接。該netloc屬性允許檢測(cè)鏈接來(lái)自與步驟2中生成的已解析URL相同的URL域。
最后,返回鏈接,將它們添加到步驟1中描述的循環(huán)中。
訪問(wèn)受密碼保護(hù)的頁(yè)面有時(shí)網(wǎng)頁(yè)不向公眾開(kāi)放,但以某種方式受到保護(hù)。最基本的方面是使用基本的HTTP身份驗(yàn)證,它幾乎集成到每個(gè)Web服務(wù)器中,它是一個(gè)用戶/密碼架構(gòu)。
我們可以在https://httpbin.org中測(cè)試這種...??。它有一個(gè)路徑,/basic-auth/{user}/{password}強(qiáng)制進(jìn)行身份驗(yàn)證,并指定用戶和密碼。這對(duì)于理解身份驗(yàn)證的工作原理非常方便。
進(jìn)口requests:
>>> import requests
做一個(gè)GET與錯(cuò)誤的憑據(jù)的URL請(qǐng)求。請(qǐng)注意,我們將URL上的憑據(jù)設(shè)置為:user?和psswd:
>>> requests.get("https://httpbin.org/basic-auth/user/psswd", auth=("user", "psswd"))
使用錯(cuò)誤的憑據(jù)返回401狀態(tài)代碼(未授權(quán)):
>>> requests.get("https://httpbin.org/basic-auth/user/psswd", auth=("user", "wrong"))
憑證也可以直接在URL中傳遞,@在服務(wù)器之前用冒號(hào)和符號(hào)分隔,如下所示:
>>> requests.get("https://user:[email protected]/basic-auth/user/psswd") >>> requests.get("https://user:[email protected]/basic-auth/user/psswd")加快網(wǎng)絡(luò)抓取速度
從網(wǎng)頁(yè)下載信息所花費(fèi)的大部分時(shí)間通常都在等待。一個(gè)請(qǐng)求從我們的計(jì)算機(jī)發(fā)送到任何服務(wù)器將處理它,直到響應(yīng)組成并返回到我們的計(jì)算機(jī),我們不能做太多的事情。
在本文中,我們將看到如何并行下載頁(yè)面列表,并等待它們?nèi)繙?zhǔn)備好。我們將使用故意慢的服務(wù)器來(lái)顯示這一點(diǎn)。
我們將獲取用于抓取和搜索關(guān)鍵字的代碼,利用futuresPython 3?的功能同時(shí)下載多個(gè)頁(yè)面。A?future是表示值的承諾的對(duì)象。這意味著您在后臺(tái)執(zhí)行代碼時(shí)會(huì)立即收到對(duì)象。只有在特別要求其.result()代碼塊時(shí)才能獲得它。
要生成a?future,您需要一個(gè)名為executor的后臺(tái)引擎。一旦創(chuàng)建,就會(huì)?submit有一個(gè)函數(shù)和參數(shù)來(lái)檢索它future。結(jié)果的檢索可以根據(jù)需要延遲,允許futures連續(xù)生成幾個(gè),并等待所有結(jié)束,并行執(zhí)行它們,而不是創(chuàng)建一個(gè),等到它完成,創(chuàng)建另一個(gè),依此類(lèi)推。
有幾種方法可以創(chuàng)建執(zhí)行程序;?我們將使用ThreadPoolExecutor,它將使用線程。
我們將使用GitHub倉(cāng)庫(kù)中提供的準(zhǔn)備示例作為示例。下載整個(gè)站點(diǎn)并運(yùn)行包含的腳本
$ python simple_delay_server.py -d 2
這為URL中的站點(diǎn)提供服務(wù)??http://localhost:8000。您可以在瀏覽器上查看它。這是一個(gè)簡(jiǎn)單的博客,有三個(gè)條目。大部分都是無(wú)趣的,但我們添加了幾個(gè)包含關(guān)鍵字的段落??python。該參數(shù)-d 2使服務(wù)器故意變慢,模擬連接錯(cuò)誤。
編寫(xiě)以下腳本speed_up_step1.py。完整代碼可在GitHub中找到。
注意main功能的差異。此外,還添加了一個(gè)額外的參數(shù)(并發(fā)工作者數(shù)),該函數(shù)process_link?現(xiàn)在返回源鏈接。
運(yùn)行??crawling_web_step1.py?腳本以獲取時(shí)間基準(zhǔn)。請(qǐng)注意,為清楚起見(jiàn),此處已刪除輸出:
$ time python crawling_web_step1.py http://localhost:8000/ ... REMOVED OUTPUT real 0m12.221s user 0m0.160s sys 0m0.034s
使用一個(gè)工作程序運(yùn)行新腳本,該工作程序比原始工作程序慢:
$ time python speed_up_step1.py -w 1 ... REMOVED OUTPUT real 0m16.403s user 0m0.181s sys 0m0.068s
增加工人數(shù)量:
$ time python speed_up_step1.py -w 2 ... REMOVED OUTPUT real 0m10.353s user 0m0.199s sys 0m0.068s
添加更多工作人員會(huì)減少時(shí)間:
$ time python speed_up_step1.py -w 5 ... REMOVED OUTPUT real 0m6.234s user 0m0.171s sys 0m0.040s
創(chuàng)建并發(fā)請(qǐng)求的主要引擎是主要功能。請(qǐng)注意,其余代碼基本上不受影響(除了返回process_link函數(shù)中的源鏈接)。這是處理并發(fā)引擎的代碼的相關(guān)部分:
with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as executor: while to_check: futures = [executor.submit(process_link, url, to_search) for url in to_check] to_check = [] for data in concurrent.futures.as_completed(futures): link, new_links = data.result() checked_links.add(link) for link in new_links: if link not in checked_links and link not in to_check: to_check.append(link) max_checks -= 1 if not max_checks: return
該with背景下產(chǎn)生的工人池,并指定其編號(hào)。在內(nèi)部,創(chuàng)建包含要檢索的所有URL的期貨列表。該.as_completed()函數(shù)返回已完成的期貨,然后有一些工作處理獲取新找到的鏈接并檢查是否需要添加它們以進(jìn)行檢索。此過(guò)程類(lèi)似于抓取Web?配方中顯示的過(guò)程。
該過(guò)程再次開(kāi)始,直到檢索到足夠的鏈接或沒(méi)有要檢索的鏈接。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43806.html
摘要:忘記使用進(jìn)行,從導(dǎo)入數(shù)據(jù)文件第部分對(duì)于每個(gè)網(wǎng)站而言,并不總是適合您,但將永遠(yuǎn)與您保持聯(lián)系以從任何網(wǎng)站收集任何類(lèi)型的數(shù)據(jù)。非資源讓我們拿一個(gè)維基百科頁(yè)面進(jìn)行報(bào)廢。請(qǐng)求它旨在被人類(lèi)用于與語(yǔ)言進(jìn)行通信。使用標(biāo)簽,我們將告訴保護(hù)我們的數(shù)據(jù)。忘記API使用Beautiful Soup進(jìn)行Python Scraping,從Web導(dǎo)入數(shù)據(jù)文件:第2部分 對(duì)于每個(gè)網(wǎng)站而言,API并不總是適合您,但Be...
摘要:忘記使用進(jìn)行,從導(dǎo)入數(shù)據(jù)文件第部分對(duì)于每個(gè)網(wǎng)站而言,并不總是適合您,但將永遠(yuǎn)與您保持聯(lián)系以從任何網(wǎng)站收集任何類(lèi)型的數(shù)據(jù)。非資源讓我們拿一個(gè)維基百科頁(yè)面進(jìn)行報(bào)廢。請(qǐng)求它旨在被人類(lèi)用于與語(yǔ)言進(jìn)行通信。使用標(biāo)簽,我們將告訴保護(hù)我們的數(shù)據(jù)。忘記API使用Beautiful Soup進(jìn)行Python Scraping,從Web導(dǎo)入數(shù)據(jù)文件:第2部分 對(duì)于每個(gè)網(wǎng)站而言,API并不總是適合您,但Be...
摘要:用途廣泛,可以用于數(shù)據(jù)挖掘監(jiān)測(cè)和自動(dòng)化測(cè)試。運(yùn)行下,發(fā)現(xiàn)數(shù)據(jù)全部存到了數(shù)據(jù)庫(kù)中。提供了一些接口來(lái)查看項(xiàng)目爬蟲(chóng)情況,以及執(zhí)行或者停止執(zhí)行爬蟲(chóng)。完成小程序所需要的所有接口的開(kāi)發(fā),以及使用定時(shí)任務(wù)執(zhí)行爬蟲(chóng)腳本。 過(guò)完年回來(lái),業(yè)余時(shí)間一直在獨(dú)立開(kāi)發(fā)一個(gè)小程序。主要數(shù)據(jù)是8000+個(gè)視頻和10000+篇文章,并且數(shù)據(jù)會(huì)每天自動(dòng)更新。 我會(huì)整理下整個(gè)開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和一些細(xì)節(jié)問(wèn)題,因?yàn)閮?nèi)容會(huì)比...
摘要:許多網(wǎng)站在其服務(wù)條款中明確禁止對(duì)其內(nèi)容進(jìn)行抓取。此外,由抓取引起的法律訴訟也不在少數(shù)。在本文中,考慮到其簡(jiǎn)潔性與豐富的包支持,我們將使用實(shí)現(xiàn)抓取程序。在中,我們將使用一個(gè)名為靚湯的模塊對(duì)數(shù)據(jù)進(jìn)行分析。 【編者按】本文作者為 Blog Bowl 聯(lián)合創(chuàng)始人 Shaumik Daityari,主要介紹 Web 抓取技術(shù)的基本實(shí)現(xiàn)原理和方法。文章系國(guó)內(nèi) ITOM 管理平臺(tái) OneAPM 編譯...
摘要:負(fù)責(zé)處理被提取出來(lái)的。典型的處理有清理驗(yàn)證及持久化例如存取到數(shù)據(jù)庫(kù)知識(shí)庫(kù)項(xiàng)目的設(shè)置文件實(shí)現(xiàn)自定義爬蟲(chóng)的目錄中間件是在引擎及之間的特定鉤子,處理的輸入和輸出及。 【百度云搜索:http://www.bdyss.com】 【搜網(wǎng)盤(pán):http://www.swpan.cn】 Scrapy框架安裝 1、首先,終端執(zhí)行命令升級(jí)pip: python -m pip install --upgrad...
閱讀 1720·2021-11-17 09:33
閱讀 3565·2021-11-16 11:40
閱讀 3081·2019-08-30 11:23
閱讀 1080·2019-08-29 16:36
閱讀 2494·2019-08-29 13:23
閱讀 1772·2019-08-29 12:59
閱讀 1580·2019-08-29 12:42
閱讀 2008·2019-08-28 18:22