python資料採集1 初見爬蟲

2021-09-24 06:51:58 字數 4461 閱讀 8673

註解

現在本地的hosts檔案中找url對應的ip,找不到舊區dns伺服器中找

根據ip找到伺服器,建立tcp連線

將url後面的一坨請求傳送給伺服器

伺服器根據收到的請求,將對應的資源傳送給客戶端

讓我們看看 python 是如何實現的

# -*- coding: utf-8 -*-

"""created on sun jan 21 18:47:08 2018

@autho

"""from urllib.request import urlopen

html = urlopen("")

print(html.read())

複製**

返回的結果如下

複製**

由於返回資訊過多,部分展示

這將會輸出 www.baidu.com/ 這個網頁的全部 html **。

from urllib.request import urlopen

複製**

它查詢 python 的request模組(在urllib庫裡面),只匯入乙個urlopen函式。

urlopen用來開啟並讀取乙個從網路獲取的遠端物件。因為它是乙個非常通用的庫(它可 以輕鬆讀取 html 檔案、影象檔案,或其他任何檔案流),所以我們將在本書中頻繁地使 用它。

beautifulsoup 庫的名字取自劉易斯 ·卡羅爾在《愛麗絲夢遊仙境》裡的同名詩歌

beautifulsoup 嘗試化平淡為神奇。它通過定位 html 標籤來 格式化和組織複雜的網路資訊,用簡單易用的 python 物件為我們展現 xml 結構資訊。

linux

$sudo apt-get install python-bs4

mac$sudo easy_install pip

$pip install beautifulsoup4

from urllib.request import urlopen

from bs4 import beautifulsoup

html = urlopen("")

bsobj = beautifulsoup(html.read())

print(bsobj.img)

複製**

返回結果如下

複製**

可以看出,我們從網頁中提取的標籤被嵌在 beautifulsoup 物件bsobj結構的第二層 (html → body → img)。但是,當我們從物件裡提取img標籤的時候,可以直接呼叫它: bsobj.h1

bsobj.html.body.img

bsobj.body.img

bsobj.html.img

複製**

也可以達到同樣的效果

網路是十分複雜的。網頁資料格式不友好,**伺服器宕機,目標資料的標籤找不到,都 是很麻煩的事情。網路資料採集最痛苦的遭遇之一,就是爬蟲執行的時候你洗洗睡了,夢 想著明天一早資料就都會採集好放在資料庫裡,結果第二天醒來,你看到的卻是乙個因某 種資料格式異常導致執行錯誤的爬蟲,在前一天當你不再盯著螢幕去睡覺之後,沒過一會 兒爬蟲就不再執行了。那個時候,你可能想罵發明網際網路(以及那些奇葩的網路資料格 式)的人,但是你真正應該斥責的人是你自己,為什麼一開始不估計可能會出現的異常!

html = urlopen("")

複製**

這行**主要可能會發生兩種異常:

第一種異常發生時,程式會返回 http 錯誤。http 錯誤可能是「404 page not found」「500 internal server error」等。所有類似情形, urlopen 函式都會丟擲「httperror」異常。我們 可以用下面的方式處理這種異常:

# 返回空值,中斷程式,或者執行另乙個方案

else:

# 程式繼續。注意:如果你已經在上面異常捕捉那一段**裡返回或中斷(break),

# 那麼就不需要使用else語句了,這段**也不會執行

複製**

如果程式返回 http 錯誤**,程式就會顯示錯誤內容,不再執行 else 語句後面的**。

if html is none:

print("url is not found")

else:

# 程式繼續

複製**

如果你想要呼叫的標籤不存在,beautifulsoup 就會返 初見網路爬蟲 | 9 回 none 物件。不過,如果再呼叫這個 none 物件下面的子標籤,就會發生 attributeerror錯誤

下面這行**( nonexistenttag 是虛擬的標籤,beautifulsoup 物件裡實際沒有)

print(bsobj.nonexistenttag)

複製**

會返回乙個 none 物件。處理和檢查這個物件是十分必要的。如果你不檢查,直接呼叫這個 none 物件的子標籤,麻煩就來了。如下所示。

print(bsobj.nonexistenttag.sometag)

複製**

這時就會返回乙個異常:

attributeerror: 'nonetype' object has no attribute 'sometag'

複製**

try:

badcontent = bsobj.nonexistingtag.anothertag

except attributeerror as e:

print("tag was not found")

else:

if badcontent == none:

print ("tag was not found")

else:

print(badcontent)

複製**

初看這些檢查與錯誤處理的**會覺得有點兒累贅,但是,我們可以重新簡單組織一下代 碼,讓它變得不那麼難寫(更重要的是,不那麼難讀)。例如,下面的**是上面爬蟲的 另一種寫法:

複製**

在這個例子中,我們建立了乙個 gettitle 函式,可以返回網頁的標題,如果獲取網頁 的時候遇到問題就返回乙個 none 物件。在 gettitle 函式裡面,我們像前面那樣檢查了 httperror ,然後把兩行 beautifulsoup **封裝在乙個 try 語句裡面。這兩行中的任何一 行有問題, attributeerror 都可能被丟擲(如果伺服器不存在, html 就是乙個 none 物件, html.read() 就會丟擲 attributeerror )。其實,我們可以在 try 語句裡面放任意多行**, 或者放乙個在任意位置都可以丟擲 attributeerror 的函式。

import warnings

warnings.filterwarnings("ignore")

複製**

python爬蟲之xpath資料採集

使用方式有兩種 1.最基本的lxml解析方式 from lxml import etree doc etree.parse exsample.html 2.另一種 from lxml import html text requests.get url text ht html.fromstring ...

第1章總結 初見網路爬蟲

1.urllib 還是 urllib2 如果你用過 python 2.x 裡的 urllib2 庫,可能會發現 urllib2 與 urllib 有些不同。在 python 3.x 裡,urllib2 改名為 urllib,被分成一些子模組 urllib.request urllib.parse 和...

python 爬蟲 網路資料採集 入門知識

1 正規表示式符號與方法 常用符號 匹配任意字元,換行符 除外 匹配前乙個字元0次或無限次 匹配前乙個字元0次或1次 貪心演算法 非貪心演算法 括號內的資料作為結果返回 2 正規表示式符號與方法 常用方法 findall 匹配所有符合規律的內容,返回包含結果的列表 search 匹配並提取第乙個符合...