Python網(wǎng)絡(luò)數(shù)據(jù)采集2-wikipedia

Python網(wǎng)絡(luò)數(shù)據(jù)采集2-wikipedia

隨機鏈接跳轉(zhuǎn)

獲取維基百科的詞條超鏈接鹰贵,并隨機跳轉(zhuǎn)】导危可能側(cè)邊欄和低欄會有其他鏈接碉输。這不是我們想要的,所以定位到正文亭珍。正文在idbodyContentdiv標(biāo)簽里腊瑟。

import random
import re
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/52.0.2743.116 Safari/537.36 Edge/15.16193'}

start_url = '/wiki/Wiki'


def get_links(url):
    r = requests.get('https://en.wikipedia.org' + url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    # /wiki/some_words
    link_list = soup.find('div', id='bodyContent').find_all('a', href=re.compile(r'^/wiki/[^/]*$'))
    return link_list


links = get_links(start_url)
while len(links) > 0:
    # 隨機選擇一個鏈接
    link = random.choice(links).get('href')
    print(link)
    # 新的詞條覆蓋了原來的超鏈接,一直搜尋
    links = get_links(link)
/wiki/Personal_wiki
/wiki/Database_management_system
/wiki/Netezza
/wiki/C%2B%2B
/wiki/C%2B%2B#Standardization
/wiki/ISO_9984
/wiki/Georgian_script
...

從首頁開始块蚌,將首頁的所有詞條放入集合中(去重)闰非,再遍歷集合,從集合中的鏈接遞歸搜索峭范。

import re
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/52.0.2743.116 Safari/537.36 Edge/15.16193'}

pages = set()


def get_links(url):
    global pages
    r = requests.get('https://en.wikipedia.org' + url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    # /wiki/some_words
    link_list = soup.find('div', id='bodyContent').find_all('a', href=re.compile(r'^/wiki/[^:/]*$'))
    for link in link_list:
        if link['href'] not in pages:
            new_page = link['href']
            pages.add(new_page)
            print(new_page)
            get_links(new_page)


if __name__ == '__main__':
    # 空字符串表示财松,url為wiki主頁https://en.wikipedia.org
    get_links('')

獲取詞條的標(biāo)題、正文

標(biāo)題在h1標(biāo)簽中纱控,正文在id為mw-content-text的div標(biāo)簽中辆毡。

import re
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/52.0.2743.116 Safari/537.36 Edge/15.16193'}

pages = set()


def get_links(url):
    global pages
    r = requests.get('https://en.wikipedia.org' + url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    # /wiki/some_words
    try:
        print(soup.h1.string)
        # 只打印第一段
        print(soup.find(id='mw-content-text').find('p').text)
    except AttributeError:
        print('頁面缺少一些屬性。')

    link_list = soup.find('div', id='bodyContent').find_all('a', href=re.compile(r'^/wiki/[^:/]*$'))
    for link in link_list:
        if link['href'] not in pages:
            new_page = link['href']
            pages.add(new_page)
            print('----------\n' + new_page)
            get_links(new_page)


if __name__ == '__main__':
    # 空字符串表示甜害,url為wiki主頁https://en.wikipedia.org
    get_links('')
Main Page
Noye's Fludde is a one-act opera written largely for young amateur performers, created by the British composer Benjamin Britten. First performed in 1958 at the annual Aldeburgh Festival, it is based on the 15th-century Chester "mystery" play which recounts the biblical story of Noah, the flood and the ark. Britten had written numerous works for mixed 
...
--------
/wiki/Wikipedia
Wikipedia
Wikipedia (/?w?k??pi?di?/ ( listen) or /?w?ki?pi?di?/ ( listen) WIK-i-PEE-dee-?) is a free online encyclopedia with the aim to allow anyone to edit articles.[3] Wikipedia is the largest and most popular general reference work on the Internet[4][5][6] and is ranked among the ten most popular websites.[7] Wikipedia is owned by the nonprofit Wikimedia Foundation.[8][9][10]
--------
/wiki/Main_Page
...

尋找外鏈

https://www.oreilly.com開始不斷尋找外鏈舶掖,如果某個頁面沒有外鏈,則進入該頁面的某個內(nèi)鏈尔店,再重新找外鏈眨攘。感覺這個例子不是很好主慰,因為從其他外鏈又可能回到初始頁面。

import re
import random
import requests
from bs4 import BeautifulSoup

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/52.0.2743.116 Safari/537.36 Edge/15.16193'}


def get_random_external_link(start_page):
    r = requests.get(start_page, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    # 返回分割地址的第一個元素鲫售,一般是主頁的地址
    ex_links = get_external_links(soup, split_address(start_page)[0])
    # 如果該頁面沒有外鏈共螺,則獲取內(nèi)鏈,再從內(nèi)鏈里隨機選取一個,遞歸情竹,直到獲取到外鏈為止藐不。
    if len(ex_links) == 0:
        internal_links = get_internal_links(soup, split_address(start_page)[0])
        return get_random_external_link(random.choice(internal_links))
    else:
        return random.choice(ex_links)


def get_internal_links(bs, include_url):
    internal_links = []
    # 找出所有以為'/'開頭的鏈接,此為內(nèi)鏈
    in_links = bs.find_all('a', href=re.compile(r'^/|' + include_url))
    for link in in_links:
        if link['href'] not in internal_links:
            internal_links.append(link['href'])

    return internal_links


def get_external_links(bs, exclude_url):
    external_links = []
    # 找出所有以http秦效、https開頭的鏈接雏蛮,且不含內(nèi)鏈字符的,此為外鏈,(?!...)表示不包含
    ex_links = bs.find_all('a', href=re.compile(r'^(https|http)((?!' + exclude_url + ').)*$'))
    for link in ex_links:
        if link['href'] not in external_links:
            external_links.append(link['href'])

    return external_links

 
def split_address(address):
    address_parts = []

    if address.split(':')[0] == 'http':
        address_parts = address.replace('http://', '').split('/')
    elif address.split(':')[0] == 'https':
        address_parts = address.replace('https://', '').split('/')

    return address_parts


# 只搜索外鏈
def follow_external_only(url):
    external_link = get_random_external_link(url)
    print(external_link)
    follow_external_only(external_link)


all_ex_links = set()
all_in_links = set()

# 獲得所有外鏈和內(nèi)鏈阱州,并打印了外鏈
def get_all_external_links(url):
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    internal_links = get_internal_links(soup, split_address(url)[0])
    external_links = get_external_links(soup, split_address(url)[0])
    for link in external_links:
        if link not in all_ex_links:
            all_ex_links.add(link)
            print(link)

    for link in internal_links:
        if link not in all_in_links:
            all_in_links.add(link)
            get_all_external_links(link)


if __name__ == '__main__':
    # follow_external_only('https://www.oreilly.com')
    get_all_external_links('https://www.oreilly.com')
https://www.safaribooksonline.com/?utm_medium=content&utm_source=oreilly.com&utm_campaign=lgen&utm_content=20170601+nav
http://shop.oreilly.com/
http://members.oreilly.com
https://www.safaribooksonline.com/?utm_medium=content&utm_source=oreilly.com&utm_campaign=lgen&utm_content=20170505+homepage+get+started+now
https://www.safaribooksonline.com/accounts/login/?utm_medium=content&utm_source=oreilly.com&utm_campaign=lgen&utm_content=20170203+homepage+sign+in
https://www.safaribooksonline.com/?utm_medium=content&utm_source=oreilly.com&utm_campaign=lgen&utm_content=20170710+homepage+get+started+now
https://www.safaribooksonline.com/public/free-trial/?utm_medium=content&utm_source=oreilly.com&utm_campaign=lgen&utm_content=20170710+homepage+start+free+trial
https://www.safaribooksonline.com/accounts/login/?utm_medium=content&utm_source=oreilly.com&utm_campaign=lgen&utm_content=20170710+homepage+sign+in
...

上面的代碼經(jīng)常會出錯底扳,可能是正則表達式匹配的原因,也有可能是網(wǎng)絡(luò)原因贡耽。


by @sunhaiyu

2017.7.14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鹊汛,隨后出現(xiàn)的幾起案子蒲赂,更是在濱河造成了極大的恐慌,老刑警劉巖刁憋,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滥嘴,死亡現(xiàn)場離奇詭異,居然都是意外死亡至耻,警方通過查閱死者的電腦和手機若皱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尘颓,“玉大人走触,你說我怎么就攤上這事“唐唬” “怎么了互广?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卧土。 經(jīng)常有香客問我惫皱,道長,這世上最難降的妖魔是什么尤莺? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任旅敷,我火速辦了婚禮,結(jié)果婚禮上颤霎,老公的妹妹穿的比我還像新娘媳谁。我一直安慰自己涂滴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布韩脑。 她就那樣靜靜地躺著氢妈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪段多。 梳的紋絲不亂的頭發(fā)上首量,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音进苍,去河邊找鬼加缘。 笑死,一個胖子當(dāng)著我的面吹牛觉啊,可吹牛的內(nèi)容都是我干的拣宏。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼杠人,長吁一口氣:“原來是場噩夢啊……” “哼勋乾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嗡善,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤辑莫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罩引,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體各吨,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年袁铐,在試婚紗的時候發(fā)現(xiàn)自己被綠了揭蜒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡剔桨,死狀恐怖屉更,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洒缀,我是刑警寧澤偶垮,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站帝洪,受9級特大地震影響似舵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜葱峡,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一砚哗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧砰奕,春花似錦蛛芥、人聲如沸提鸟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽称勋。三九已至,卻和暖如春涯竟,著一層夾襖步出監(jiān)牢的瞬間赡鲜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工庐船, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留银酬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓筐钟,卻偏偏與公主長得像揩瞪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子篓冲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,737評論 25 707
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案李破? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補...
    _Yfling閱讀 13,734評論 1 92
  • 聲明:本文講解的實戰(zhàn)內(nèi)容,均僅用于學(xué)習(xí)交流壹将,請勿用于任何商業(yè)用途嗤攻! 一、前言 強烈建議:請在電腦的陪同下瞭恰,閱讀本文...
    Bruce_Szh閱讀 12,682評論 6 28
  • 終 于,在來到深圳的第四個月里狱庇,迎來了你即將離開的消息惊畏。知道你要離開了,心里很悵然密任,不是為了我們畢業(yè)之后沒有真正在...
    洛洛莉ya閱讀 16,701評論 3 17
  • 領(lǐng)導(dǎo)人應(yīng)該去學(xué)習(xí)唐僧颜启,用人用長處,管人管到位
    逐味跡的伙伴們閱讀 229評論 0 1