python-爬蟲(chóng)基礎(chǔ)(慕課網(wǎng))

二.爬蟲(chóng)簡(jiǎn)介以及爬蟲(chóng)的技術(shù)價(jià)值

2-1:爬蟲(chóng)是什么?

爬蟲(chóng)是什么

2-2:爬蟲(chóng)技術(shù)的價(jià)值甚脉?

爬蟲(chóng)技術(shù)的價(jià)值

三.簡(jiǎn)單爬蟲(chóng)架構(gòu)

3-1:簡(jiǎn)單爬蟲(chóng)架構(gòu)

簡(jiǎn)單爬蟲(chóng)架構(gòu)

3-2:簡(jiǎn)單爬蟲(chóng)架構(gòu)的動(dòng)態(tài)運(yùn)行流程:

簡(jiǎn)單爬蟲(chóng)架構(gòu)的動(dòng)態(tài)運(yùn)行流程

四.URL管理器和實(shí)現(xiàn)方法

4-1 URL管理器

URL管理器

4-2 URL管理器的實(shí)現(xiàn)方式

URL管理器的實(shí)現(xiàn)方式

五.網(wǎng)頁(yè)下載器和urllib2模塊

5.1 網(wǎng)頁(yè)下載器簡(jiǎn)介

網(wǎng)頁(yè)下載器簡(jiǎn)介

5.2 urlib2下載器網(wǎng)頁(yè)的三種方式

1.urlopen() 直接打開(kāi)

import urllib2
#直接請(qǐng)求
response = urllib2.urlopen('http://www.baidu.com')
#獲取狀態(tài)碼将鸵,如果是200表示獲取成功
print response.getcode()
#獲取內(nèi)容
cont = response.read()

2.添加data,http header

import urlib2
#創(chuàng)建Request對(duì)象
request = urllib2.Request(url)

#添加數(shù)據(jù)
request.add_data('a','1')

#添加http的header,偽裝成瀏覽器登錄
request.add_header('User-Agent','Mozilla/5.0')

#發(fā)送請(qǐng)求獲取結(jié)果
response = urllib2.urlopen(request)

3.添加特殊情景的處理器

import urllib2,cookielib
#創(chuàng)建cookie容器
cj = cookielib.CookieJar()
# 創(chuàng)建1個(gè)opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
#給urllib2安裝opener
urllib2.install_opener(opener)
#使用帶有cookie的urllib2訪問(wèn)網(wǎng)頁(yè)
response = urllib2.urlopen("http://www.xxx.com")

六.**網(wǎng)頁(yè)解析器和BeautifulSoup第三方模塊 **

6-1:網(wǎng)頁(yè)解析器簡(jiǎn)介

網(wǎng)頁(yè)解析器
python的網(wǎng)頁(yè)解析器

6-2:BeautifulSoup模塊介紹和安裝

用于從HTML或XML中提取數(shù)據(jù)

BeautifulSoup的語(yǔ)法

6-3:BeautifulSoup的語(yǔ)法

語(yǔ)法
?例子

創(chuàng)建 BeautifulSoup對(duì)象:

6-4: BeautifulSoup實(shí)例測(cè)試

import re
from bs4 import BeautifulSoup

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little         sisters; and their names were
<a  class="sister" id="link1">Elsie</a>,
<a  class="sister" id="link2">Lacie</a> and
<a  class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""

soup = BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8')

print '獲取所有的鏈接'
links = soup.find_all('a') #查找所有標(biāo)簽為a的節(jié)點(diǎn)
for link in links:
print link.name,link['href'],link.get_text()

print '獲取lacie的鏈接'
link_node = soup.find('a',)#查找所有標(biāo)簽為a勉盅,且鏈接符合x(chóng)x的節(jié)點(diǎn)
print link_node.name, link_node['href'],link_node.get_text()

print '正則匹配'
link_node = soup.find('a',href = re.compile(r"ill"))#查找所有標(biāo)簽為a,且正則匹配的節(jié)點(diǎn)
print link_node.name, link_node['href'],link_node.get_text()

print '獲取p段落文字'
p_node = soup.find('p',class_ = "title") #查找所有標(biāo)簽為p顶掉,且class為title的節(jié)點(diǎn)
print p_node.name,link_node.get_text()
test_bs4.py

七.**實(shí)戰(zhàn)演練:爬取百度百科1000個(gè)頁(yè)面的數(shù)據(jù) **

7-1:爬蟲(chóng)實(shí)例-分析目標(biāo)

爬蟲(chóng)實(shí)例-分析目標(biāo)

審查元素


