欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

使用Python開始Web Scraping

系統 1919 0

  • 來源 | 愿碼(ChainDesk.CN)內容編輯
  • 愿碼Slogan | 連接每個程序員的故事
  • 網站 | http://chaindesk.cn
  • 愿碼愿景 | 打造全學科IT系統免費課程,助力小白用戶、初級工程師0成本免費系統學習、低成本進階,幫助BAT一線資深工程師成長并利用自身優勢創造睡后收入。
  • 官方公眾號 | 愿碼 | 愿碼服務號 | 區塊鏈部落
  • 免費加入愿碼全思維工程師社群 | 任一公眾號回復“愿碼”兩個字獲取入群二維碼

本文閱讀時長:15min

在本文中,我們將學習以編程方式執行操作以自動檢索和處理信息。Python??requests模塊使得執行這些操作變得非常容易。
本文知識點:

  • 下載網頁
  • 解析HTML
  • 抓取網絡
  • 訪問受密碼保護的頁面
  • 加快網絡抓取速度

下載網頁


下載網頁的基本功能包括GET針對URL?發出HTTP?請求。這是任何Web瀏覽器的基本操作。我們將在此配方中看到如何獲取獲取網頁的簡單請求。

安裝??requests模塊:

          
            $ echo "requests==2.18.3" >> requirements.txt
$ source .venv/bin/activate
(.venv) $ pip install -r requirements.txt
          
        
如何下載網頁
  1. 導入requests模塊:
          
            >>> import requests
          
        
  1. 請求URL,這需要一兩秒鐘:
          
            >>> url = 'http://www.columbia.edu/~fdc/sample.html'
>>> response = requests.get(url)
          
        
  1. 檢查返回的對象狀態代碼:
          
            >>> response.status_code
200
          
        
  1. 檢查結果的內容:
          
            >>> response.text
'\n\n\n
...
FULL BODY
...
\n'
          
        
  1. 檢查正在進行的和返回的標題:
          
            >>> 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非常簡單;?GET在這種情況下,通過URL?執行操作。這將返回result可以分析的對象。主要元素是status_code身體內容,可以表示為text。

可以在request現場檢查完整請求:

          
            >>> response.request

>>> response.request.url
'http://www.columbia.edu/~fdc/sample.html'
          
        

解析HTML


我們將使用Beautiful Soup模塊將HTML文本解析為可以分析的內存對象。我們需要使用該??beautifulsoup4?包來使用可用的Python?3版本。將軟件包添加到您requirements.txt的虛擬環境中并安裝依賴項:

          
            $ echo "beautifulsoup4==4.6.0" >> requirements.txt
$ pip install -r requirements.txt
          
        
如何執行HTML解析
  1. 導入BeautifulSoup和requests:
          
            >>> import requests
>>> from bs4 import BeautifulSoup
          
        
  1. 設置要下載和檢索的頁面的URL:
          
            >>> URL = 'http://www.columbia.edu/~fdc/sample.html'
>>> response = requests.get(URL)
>>> response

          
        
  1. 解析下載的頁面:
          
            >>> page = BeautifulSoup(response.text, 'html.parser')
          
        
  1. 獲取頁面標題。看到它與瀏覽器中顯示的內容相同:
          
            >>> page.title
Sample Web Page
>>> page.title.string
'Sample Web Page'
          
        
  1. 查找h3頁面中的所有元素,以確定現有部分:
          
            >>> 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]
          
        
  1. 提取部分鏈接上的文本。當你到達下一個時停止

標簽:

          
            >>> 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\n\nLinks can be internal within a Web page (like to\nthe Table of ContentsTable of Contents at the top), or they\ncan be to external web pages or pictures on the same website, or they\ncan be to websites, pages, or pictures anywhere else in the world.\n\n\n\nHere is a link to the Kermit\nProject home pageKermit\nProject home page.\n\n\n\nHere is a link to Section 5Section 5 of this document.\n\n\n\nHere is a link to\nSection 4.0Section 4.0\nof the C-Kermit\nfor Unix Installation InstructionsC-Kermit\nfor Unix Installation Instructions.\n\n\n\nHere is a link to a picture:\nCLICK HERECLICK HERE to see it.\n\n\n'
          
        

請注意,沒有HTML標記;?這都是原始文本。

第一步是下載頁面。然后,可以解析原始文本,如步驟3所示。結果??page?對象包含解析的信息。BeautifulSoup允許我們搜索HTML元素。它可以搜索第一個.find()?或返回列表??.find_all()。在步驟5中,它搜索具有特定屬性的特定標簽name=link。之后,它繼續迭代,.next_elements直到找到下一個h3標記,標記該部分的結尾。

