1. 程式人生 > >爬蟲基本知識及簡單生成爬蟲

爬蟲基本知識及簡單生成爬蟲

(1)爬蟲是什麼:一段自動抓取網際網路資訊的程式,網際網路是URL的互相連線,爬蟲就是從一個URL出發然後走到與它相關的所有URL並且提取需要的資料;價值:獲得更多網際網路資料,得到自己想用的資料;

(2)簡單爬蟲構架:爬蟲排程端:URL管理器,包括已經爬取的URL和未訪問的URL,把待爬取的URL傳遞給網頁下載器,下載器下載下來儲存成為字串,然後把字串傳遞給網頁解析器,網頁解析器一方面獲取有價值的資料,另一方面把解析的URL補充進URL管理器。

①URL管理器:含帶抓取的URL和已經抓取過得URL,防止重複抓取和迴圈抓取。三種實現方式:待爬取和已經爬取的儲存在記憶體中,python中就是:.set()可以去重;儲存在關係庫當中MySQL urls(url,is_crawled),用表儲存;快取資料庫,redis:都在set中。大型的都在快取資料庫當中,我們一般就儲存在記憶體中,如果記憶體不夠,或者永久儲存就儲存在關係庫當中。

②網頁下載器(urllib):網際網路上的URL對應的網頁下載到本地的工具。python有哪些實現模組:urllib官方的基礎模組,直接的URL下載或者向網頁提交需要使用者提供輸入的資料甚至支援需要使用者登入的處理和需要代理訪問的代理處理;requests是第三方查件,有更強大的功能,本次選擇urllib2介紹,有三種下載方法:如下《第二種:header 向伺服器提交頭資訊  data 向用戶提交需要使用者輸入的資料#將url,header,data傳送給urllib2.Request物件,然後urllib2.urlopen(request)》《第三種:特殊情景的處理器,比如有些網站需要登入需要cookie的處理,HTTPCookieProcessor 代理才能訪問使用#ProxyHandler ,需要加密訪問的使用HTTPSHandler,有些網頁url相互自動跳轉的方式使用#HTTPRedirectHandler,然後傳遞給#opener=urllib.build_opener(handler),url=urllib.install_opener(opener),urllib.urlopen(url)#cookie的處理#建立一個cookie的容器#生成一個引數#建立一個opener#給urllib2安裝opener#實現網站的下載》
 

from urllib.request import urlopen

#直接請求
response=urlopen("http://www.baidu.com")

#獲取狀態碼,判斷是否成功如果是200表示獲取成功
print(response.getcode())

#讀取下載好的內容
print(response.read())

③網頁解析器:正則表示式,模糊匹配的方式,非常麻煩;自帶的html.parser;第三方外掛BeautifulSoup(比較強大);第三方外掛lxml是解析xml網頁。後面三種都是結構化解析—下載成DOM樹,以樹的方式,以實現對上下級的遍歷,它把網頁文件當成Document的物件,下面就是<html>根節點,再下面是<body>元素和<head>元素,<head>元素下面就是<title>元素等子元素,如果再沒有子元素就是“我的標題”文字,<body>元素會有很多子元素<a>→“連結文字”;元素<div>→有很多子元素或者直接包含“段落文字”

BeatuifulSoup的語法:1,建立BeautifulSoup,就是把文件字串換成一個DOM樹;2,搜尋節點,find_all可以搜尋出所有節點,find方法只能搜尋出第一個滿足要求的節點,這兩個引數是一模一樣的;3,訪問節點:名稱,屬性,文字。<a(名稱) href='123.html' (屬性)class='artcle_link(屬性)> Python (文字)</a>

from bs4 import BeautfulSoup
#建立物件
soup=BeautifulSoup(html_doc,#文件字串
                  'html.parser',#解析器
                   from_encoding='utf8'#文件的編碼
                   )
#搜尋物件,標籤為a,連結符合/view/123.htm形式的節點
soup.find_all('a',href='/view/123.htm')
#可以傳入正則表示式,模糊匹配
soup.find_all('a',href=re.compile(r'/view/\d+\.htm'))

#class下劃線避免衝突
soup.find_all('div',class_='abc',string='Python')

#訪問節點的資訊
node.name #獲取找到節點的標籤名稱
nade[‘href’] #查詢到節點的herf的屬性
nade.get_text() #查詢節點的連結文字

(5)完整例項下一個哦直通車: