Python爬蟲:流程框架和常用模組
一、簡單爬蟲架構
首先學習爬蟲之前呢,要知道爬蟲的一個基本架構,也就是寫程式碼得有層次結構吧?不然擠牙膏麼?
爬蟲排程器 -> URL管理器 -> 網頁下載器() -> 網頁解析器() -> 價值資料
其中最重要地方,莫過於三君子-管理,下載,解析器。
這就是個初代版本的簡單爬蟲架構,一個基本的架構。
二、執行流程
實際上對於一些有開發基礎的人來看,這個東西已經一目瞭然了,具體內容我不說了。
具體過程:(細品,你細品~)
1、排程器詢問URL管理器,是否有待爬URL?URL管理器返回是/否?
2、如果是,排程器會從URL管理器中取出一個待爬URL;
3、排程器將URL傳給下載器,下載網頁內容後返回給排程器;
4、排程器再將返回的網頁內容傳送到解析器,解析URL內容,解析完成後返回有價值的資料和新的URL;
5、一方面,排程器將資料傳遞給應用進行資料的收集;另一方面,會將新的URL補充進URL管理器,若有URL管理器中含有新的URL,則重複上述步驟,直到爬取完所有的URL
6、最後,排程器會調動應用的方法,將價值資料輸出到需要的格式。
三、URL管理器和實現方法
定義:管理帶抓取URL集合和已抓取URL集合,
作用:防止重複抓取、防止迴圈抓取
URL管理器功能:
支援的功能
新增新URL到待爬取集合中
判斷待新增的URL是否在容器中
判斷是否還有帶待爬取URL
獲取待爬取URL
將URL從待爬取移動到已爬取
實現方式
1、適合個人的:記憶體(計算機或伺服器記憶體)
2、小型企業或個人:關聯式資料庫(永久儲存或記憶體不夠用,如 MySQL)
3、大型網際網路公司:快取資料庫(高效能,如支援 set() 的 redis)
四、網頁下載器和urllib2模組
將網際網路上URL對應的網頁下載到本地的工具。
作用:網頁下載器類似於瀏覽器,會將網際網路對應的網頁以HTML的形式下載到本地,儲存成本地檔案或記憶體字串,然後進行後續的分析。
Python的網頁下載器種類
urllib / urllib2 (Python官方提供的基礎模組)
requests(第三方外掛,提供更為強大的功能)
(注意:python 3.x 以上版本把urllib2 和 urllib 整合到一起。所以引入模組變成一個,只有 import urllib,以後你在python2中看到的urllib2在python3中用urllib.request替換~ )
舉例:
#py2 import urllib2 response = urllib2.urlopen(url) # 報錯NameError: name 'urllib2' is not defined,要改為 # py3 import urllib.request response = urllib.request.urlopen(url)
個人覺得Urllib庫不好用,requests庫更好用。
urllib2抓取網頁的三種方法(以後用requests)
當然,雖然urllib2用的要少一些了,但是還是要了解一下的
方法1:給定url,使用urllib 模組的urlopen方法獲取網頁內容
舉例:
這裡我用的python3.x版本的urllib庫。
get請求:傳送一個GET請求到指定的頁面,然後返回HTTP的響應。
from urllib import request print('第一種方法get請求') url = '' # 直接請求 response = request.urlopen(url) # 獲取狀態碼,如果是200表示成功 print(response.status) # 讀取網頁內容 print(response.read().decode('utf-8')
因為read獲取到的byte編碼,改為decode(‘utf-8’)。
方法2:新增data,http header
模擬瀏覽器傳送GET請求,就需要使用Request物件,透過往Request物件新增HTTP頭,我們就可以把請求偽裝成瀏覽器進行訪問:
User-Agent 有些 Server 或 Proxy 會檢查該值,用來判斷是否是瀏覽器發起的 Request .Content-Type
在使用 REST 介面時,Server 會檢查該值,用來確定 HTTP Body 中的內容該怎樣解析。
新增頭資訊舉例:
import urllib2 print "第二種方法" from urllib import request req = request.Request('') req.add_header('User-Agent', 'Mozilla/6.0') response = request.urlopen(req) # 獲取狀態碼,如果是200表示成功 print(response.status) # 讀取網頁內容 print(response.read().decode('utf-8'))
方法3:新增特殊情景的處理器
模擬瀏覽器傳送POST請求。
需要登入才能訪問的網頁,要新增cookie的處理。使用HTTPCookieProcessor;
需要代理才能訪問的網頁使用ProxyHandler;
需要HTTPS加密訪問的網站使用HTTPSHandler;
有些URL存在相互自動跳轉的關係使用HTTPRedirectHandler進行處理。
圖示:
HTTPCookieProcessor的使用:
cookie中儲存中我們常見的登入資訊,有時候爬取網站需要攜帶cookie資訊訪問,這裡用到了http.cookijar,用於獲取cookie以及儲存cookie,同時cookie可以寫入到檔案中儲存,一般有兩種方式http.cookiejar.MozillaCookieJar和http.cookiejar.LWPCookieJar()。
舉例:
import urllib2, cookielib print "第三種方法" # 建立cookie容器 cj = cookielib.CookieJar() # 建立1個opener opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) # 給urllib2安裝opener urllib2.install_opener(opener) # 使用帶有cookie的urllib2訪問網頁 response = urllib2.urlopen('/')
上面都是對urllib2模組來寫的,但是實戰中往往用requests,這個放到後面文章來說。
注意: python3用cookielib 模組改名為 http.cookiejar,帶cookie的列印出來必須用opener.open(req).read().decode(‘utf-8’)來傳送的請求才會帶上cookie,如果用urllib.request.urlopen()是不帶cookie的。
ProxyHandler代理的使用:
網站它會檢測某一段時間某個IP 的訪問次數,如果訪問次數過多,它會禁止你的訪問,所以這個時候需要透過設定代理來爬取資料
import urllib.request url = '' proxy_handler = urllib.request.ProxyHandler({ #代理伺服器IP地址 'http': '', 'https': '' }) opener = urllib.request.build_opener(proxy_handler) response = opener.open(url) # 獲取狀態碼,如果是200表示成功 print(response.status) # 讀取網頁內容 print(response.read().decode('utf-8'))
四、網頁解析器和使用
網頁解析器從HTML網頁字串中提取出價值資料和新URL物件
Python網頁解析器種類
正規表示式(re模糊匹配)
html.parser (Python自帶)
BeautifulSoup (第三方外掛)
lxml (第三方解析器)
後面三種是以結構化解析的方式進行解析DOM(Document Object Model)樹,
【也就是按照html的節點路徑一級一級來解析的。】
下面挨個介紹一下最常用的兩個。
常用的BeautifulSoup介紹!!!
bs4主要使用find()方法和find_all()方法來搜尋文件。
find()用來搜尋單一資料,find_all()用來搜尋多個資料。
它是Python第三方庫,用於從HTML或XML中提取資料
官網:
中文文件:bs4/doc/index.zh.html
需要安裝和測試:
方法一,在cmd視窗中:
安裝:pip install beautifulsoup4 測試:import bs4
方法2:在pycharm中:File–settings–Project Interpreter–新增beautifulsoup4(簡寫bs4)
語法:
舉個例子:
from bs4 import BeautifulSoup # 根據HTML網頁字串建立BeautifulSoup物件 soup = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8') # 搜尋節點 查詢所有標籤為a的節點 soup.find_all('a') # 查詢所有標籤為a,連線符合/view/123.html形式的節點 soup.find_all('a', href='/view/123.html') soup.find_all('a', href=re.compile(r'/view/d+.html')) # 查詢所有標籤為div,class為abc,文字為Python的節點 soup.find_all('div', class_='abc', string='Python')
訪問節點資訊
# 舉例節點:<a href='1.html'>Python</a> # 獲取查詢到的節點的標籤名稱 node.name # 獲取查詢到的a節點的href屬性 node['href'] # 獲取查詢到的a節點的連結文字 node.get_text()
上面就是bs4在解析模組的相關使用,更多方式檢視官方文件即可。
常用的lxml介紹
Xpath是一門在XML文件中查詢資訊的語言。Xpath可用來在XML文件中對元素和屬性進行遍歷。Xpath是W3C XSLT標準的主要元素,並且XQuery和XPointer都構建於XPath表達之上。
安裝:
pip install lxml
語法:
選取節點
XPath 使用路徑表示式在 XML 文件中選取節點。節點是透過沿著路徑或者 step 來選取的。
在使用 xpath之前,先匯入 etree類,對原始的 html頁面進行處理獲得一個_Element物件。
舉個例子:
#匯入 etree類 from lxml import etree # html文字 html = '''<div class="container"> <div class="row"> <div class="col"> <div class="card"> <div class="card-content"> <a href="#123333" class="box"> 好麻煩喲!!!~~~ </a> </div> </div> </div> </div> </div>''' #對 html文字進行處理 獲得一個_Element物件 dom = etree.HTML(html) #獲取 a標籤下的文字 a_text = dom.xpath('//div/div/div/div/div/a/text()') print(a_text)
我們透過 etree.HTML( )來生成一個_Element物件,etree.HTML() 會將傳入的文字處理成一個 html文件節點。這樣就能保證我們總是能獲得一個包含文件節點的_Element物件。
眾多影片,盡在python學習網,歡迎線上學習!
本文轉自:https://blog.csdn.net/ITBigGod/article/details/102859854
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3209/viewspace-2835363/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 常用python爬蟲框架整理Python爬蟲框架
- 什麼是Python爬蟲?Python爬蟲常用框架有哪些?Python爬蟲框架
- Python中爬蟲框架或模組的區別!Python爬蟲框架
- Python中爬蟲框架或模組的區別Python爬蟲框架
- Python爬蟲是什麼?常用框架有哪些?Python爬蟲框架
- python爬蟲requests模組Python爬蟲
- python爬蟲Scrapy框架Python爬蟲框架
- Python爬蟲—Scrapy框架Python爬蟲框架
- Python爬蟲之路-lxml模組Python爬蟲XML
- 網路爬蟲開發常用框架爬蟲框架
- 什麼是爬蟲?Python爬蟲框架有哪些?爬蟲Python框架
- 使用 nodejs 寫爬蟲(一): 常用模組和 js 語法NodeJS爬蟲
- 常見python爬蟲框架Python爬蟲框架
- python爬蟲需要什麼模組Python爬蟲
- Python爬蟲之路-jsonpath模組Python爬蟲JSON
- python網路爬蟲(14)使用Scrapy搭建爬蟲框架Python爬蟲框架
- Python爬蟲教程-30-Scrapy 爬蟲框架介紹Python爬蟲框架
- Python爬蟲入門,8個常用爬蟲技巧盤點Python爬蟲
- Python爬蟲:一些常用的爬蟲技巧總結Python爬蟲
- 什麼是爬蟲?Python爬蟲的工作流程怎樣?爬蟲Python
- Python爬蟲教程-31-建立 Scrapy 爬蟲框架專案Python爬蟲框架
- Python微型非同步爬蟲框架Python非同步爬蟲框架
- Python scrapy爬蟲框架簡介Python爬蟲框架
- Python爬蟲教程-09-error 模組Python爬蟲Error
- 爬蟲——Requests模組爬蟲
- 爬蟲-Requests模組爬蟲
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- 使用 nodejs 寫爬蟲(-): 常用模組介紹和前置JS語法NodeJS爬蟲
- 小白學python-爬蟲常用庫Python爬蟲
- 常用的 Python 爬蟲技巧總結Python爬蟲
- 2個月精通Python爬蟲——3大爬蟲框架+6場實戰+反爬蟲技巧+分散式爬蟲Python爬蟲框架分散式
- Python案例學習——模組和包、爬蟲的基礎概念Python爬蟲
- 【python爬蟲】python爬蟲demoPython爬蟲
- Python網路爬蟲(六) Scrapy框架Python爬蟲框架
- Python 爬蟲 (六) -- Scrapy 框架學習Python爬蟲框架
- 10個高效的Python爬蟲框架Python爬蟲框架
- Python3爬蟲實戰(requests模組)Python爬蟲
- 帶你入門Python爬蟲,8個常用爬蟲技巧盤點Python爬蟲