Python開發爬蟲之理論篇

爬蟲簡介


 爬蟲:一段自動抓取互聯網信息的程序。html

什麼意思呢?node

互聯網是由各類各樣的網頁組成。每個網頁對應一個URL,而URL的頁面上又有不少指向其餘頁面的URL。這種URL之間相互的指向關係就造成了一個網絡,這就是互聯網。正則表達式

正常狀況下就是咱們採用人工點擊的方式,去獲取互聯網上指定的信息,這種方式的特色是覆蓋面小。數據庫

那有沒有可能有一種方式,是當咱們設定了一個互聯網上感興趣的目標,而後自動地從互聯網上去獲取咱們所須要的數據呢?緩存

有,這就是爬蟲。它能夠從一個URL出發訪問該URL所關聯的全部URL,而且從每一個頁面上提取出咱們所須要的價值數據。服務器

也就是說,爬蟲就是自動訪問互聯網,而且提取數據的程序。cookie

 

爬蟲技術的價值


 互聯網數據,爲我所用。網絡

 

Python簡單爬蟲架構


1)首先,咱們須要一個爬蟲調度端。爬蟲調度端的做用:啓動爬蟲,中止爬蟲,監視爬蟲運行狀況。架構

2)在爬蟲程序中有三個模塊:URL管理器、網頁下載器、網頁解析器。eclipse

3)URL管理器:對將要爬取的和已經爬取過的URL進行管理;可取出待爬取的URL,將其傳送給「網頁下載器」。

4)網頁下載器:將URL指定的網頁下載,存儲成一個字符串,在傳送給「網頁解析器」。

5)網頁解析器:解析網頁可解析出

    ①有價值的數據

    ②另外一方面,每一個網頁都包含有指向其餘網頁的URL,解析出來後可補充進「URL管理器」

此時,這三個模塊就造成了一個循環,只要有感興趣的URL,這三個模塊就會一直循環下去。

 

 Python簡單爬蟲架構的動態運行流程(以時序圖的方式展現)


 

 

 Python爬蟲URL管理


 URL管理器:管理待抓取URL集合和已抓取URL集合。

目的:防止重複抓取、防止循環抓取。

 

Python爬蟲URL管理器的實現方式


 Python爬蟲URL管理器的實現方式具體有三種:

1)使用內存,在Python中主要使用set集合(方便去除重複的元素)

2)使用關係數據庫,使用兩個字段:url和is_crawled(用來標記是否被爬取)

3)使用緩存數據庫,一樣使用set集合

其中,大型公司通常選擇高性能的緩存數據庫。我的,小公司通常使用內存。如果想永久存儲,常使用關係數據庫。

 

Python爬蟲網頁下載器簡介


網頁下載器:一個工具,經過URL將互聯網上對應的的網頁以HTML的形式下載到本地存儲成本地文件或內存字符串,後進行後續處理;

Python有哪幾種網頁下載器:urllib2(Python官方模塊,基礎模塊)、requests(第三方模塊,功能強大)。

 

Python爬蟲urlib2下載器網頁的三種方法


 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的處理)

 

Python爬蟲urlib2實例代碼演示


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()

 

Python爬蟲網頁解析器簡介


 

網頁解析器:從網頁中提取有價值數據的工具。

功能:

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第三方模塊


BeautifulSoup官網:https://www.crummy.com/software/BeautifulSoup/

安裝BeautifulSoup:

若是你安裝了pip,那麼就簡單了,無需從官網下載,打開命令提示符頁面。

進入到Python安裝目錄下的Scripts文件夾路徑下,輸入「pip install beautifulsoup4」,便可進行自動安裝。

安裝完,在eclipse中進行測試,新建一個Python模塊,輸入:

import bs4
print bs4

輸出爲:

證實安裝成功。

 

BeautifulSoup的語法


 

其中搜索節點的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())

 

實戰演練:爬取百度百科1000個頁面的數據


1) 實例爬蟲操做步驟

2)Python爬蟲實例-分析目標

 

 

 

 

 

 

 本篇博客參考慕課網課程:https://www.imooc.com/video/10683

相關文章
相關標籤/搜索