提取每個元素的文本并最終組成單個文本。請注意or,避免存儲None,當元素沒有文本時返回。

抓取網絡


鑒于超鏈接頁面的性質,從一個已知的地方開始,并在鏈接到其他頁面后,在抓取網絡時,這是一個非常重要的工具。

為此,我們抓取一個尋找小短語的頁面,并打印包含它的任何段落。我們只會搜索屬于同一網站的網頁。即只有以www.somesite.com開頭的網址。我們不會關注指向外部網站的鏈接。

我們將使用GitHub倉庫中提供的準備示例作為示例。?下載整個站點并運行包含的腳本。

          
            $ python simple_delay_server.py
          
        

這為URL中的站點提供服務http://localhost:8000。您可以在瀏覽器上查看它。這是一個有三個條目的簡單博客。大部分都是無趣的,但我們添加了幾個包含關鍵字的段落python。

如何抓取網絡
  1. 完整的腳本crawling_web_step1.py可以在GitHub中找到。這里顯示最相關的位:
          
            ...
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
          
        
  1. 搜索引用python,以返回包含包含它的URL和段落的列表。請注意,由于鏈接斷開,存在一些錯誤:
          
            $ 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
          
        
  1. 另一個很好的搜索詞是crocodile。試試看:
          
            $ python crawling_web_step1.py http://localhost:8000/ -p crocodile
          
        

讓我們看看腳本的每個組件:

  1. 在main函數中遍歷所有找到的鏈接的循環:
  2. 在process_link函數中下載和解析鏈接:

它會下載文件,并檢查狀態是否正確,以跳過鏈接斷開等錯誤。它還會檢查類型(如上所述??Content-Type)是否為HTML頁面以跳過PDF和其他格式。最后,它將原始HTML解析為一個BeautifulSoup對象。

它還使用解析源鏈接urlparse,因此稍后在步驟4中,它可以跳過對外部源的所有引用。?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='')
          
        
  1. 它在search_text函數中找到要搜索的文本:

它在解析的對象中搜索指定的文本。請注意,搜索僅作為a?regex并在文本中完成。它打印生成的匹配項,包括source_link引用找到匹配項的URL:

          
            for element in page.find_all(text=re.compile(text)):
    print(f'Link {source_link}: --> {element}')
          
        
  1. 該get_links?函數檢索頁面上的所有鏈接:

它在解析的頁面中搜索所有元素,并檢索href元素,但僅檢索具有此類href元素且是完全限定URL(以...開頭http)的元素。這將刪除不是URL的'#'鏈接,例如鏈接或頁面內部的鏈接。

進行額外檢查以檢查它們是否與原始鏈接具有相同的來源,然后將它們注冊為有效鏈接。該netloc屬性允許檢測鏈接來自與步驟2中生成的已解析URL相同的URL域。

最后,返回鏈接,將它們添加到步驟1中描述的循環中。

訪問受密碼保護的頁面


有時網頁不向公眾開放,但以某種方式受到保護。最基本的方面是使用基本的HTTP身份驗證,它幾乎集成到每個Web服務器中,它是一個用戶/密碼架構。

我們可以在https://httpbin.org中測試這種...??。它有一個路徑,/basic-auth/{user}/{password}強制進行身份驗證,并指定用戶和密碼。這對于理解身份驗證的工作原理非常方便。

如何訪問受密碼保護的頁面
  1. 進口requests:
          
            >>> import requests
          
        
  1. 做一個GET與錯誤的憑據的URL請求。請注意,我們將URL上的憑據設置為:user?和psswd:
          
            >>> requests.get('https://httpbin.org/basic-auth/user/psswd', 
                 auth=('user', 'psswd'))

          
        
  1. 使用錯誤的憑據返回401狀態代碼(未授權):
          
            >>> requests.get('https://httpbin.org/basic-auth/user/psswd', 
                 auth=('user', 'wrong'))

          
        
  1. 憑證也可以直接在URL中傳遞,@在服務器之前用冒號和符號分隔,如下所示:
          
            >>> requests.get('https://user:psswd@httpbin.org/basic-auth/user/psswd')

>>> requests.get('https://user:wrong@httpbin.org/basic-auth/user/psswd')

          
        

加快網絡抓取速度


從網頁下載信息所花費的大部分時間通常都在等待。一個請求從我們的計算機發送到任何服務器將處理它,直到響應組成并返回到我們的計算機,我們不能做太多的事情。

