Python 網(wǎng)絡(luò)爬蟲 學(xué)習(xí)筆記.CH3 采集數(shù)據(jù)

教材:《Web Scraping with Python——Collecting Data from the Modern Web》? 2015 by Ryan Mitchell


之所以叫網(wǎng)絡(luò)爬蟲(Web crawler)攻礼,是因?yàn)樗鼈兛梢匝刂W(wǎng)絡(luò)爬行。本質(zhì)就是一種遞歸方式仅淑。為了找到 URL 鏈接,爬蟲必須首先獲取網(wǎng)頁(yè)內(nèi)容丸冕,檢查這個(gè)頁(yè)面的內(nèi)容油额,再尋找另一個(gè) URL逞泄,然后獲取 URL 對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容担租,不斷循環(huán)這一過程。

提取頁(yè)面鏈接:

from urllib.request import urlopen

from bs4 import BeautifulSoup


html = urlopen("http://en.wikipedia.org/wiki/Kevin_Bacon")

bsObj = BeautifulSoup(html)

for link in bsObj.findAll("a"):

? ? if 'href' in link.attrs:

? ? print(link.attrs['href'])

過濾多余的連接:

以僅提取“詞條鏈接”為例鲫构,相比于“其他鏈接”浓恶,“詞條鏈接”:

? 都在 id 是 bodyContent 的 div 標(biāo)簽里?

? URL 鏈接不包含分號(hào)

? URL 鏈接都以 /wiki/ 開頭

——利用find()方法和正則表達(dá)式過濾“其他鏈接”:

from urllib.request import urlopen

from bs4 import BeautifulSoup

import datetime

import random

import re


random.seed(datetime.datetime.now())

def getLinks(articleUrl):

? ? html = urlopen("http://en.wikipedia.org"+articleUrl)

? ? bsObj = BeautifulSoup(html, "html.parser")

? ? return bsObj.find("div", {"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))

links = getLinks("/wiki/Kevin_Bacon")

while len(links) > 0:

? ? newArticle = links[random.randint(0, len(links)-1)].attrs["href"]

? ? print(newArticle)

links = getLinks(newArticle)

鏈接去重:

為了避免一個(gè)頁(yè)面被采集兩次,鏈接去重是非常重要的结笨。在代碼運(yùn)行時(shí)包晰,把已發(fā)現(xiàn)的所有鏈接都放到一起,并保存在方便查詢的列表里(下文示例指 Python 的集合 set 類型)炕吸。只有“新”鏈接才會(huì)被采集伐憾,之后再?gòu)捻?yè)面中搜索其他鏈接:

遍歷首頁(yè)上每個(gè)鏈接,并檢查是否已經(jīng)在全局變量集合 pages 里面了(已經(jīng)采集的頁(yè)面集合)算途。如果不在塞耕,就打印到屏幕上,并把鏈接加入pages 集合嘴瓤,再用 getLinks 遞歸地處理這個(gè)鏈接。

from urllib.request import urlopen

from bs4 import BeautifulSoup

import re


pages = set()

def getLinks(pageUrl):

global pages

html = urlopen("http://en.wikipedia.org"+pageUrl)

bsObj = BeautifulSoup(html)

for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):

if 'href' in link.attrs:

if link.attrs['href'] not in pages:

# we meet the new page

newPage = link.attrs['href']

print(newPage)

pages.add(newPage)

getLinks(newPage)

getLinks("")

收集整個(gè)網(wǎng)站數(shù)據(jù)的組合程序:

from urllib.request import urlopen

from bs4 import BeautifulSoup

import re

pages = set()

def getLinks(pageUrl):

global pages

html = urlopen("http://en.wikipedia.org"+pageUrl)

bsObj = BeautifulSoup(html, "html.parser")

try:

print(bsObj.h1.get_text())

print(bsObj.find(id ="mw-content-text").findAll("p")[0])

print(bsObj.find(id="ca-edit").find("span").find("a").attrs['href'])

except AttributeError:

print("This page is missing something! No worries though!")

for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):

if 'href' in link.attrs:

if link.attrs['href'] not in pages:

#We have encountered a new page

newPage = link.attrs['href']

print("----------------\n"+newPage)

pages.add(newPage)

getLinks(newPage)

getLinks("")

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莉钙,一起剝皮案震驚了整個(gè)濱河市廓脆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌磁玉,老刑警劉巖停忿,帶你破解...
    沈念sama閱讀 212,080評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚊伞,居然都是意外死亡席赂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門时迫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颅停,“玉大人,你說我怎么就攤上這事掠拳●啵” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵溺欧,是天一觀的道長(zhǎng)喊熟。 經(jīng)常有香客問我,道長(zhǎng)姐刁,這世上最難降的妖魔是什么芥牌? 我笑而不...
    開封第一講書人閱讀 56,554評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮聂使,結(jié)果婚禮上壁拉,老公的妹妹穿的比我還像新娘谬俄。我一直安慰自己,他們只是感情好扇商,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評(píng)論 6 386
  • 文/花漫 我一把揭開白布凤瘦。 她就那樣靜靜地躺著,像睡著了一般案铺。 火紅的嫁衣襯著肌膚如雪蔬芥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評(píng)論 1 290
  • 那天控汉,我揣著相機(jī)與錄音笔诵,去河邊找鬼。 笑死姑子,一個(gè)胖子當(dāng)著我的面吹牛乎婿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播街佑,決...
    沈念sama閱讀 39,014評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼谢翎,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了沐旨?” 一聲冷哼從身側(cè)響起森逮,我...
    開封第一講書人閱讀 37,752評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磁携,沒想到半個(gè)月后褒侧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谊迄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評(píng)論 2 327
  • 正文 我和宋清朗相戀三年闷供,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片统诺。...
    茶點(diǎn)故事閱讀 38,687評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歪脏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出篙议,到底是詐尸還是另有隱情唾糯,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評(píng)論 4 331
  • 正文 年R本政府宣布鬼贱,位于F島的核電站移怯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏这难。R本人自食惡果不足惜舟误,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姻乓。 院中可真熱鬧嵌溢,春花似錦眯牧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秧骑,卻和暖如春版确,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背乎折。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工绒疗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骂澄。 一個(gè)月前我還...
    沈念sama閱讀 46,406評(píng)論 2 360
  • 正文 我出身青樓吓蘑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坟冲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子磨镶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評(píng)論 2 349

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