分析過(guò)程

7-2:調(diào)度程序:spider_main.py

#!/usr/bin/python
#-*- coding:utf-8 -*-
from baike_spider import url_manager
from baike_spider import html_downloader
from baike_spider import html_parser
from baike_spider import html_outputer


class SpiderMain(object):
    def __init__(self):
        self.urls = url_manager.UrlManager()
        self.downloader = html_downloader.HtmlDownloader()
        self.parser = html_parser.HtmlParser()
        self.outputer = html_outputer.HtmlOutputer()


    def craw(self, root_url):       #爬蟲(chóng)的調(diào)度程序
        count = 1       #記錄當(dāng)前爬去的是第幾個(gè)url
        self.urls.add_new_url(root_url)
        try:
            while self.urls.has_new_url():      #如果有新的url
                new_url = self.urls.get_new_url()       #獲取一個(gè)新的url
                print 'craw %d : %s ' % (count , new_url)       #輸出第幾個(gè)Url
                html_cont = self.downloader.download(new_url)       #下載Url
                new_urls,new_data = self.parser.parse(new_url,html_cont)     #調(diào)用解析器來(lái)解析頁(yè)面,傳入當(dāng)前url,和爬去的數(shù)據(jù)
                self.urls.add_new_urls(new_urls)      #解析出來(lái)的Url添加至url管理器
                self.outputer.collect_data(new_data)  #收集解析出來(lái)的data

                if count == 1000:
                    break

            count = count + 1
        except:
            print 'craw failed'   #異常處理

            self.outputer.output_html()  #輸出收集好的數(shù)據(jù)


if __name__=="__main__":
    root_url = "http://baike.baidu.com/view/21087.htm"
    obj_spider = SpiderMain()
    obj_spider.craw(root_url)

7-3:URL管理器:url_manager.py

#!/usr/bin/python
#-*- coding:utf-8 -*-

class UrlManager(object):   #需要維護(hù)2個(gè)列表:1.待爬取的列表 2,爬取過(guò)的列表
    def __init__(self):
        self.new_urls = set()
        self.old_urls = set()


    def add_new_url(self,url):      #向管理器中添加一個(gè)新的URL
        if url is None:
            return
        if url not in self.new_urls and url not in self.old_urls:
            self.new_urls.add(url)

    def add_new_urls(self,urls):   #批量添加
        if urls is None or len(urls) == 0:  #urls空或者數(shù)量為0
            return
        for url in urls:
            self.add_new_url(url)   #逐個(gè)添加

    def has_new_url(self):      #判斷管理器中是否有新的待爬取的url
        return len(self.new_urls) != 0

    def get_new_url(self):       #從url管理器中獲取一個(gè)新的待爬取的Url
        new_url = self.new_urls.pop()    #pop方法取出并移除一個(gè)
        self.old_urls.add(new_url)
        return new_url

7-4:HTML下載器:html_downloader.py

#!/usr/bin/python
#-*- coding:utf-8 -*-
import urllib2
class HtmlDownloader(object):  #對(duì)外提供一個(gè)下載的方法

    def download(self,url):
        if url is None:
            return  None

        response = urllib2.urlopen(url)

        if response.getcode() != 200:   #失敗時(shí)候
            return None

        return response.read()

7-5草娜;HTML解析器:html_parser.py

#!/usr/bin/python
#-*- coding:utf-8 -*-
import re
import urlparse

from bs4 import BeautifulSoup


class HtmlParser(object):   #傳入一個(gè)url,和數(shù)據(jù)  解析出新的url和數(shù)據(jù)

    def parse(self,page_url, html_cont):
        if page_url is None or html_cont is None:
            return

        soup = BeautifulSoup(html_cont, 'html.parser',from_encoding='utf-8')
    
        new_urls = self._get_new_urls(page_url, soup)
        new_data = self._get_new_data(page_url, soup)
    
        return new_urls,new_data

    def _get_new_urls(self, page_url, soup):  #獲取其他詞條的url
        new_urls = set()
        #正則需要匹配類似  /view/123.htm
        links = soup.find_all('a', href=re.compile(r"/view/\d+\.htm"))      #查找所有標(biāo)簽為a的節(jié)點(diǎn)
        for link in links:
            new_url = link['href']        #獲取新的鏈接
            new_full_url = urlparse.urljoin(page_url, new_url)  #拼接成完整的url
            new_urls.add(new_full_url)
        return new_urls

    def _get_new_data(self, page_url, soup):  #解析數(shù)據(jù)
        res_data = {}
        #url
        res_data['url'] = page_url

        #<dd class="lemmaWgt-lemmaTitle-title">  <h1>Python</h1>
        title_node = soup.find('dd', class_="lemmaWgt-lemmaTitle-title").find("h1")
        res_data['title'] = title_node.get_text()

        #<div class="lemma-summary" label-module="lemmaSummary">
        summary_node = soup.find('div', class_="lemma-summary")
        res_data['summary'] = summary_node.get_text()

        return res_data