在本文中,我們將看到如何并行下載頁面列表,并等待它們全部準備好。我們將使用故意慢的服務器來顯示這一點。

我們將獲取用于抓取和搜索關鍵字的代碼,利用futuresPython 3?的功能同時下載多個頁面。A?future是表示值的承諾的對象。這意味著您在后臺執行代碼時會立即收到對象。只有在特別要求其.result()代碼塊時才能獲得它。

要生成a?future,您需要一個名為executor的后臺引擎。一旦創建,就會?submit有一個函數和參數來檢索它future。結果的檢索可以根據需要延遲,允許futures連續生成幾個,并等待所有結束,并行執行它們,而不是創建一個,等到它完成,創建另一個,依此類推。

有幾種方法可以創建執行程序;?我們將使用ThreadPoolExecutor,它將使用線程。

我們將使用GitHub倉庫中提供的準備示例作為示例。下載整個站點并運行包含的腳本

          
            $ python simple_delay_server.py -d 2
          
        

這為URL中的站點提供服務??http://localhost:8000。您可以在瀏覽器上查看它。這是一個簡單的博客,有三個條目。大部分都是無趣的,但我們添加了幾個包含關鍵字的段落??python。該參數-d 2使服務器故意變慢,模擬連接錯誤。

如何加快網頁抓取速度
  1. 編寫以下腳本speed_up_step1.py。完整代碼可在GitHub中找到。
  2. 注意main功能的差異。此外,還添加了一個額外的參數(并發工作者數),該函數process_link?現在返回源鏈接。
  3. 運行??crawling_web_step1.py?腳本以獲取時間基準。請注意,為清楚起見,此處已刪除輸出:
          
            $ time python crawling_web_step1.py http://localhost:8000/
... REMOVED OUTPUT
real 0m12.221s
user 0m0.160s
sys 0m0.034s
          
        
  1. 使用一個工作程序運行新腳本,該工作程序比原始工作程序慢:
          
            $ time python speed_up_step1.py -w 1
... REMOVED OUTPUT
real 0m16.403s
user 0m0.181s
sys 0m0.068s
          
        
  1. 增加工人數量:
          
            $ time python speed_up_step1.py -w 2
... REMOVED OUTPUT
real 0m10.353s
user 0m0.199s
sys 0m0.068s
          
        
  1. 添加更多工作人員會減少時間:
          
            $ time python speed_up_step1.py -w 5
... REMOVED OUTPUT
real 0m6.234s
user 0m0.171s
sys 0m0.040s
          
        

創建并發請求的主要引擎是主要功能。請注意,其余代碼基本上不受影響(除了返回process_link函數中的源鏈接)。這是處理并發引擎的代碼的相關部分:

          
            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背景下產生的工人池,并指定其編號。在內部,創建包含要檢索的所有URL的期貨列表。該.as_completed()函數返回已完成的期貨,然后有一些工作處理獲取新找到的鏈接并檢查是否需要添加它們以進行檢索。此過程類似于抓取Web?配方中顯示的過程。

該過程再次開始,直到檢索到足夠的鏈接或沒有要檢索的鏈接。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 波多野结衣亚洲一区二区三区 | 国产激情在线观看 | 日韩在线看片 | 久久精品久 | 国产激情一区二区三区四区 | 久草在线看 | 日韩视频www | 午夜 在线播放 | 免费人成网ww44kk44 | 超级碰碰碰免费视频 | 色狠狠狠色噜噜噜综合网 | 污污的网站在线观看 | 大插香蕉 | 欧美精品午夜久久久伊人 | 大陆黄色网 | 天天夜夜骑 | 91免费在线看片 | 欧美精品亚洲一区二区在线播放 | 56av国产精品久久久久久久 | 久久99国产精一区二区三区 | 欧美在线观看19 | 亚洲精品无码成人A片色欲 亚洲欧美日韩激情在线观看 | 一级毛片网 | 亚洲视频免费在线 | 欧美专区视频 | 亚洲国产精品99久久久久久久久 | 无名者电影在线完整版免费 | 国产精品福利视频手机免费观看 | 欧美日韩精品一区二区三区视频 | 欧美亚洲一区 | 精品在线一区二区三区 | 久草久草久草久草 | 成人毛片视频免费看 | 福利网址 | 久草视频网站 | 一级少妇女片 | 日本99精品| 国产精品亚洲视频 | 久久精品性视频 | 99毛片| 久久99精品视频 |