Python開發(fā)簡單爬蟲(慕課網(wǎng)學(xué)習(xí)資料總結(jié))

本文是在慕課網(wǎng)學(xué)習(xí)Python簡單爬蟲后做以總結(jié)蝉绷。 視頻地址

一、簡單爬蟲架構(gòu)

簡單爬蟲架構(gòu)

運(yùn)行流程

運(yùn)行流程.png

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管理器功能.png
支持的功能
  • 添加新URL到待爬取集合中
  • 判斷待添加的URL是否在容器中
  • 判斷是否還有帶待爬取URL
  • 獲取待爬取URL
  • 將URL從待爬取移動到已爬取
實現(xiàn)方式
實現(xiàn)方式.png
  • 將待爬取的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:添加特殊情景的處理器


    不同情景.png

比如需要登錄才能訪問的網(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)樹


    DOM樹
Beautiful Soup
安裝:pip install beautifulsoup4
測試:import bs4
語法
BeautifulSoup語法.png
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ā)爬蟲的步驟


開發(fā)爬蟲步驟

爬取百度百科1000個頁面

baike_spider

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市耍攘,隨后出現(xiàn)的幾起案子榕栏,更是在濱河造成了極大的恐慌,老刑警劉巖蕾各,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扒磁,死亡現(xiàn)場離奇詭異,居然都是意外死亡式曲,警方通過查閱死者的電腦和手機(jī)妨托,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兰伤,你說我怎么就攤上這事内颗。” “怎么了医清?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵起暮,是天一觀的道長。 經(jīng)常有香客問我会烙,道長负懦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任柏腻,我火速辦了婚禮纸厉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘五嫂。我一直安慰自己颗品,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布沃缘。 她就那樣靜靜地躺著躯枢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪槐臀。 梳的紋絲不亂的頭發(fā)上锄蹂,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機(jī)與錄音水慨,去河邊找鬼得糜。 笑死,一個胖子當(dāng)著我的面吹牛晰洒,可吹牛的內(nèi)容都是我干的朝抖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼谍珊,長吁一口氣:“原來是場噩夢啊……” “哼治宣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起砌滞,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤炼七,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后布持,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陕悬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年题暖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡胧卤,死狀恐怖唯绍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情枝誊,我是刑警寧澤况芒,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站叶撒,受9級特大地震影響绝骚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜祠够,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一压汪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧古瓤,春花似錦止剖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绎速,卻和暖如春皮获,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朝氓。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工魔市, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赵哲。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓待德,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枫夺。 傳聞我的和親對象是個殘疾皇子将宪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容