7-6:HTML輸出器:html_outputer.py

#!/usr/bin/python
#-*- coding:utf-8 -*-

class HtmlOutputer(object):
    def __init__(self):
        self.datas = []  #列表

    def collect_data(self,data):
        if data is None:
            return
        self.datas.append(data)


    def output_html(self):
        fout = open('output.html','w')

        fout.write("<html>")
        fout.write("<head>")
        fout.write(' <meta charset="utf-8"> ')


        fout.write("</head>")
        fout.write("<body>")
        fout.write("<table>")

        #python默認(rèn)編碼 Ascii
       for data in self.datas:
            fout.write("<tr>")
            fout.write("<td>%s</td>" % data['url'])
            fout.write("<td>%s</td>" % data['title'].encode('utf-8'))
            fout.write("<td>%s</td>" % data['summary'].encode('utf-8'))
            fout.write("</tr>")

        fout.write("</table>")
        fout.write("</body>")
        fout.write("</html>")

        fout.close()

7-7:開(kāi)始運(yùn)行爬蟲(chóng)和爬取結(jié)果展示:output.html

PyCharm輸出
output.html效果

八:課程總結(jié)

課程總結(jié)-慕課網(wǎng)

ps:圖解講課的方式真的很贊~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市痒筒,隨后出現(xiàn)的幾起案子宰闰,更是在濱河造成了極大的恐慌茬贵,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件移袍,死亡現(xiàn)場(chǎng)離奇詭異解藻,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)咐容,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門舆逃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蚂维,“玉大人戳粒,你說(shuō)我怎么就攤上這事〕嫔叮” “怎么了蔚约?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涂籽。 經(jīng)常有香客問(wèn)我苹祟,道長(zhǎng),這世上最難降的妖魔是什么评雌? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任树枫,我火速辦了婚禮,結(jié)果婚禮上景东,老公的妹妹穿的比我還像新娘砂轻。我一直安慰自己,他們只是感情好斤吐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布搔涝。 她就那樣靜靜地躺著,像睡著了一般和措。 火紅的嫁衣襯著肌膚如雪庄呈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天派阱,我揣著相機(jī)與錄音诬留,去河邊找鬼。 笑死贫母,一個(gè)胖子當(dāng)著我的面吹牛文兑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播颁独,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼彩届,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了誓酒?” 一聲冷哼從身側(cè)響起樟蠕,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贮聂,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后寨辩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吓懈,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年靡狞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耻警。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甸怕,死狀恐怖甘穿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情梢杭,我是刑警寧澤温兼,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站武契,受9級(jí)特大地震影響募判,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜咒唆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一届垫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧全释,春花似錦装处、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至糟袁,卻和暖如春判族,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背项戴。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工形帮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人周叮。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓辩撑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仿耽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子合冀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • 聲明:本文講解的實(shí)戰(zhàn)內(nèi)容,均僅用于學(xué)習(xí)交流项贺,請(qǐng)勿用于任何商業(yè)用途君躺! 一峭判、前言 強(qiáng)烈建議:請(qǐng)?jiān)陔娔X的陪同下,閱讀本文...
    Bruce_Szh閱讀 12,685評(píng)論 6 28
  • Python爬蟲(chóng)入門(urllib+Beautifulsoup) 本文包括:1棕叫、爬蟲(chóng)簡(jiǎn)單介紹2林螃、爬蟲(chóng)架構(gòu)三大模塊3...
    廖少少閱讀 9,798評(píng)論 0 6
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)俺泣,斷路器疗认,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 我是一個(gè)善良的人横漏, 我也是個(gè)軟弱的人, 每次看見(jiàn)流浪狗從我跟前溜過(guò)贝润, 我只能心里生出一種悲涼和憐憫绊茧, 然后走掉铝宵, ...
    醋醋嗎閱讀 1,059評(píng)論 0 2
  • 我的思維凌亂的打掘,那一刻決定說(shuō)走就走。 喜歡把幻想灌入生活鹏秋,讓下一條路變得跟迷一樣尊蚁。25小時(shí)的金門距離,我不聞問(wèn)規(guī)劃...
    在飛FSW閱讀 573評(píng)論 0 2