本文是在慕課網(wǎng)學(xué)習(xí)Python簡單爬蟲后做以總結(jié)蝉绷。 視頻地址
一、簡單爬蟲架構(gòu)
運(yùn)行流程
1枣抱、調(diào)度器詢問URL管理器熔吗,是否有待爬URL?URL管理器返回是/否佳晶;
2桅狠、如果是,調(diào)度器會從URL管理器中取出一個待爬URL轿秧;
3中跌、調(diào)度器將URL傳給下載器,下載網(wǎng)頁內(nèi)容后返回給調(diào)度器菇篡;
4漩符、調(diào)度器再將返回的網(wǎng)頁內(nèi)容發(fā)送到解析器,解析URL內(nèi)容驱还,解析完成后返回有價值的數(shù)據(jù)和新的URL嗜暴;
5、一方面铝侵,調(diào)度器將數(shù)據(jù)傳遞給應(yīng)用進(jìn)行數(shù)據(jù)的收集灼伤;另一方面,會將新的URL補(bǔ)充進(jìn)URL管理器咪鲜,若有URL管理器中含有新的URL,則重復(fù)上述步驟撞鹉,直到爬取完所有的URL
6疟丙、最后,調(diào)度器會調(diào)動應(yīng)用的方法鸟雏,將價值數(shù)據(jù)輸出到需要的格式享郊。
二、URL管理器和實現(xiàn)方法
管理帶抓取URL集合和已抓取URL集合
防止重復(fù)抓取孝鹊、防止循環(huán)抓取
支持的功能
- 添加新URL到待爬取集合中
- 判斷待添加的URL是否在容器中
- 判斷是否還有帶待爬取URL
- 獲取待爬取URL
- 將URL從待爬取移動到已爬取
實現(xiàn)方式
- 將待爬取的URL和已爬取的URL存放在內(nèi)容中炊琉。
- 將URL存放在關(guān)系型數(shù)據(jù)中
- 將URL存儲在緩存數(shù)據(jù)庫中
三、網(wǎng)頁下載器和urllib2模塊
將互聯(lián)網(wǎng)上URL對應(yīng)的網(wǎng)頁下載到本地的工具
網(wǎng)頁下載器類似于瀏覽器,會將互聯(lián)網(wǎng)對應(yīng)的網(wǎng)頁以HTML的形式下載到本地苔咪,存儲成本地文件或內(nèi)存字符串锰悼,然后進(jìn)行后續(xù)的分析。
Python的網(wǎng)頁下載器
- urllib2 (Python3以后將urllib2替換為urllib.request)
- requests
urllib2
- 方法1:給定url团赏,使用urllib2模塊的urlopen方法箕般。
import urllib2
# 直接請求
response = urllib2.urlopen('http://www.baidu.com')
# 獲取狀態(tài)碼,如果是200表示獲取成功
print response舔清。getcode()
# 讀取內(nèi)容
cont = response.read()
-
方法2:添加data丝里,http header
向服務(wù)器提交http的頭信息,形成一個data体谒,可以向服務(wù)器提交需要用戶輸入的數(shù)據(jù)杯聚。
import urllib2
# 創(chuàng)建Request對象
request = urllib2.Request(url)
# 添加數(shù)據(jù)
request.add_data('a', '1')
# 添加http的header,將爬蟲偽裝成一個Mozilla瀏覽器
request.add_header('User-Agent', 'Mozilla/5.0')
# 發(fā)送請求獲取結(jié)果
response = urllib2.urlopen(request)
-
方法3:添加特殊情景的處理器
比如需要登錄才能訪問的網(wǎng)頁抒痒,要添加cookie的處理幌绍。使用HTTPCookieProcessor;
需要代理才能訪問的網(wǎng)頁使用ProxyHandler评汰;
需要HTTPS加密訪問的網(wǎng)站使用HTTPSHandler纷捞;
有些URL存在相互自動跳轉(zhuǎn)的關(guān)系使用HTTPRedirectHandler進(jìn)行處理。
將這些Handler傳送給urllib2的build_opener方法創(chuàng)建一個opener對象被去,再傳給urllib2的install_opener方法主儡,urllib2這個模塊就具備了進(jìn)行特殊情景處理的能力。
import urllib2惨缆, cookielib
# 創(chuàng)建cookie容器
cj = cookielib.CookieJar()
# 創(chuàng)建1個opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# 給urllib2安裝opener
urllib2.install_opener(opener)
# 使用帶有cookie的urllib2訪問網(wǎng)頁
response = urllib2.urlopen('http://www.baidu.com/')
四糜值、網(wǎng)頁解析器和BeautifulSoup
從網(wǎng)頁中提取有價值數(shù)據(jù)的工具
網(wǎng)頁解析器從HTML網(wǎng)頁字符串中提取出價值數(shù)據(jù)和新URL對象。
Python網(wǎng)頁解析器
- 正則表達(dá)式
- html.parser
- Beautiful Soup
-
lxml
后面三種是以結(jié)構(gòu)化解析的方式進(jìn)行解析DOM(Document Object Model)樹
Beautiful Soup
- Python第三方庫坯墨,用于從HTML或XML中提取數(shù)據(jù)
- 官網(wǎng):https://www.crummy.com/software/BeautifulSoup/
- 中文文檔:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html
安裝測試
安裝:pip install beautifulsoup4
測試:import bs4
語法
from bs4 import BeautifulSoup
# 根據(jù)HTML網(wǎng)頁字符串創(chuàng)建BeautifulSoup對象
soup = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8')
# 搜索節(jié)點(diǎn) 查找所有標(biāo)簽為a的節(jié)點(diǎn)
soup.find_all('a')
# 查找所有標(biāo)簽為a寂汇,連接符合/view/123.html形式的節(jié)點(diǎn)
soup.find_all('a', href='/view/123.html')
soup.find_all('a', href=re.compile(r'/view/\d+\.html'))
# 查找所有標(biāo)簽為div,class為abc捣染,文字為Python的節(jié)點(diǎn)
soup.find_all('div', class_='abc', string='Python')
訪問節(jié)點(diǎn)信息
# 得到節(jié)點(diǎn):<a href='1.html'>Python</a>
# 獲取查找到的節(jié)點(diǎn)的標(biāo)簽名稱
node.name
# 獲取查找到的a節(jié)點(diǎn)的href屬性
node['href']
# 獲取查找到的a節(jié)點(diǎn)的鏈接文字
node.get_text()
五骄瓣、實戰(zhàn)練習(xí)
開發(fā)爬蟲的步驟