爬蟲:一段自動抓取互聯網信息的程序。html
什麼意思呢?node
互聯網是由各類各樣的網頁組成。每個網頁對應一個URL,而URL的頁面上又有不少指向其餘頁面的URL。這種URL之間相互的指向關係就造成了一個網絡,這就是互聯網。正則表達式
正常狀況下就是咱們採用人工點擊的方式,去獲取互聯網上指定的信息,這種方式的特色是覆蓋面小。數據庫
那有沒有可能有一種方式,是當咱們設定了一個互聯網上感興趣的目標,而後自動地從互聯網上去獲取咱們所須要的數據呢?緩存
有,這就是爬蟲。它能夠從一個URL出發訪問該URL所關聯的全部URL,而且從每一個頁面上提取出咱們所須要的價值數據。服務器
也就是說,爬蟲就是自動訪問互聯網,而且提取數據的程序。cookie
互聯網數據,爲我所用。網絡
1)首先,咱們須要一個爬蟲調度端。爬蟲調度端的做用:啓動爬蟲,中止爬蟲,監視爬蟲運行狀況。架構
2)在爬蟲程序中有三個模塊:URL管理器、網頁下載器、網頁解析器。eclipse
3)URL管理器:對將要爬取的和已經爬取過的URL進行管理;可取出待爬取的URL,將其傳送給「網頁下載器」。
4)網頁下載器:將URL指定的網頁下載,存儲成一個字符串,在傳送給「網頁解析器」。
5)網頁解析器:解析網頁可解析出
①有價值的數據
②另外一方面,每一個網頁都包含有指向其餘網頁的URL,解析出來後可補充進「URL管理器」
此時,這三個模塊就造成了一個循環,只要有感興趣的URL,這三個模塊就會一直循環下去。
URL管理器:管理待抓取URL集合和已抓取URL集合。
目的:防止重複抓取、防止循環抓取。
Python爬蟲URL管理器的實現方式具體有三種:
1)使用內存,在Python中主要使用set集合(方便去除重複的元素)
2)使用關係數據庫,使用兩個字段:url和is_crawled(用來標記是否被爬取)
3)使用緩存數據庫,一樣使用set集合
其中,大型公司通常選擇高性能的緩存數據庫。我的,小公司通常使用內存。如果想永久存儲,常使用關係數據庫。
網頁下載器:一個工具,經過URL將互聯網上對應的的網頁以HTML的形式下載到本地存儲成本地文件或內存字符串,後進行後續處理;
Python有哪幾種網頁下載器:urllib2(Python官方模塊,基礎模塊)、requests(第三方模塊,功能強大)。
1)urllib2下載網頁方法1:最簡潔方法
將url直接傳給urllib2的urlopen()方法。
對應代碼:
2)urllib2下載網頁方法2:除url外,添加data、http header。
進行加強處理。
其中,data向服務器提交須要用戶輸入的數據。
http header用來向服務器提交http的頭信息。
對應代碼:
代碼中request.add_data('a','1') #添加的數據類型爲鍵值對,即a=1。
request.add_header() #能夠對url請求進行假裝
3)urllib2下載網頁方法3:添加特殊情景的處理器
更大更強的功能處理能力。
對應代碼(舉例:加強cookie的處理)
import urllib2, cookielib
url ="http://www.baidu.com"
print '第一種方法' respones1 = urllib2.urlopen(url) print respones1.getcode() print len(respones1.read())
print "第二種方法" request = urllib2.Request(url) request.add_header("user-agent","Mozillla/5.0") respones2 = urllib2.urlopen(request) print respones2.getcode() print len(respones2.read()) print '第三種方法' cj =cookielib.CookieJar() opener = urllib2.bulid_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) print respones3.getcode() print cj print respones3.read()
網頁解析器:從網頁中提取有價值數據的工具。
功能:
1)提取出新的待爬取URL列表;
2)解析出有價值的數據:
網頁解析器會如下載好的html網頁字符串做爲輸入,提取出有價值的數據以及新的待爬取的URL列表。
Python有哪些網頁解析器呢?
1)正則表達式。最直觀的一種。將網頁文檔down成一個字符串,採用模糊匹配的方式進行提取有價值的數據。雖然直觀,可是當網頁文檔十分複雜的時候,這種方式將十分複雜。
2)使用Python自帶的html.parser模塊進行解析。
3)使用Beautiful Soup這個第三方插件來解析網頁。功能強大的Beautiful Soup能夠用html.parser或者lxml做爲它的解析器。
4)使用lxml這個第三方插件來解析html網頁或者xml文檔。
結構化解析——DOM(DOcument Object Model)樹
BeautifulSoup官網:https://www.crummy.com/software/BeautifulSoup/
安裝BeautifulSoup:
若是你安裝了pip,那麼就簡單了,無需從官網下載,打開命令提示符頁面。
進入到Python安裝目錄下的Scripts文件夾路徑下,輸入「pip install beautifulsoup4」,便可進行自動安裝。
安裝完,在eclipse中進行測試,新建一個Python模塊,輸入:
import bs4 print bs4
輸出爲:
證實安裝成功。
其中搜索節點的find_all()方法能夠搜索出全部符合要求的節點,而find()方法則只是搜索出符合條件的第一個節點。可是兩個函數的參數是徹底相同的。
對應代碼:
1)建立BeautifulSoup對象
2)搜索節點(find_all、find)
其中紅色部分爲正則表達式形式。
最後一句之因此"class_"要加上下劃線是由於要和Python的關鍵字"class"進行區分。
3)訪問節點信息
4)BeautifulSoup的實例測試
# coding:utf-8 from bs4 import BeautifulSoup import re print("Python3 的代碼以下") html_doc = """ 因字數限制,省略。請到 http://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-the-tree 複製吧 """ soup = BeautifulSoup(html_doc, 'html.parser') print("獲取全部的連接") links = soup.find_all('a') for link in links: print(link.name, link['href'], link.get_text()) print("獲取lacie的連接") link_node = soup.find('a', href="http://example.com/lacie") print(link_node.name, link_node['href'], link_node.get_text()) print("正則匹配") link_node = soup.find('a', href=re.compile(r"ill")) print(link_node.name, link_node['href'], link_node.get_text()) print("獲取p段落文字") p_node = soup.find('p', class_="title") print(p_node.name, p_node.get_text())
1) 實例爬蟲操做步驟
2)Python爬蟲實例-分析目標
本篇博客參考慕課網課程:https://www.imooc.com/video/10683