Python爬蟲--真實(shí)世界的網(wǎng)頁解析

用Requests + BeautifulSoup 爬取Tripadvistor

爬取一個(gè)網(wǎng)頁需要兩步:
1.服務(wù)器與本地的接交換機(jī)制
2.解析真實(shí)網(wǎng)頁的方法

1.服務(wù)器與本地的交換機(jī)制

瀏覽網(wǎng)頁的過程是通過瀏覽器向網(wǎng)站所在的服務(wù)器發(fā)送一個(gè)Request萎坷,同時(shí)服務(wù)器回應(yīng)一個(gè)Response叉信,這就是一個(gè)簡單的HTTP協(xié)議吐辙。
每一個(gè)Request請求包括很多種方法帜平,目前(HTTP2.0)的方法有:get嗅钻、posthead恶耽、put衅鹿、optionsconnect塞颁、trace浦箱、delete,這八種方法吸耿。 GET和POST是最常用的兩種方法。
爬蟲抓取一個(gè)網(wǎng)頁酷窥,實(shí)質(zhì)上就是模擬這兩種方法咽安。

GET/page_one.html HTTP/1.1 Host:www.sample.com
以上是一個(gè)簡單的get方法發(fā)送的請求方式,可以看出請求得到的信息包括頁面的內(nèi)容蓬推,協(xié)議的版本信息妆棒,以及網(wǎng)頁的主域名。

一個(gè)正常打開的頁面沸伏,返回的狀態(tài)碼應(yīng)該是200糕珊,無法打開的頁面一般返回403或者404

2.爬取Tripadvisor頁面信息

爬取頁面信息的步驟:
1.導(dǎo)入所需要的庫
2.使用requests請求要爬取的網(wǎng)頁
3.解析網(wǎng)頁
4.描述要爬取的元素位置

#_*_ coding:utf-8 _*_


from bs4 import BeautifulSoup
import requests
import time


# part1
'''
url = 'http://www.tripadvisor.cn/Attractions-g60763-Activities-New_York_City_New_York.html'
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text, 'lxml')
# 1.描述要爬取元素的位置
# Copy一下title的selector毅糟,測試一下結(jié)果
# titles = soup.select('#ATTR_ENTRY_105127 > div.property_title > a')
# print titles
# 打開原網(wǎng)頁红选,查找title的父標(biāo)簽樣式,發(fā)現(xiàn)在每一個(gè)<div class="property_title">下面的<a>標(biāo)簽中的內(nèi)容就是title
# 那么更新一下titte的解析語句
titles = soup.select('div.property_title > a[target="_blank"]')

# 2.篩選所需要的元素
# 頁面中存在的圖片不一定全是所需要的姆另,可以根據(jù)圖片的屬性(大欣摺)對圖片進(jìn)行篩選
imgs = soup.select('img[width="160"]')

# 對其他的元素進(jìn)行篩選
# tags一般是多對一的關(guān)系,所以在tags的父類標(biāo)簽進(jìn)行篩選
cates = soup.select('div.p13n_reasoning_v2')

# 3.整理并篩選所需信息

for title, img, cate in zip(titles, imgs, cates):
    data = {
        'title': title.get_text(),
        'img': img.get('src'),
        'cate':list(cate.stripped_strings)
    }
    print data,'\n*************************************\n'
# 運(yùn)行上述代碼后發(fā)現(xiàn)迹辐,爬取的圖片鏈接是一樣的蝶防,也就意味著圖片信息沒有爬取下來
# 這是由于站點(diǎn)的反爬蟲機(jī)制造成的,站點(diǎn)的圖片加載是通過JavaScript控制的明吩,暫時(shí)先不用管這些

# 4.使爬蟲為登錄站點(diǎn)的狀態(tài)间学,構(gòu)造向服務(wù)器提交的參數(shù):headers
# 重新完成一個(gè)爬蟲代碼
'''

# part2
'''
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36',
    'Cookie':'__utma=55896302.1244431692.1455603774.1455603774.1455603774.1; __utmc=55896302; =',

}
url_saves = 'http://www.tripadvisor.cn/Saves#207971'
wb_data = requests.get(url_saves, headers=headers)
soup = BeautifulSoup(wb_data.text, 'lxml')

titles = soup.select('a.location-name')
imgs = soup.select('img.photo_image')
metas = soup.select('span.format_address')

for title, img, meta in zip(titles, imgs, metas):
    data = {
        'title':title.get_text(),
        'img':img.get('src'),
        'meta':list(meta.stripped_strings),
    }
    print data

'''


# 構(gòu)造函數(shù)

url_saves = 'http://www.tripadvisor.cn/Saves#207971'
url = 'http://www.tripadvisor.cn/Attractions-g60763-Activities-New_York_City_New_York.html'
# 連續(xù)爬取30頁的網(wǎng)頁信息,發(fā)現(xiàn)每一頁的區(qū)別在于 oa30 這個(gè)參數(shù)上印荔,每一頁的站點(diǎn)在這個(gè)數(shù)值的基礎(chǔ)上增加30
# 所以可以用以下的格式進(jìn)行爬取
urls = ['http://www.tripadvisor.cn/Attractions-g60763-Activities-oa{}-New_York_City_New_York.html#ATTRACTION_LIST'.format(str(i)) for i in range(30,930,30)]
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36',
    'Cookie':'__utma=55896302.1244431692.1455603774.1455603774.1455603774.1; __utmc=55896302; =',
}

def get_attractions(url, data=None):
    wb_data   = requests.get(url)
    time.sleep(4)
    soup      = BeautifulSoup(wb_data.text, 'lxml')
    titles    = soup.select('div.property_title > a[target="_blank"]')
    imgs      = soup.select('img[width="160"]')
    cates     = soup.select('div.p13n_reasoning_v2')
    for title, img, cate in zip(titles, imgs, cates):
        data = {
            'title':title.get_text(),
            'img': img.get('src'),
            'cate':list(cate.stripped_strings),
        }
        print data,'\n','*'*50,'\n'


def get_favs(url, data=None):
    wb_data = requests.get(url, headers=headers)
    soup    = BeautifulSoup(wb_data.text, 'lxml')
    titles  = soup.select('a.location-name')
    imgs    = soup.select('img.photo_image')
    metas   = soup.select('span.format_address')

    if data == None:
        for title, img, meta in zip(titles, imgs, metas):
            data = {
                'title':title.get_text(),
                'img':img.get('src'),
                'meta':list(meta.stripped_strings),
            }
            print data,'\n','*'*50,'\n'

for single_url in urls:
    get_attractions(single_url)


# 6.爬取多連續(xù)頁的資料


代碼演示了簡單的爬蟲菱鸥,帶Cookie的爬蟲,以及連續(xù)爬取多個(gè)頁面的爬蟲躏鱼。

為了應(yīng)對站點(diǎn)的反爬蟲機(jī)制同窘,也可以利用模擬手機(jī)端登錄的方式進(jìn)行站點(diǎn)的爬扰璩唷:

# 手機(jī)端抓取網(wǎng)頁信息
from bs4 import BeautifulSoup
import requests


headers = {
    'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1',
}

url = 'http://www.tripadvisor.cn/Attractions-g60763-Activities-oa30-New_York_City_New_York.html'
mb_data = requests.get(url, headers=headers)
soup = BeautifulSoup(mb_data.text, 'lxml')
imgs = soup.select('div.thumb.thumbLLR.soThumb > img')
for i in imgs:
    print i.get('src')


從代碼中可以看出麻掸,模擬手機(jī)端的爬蟲與一般的爬蟲非常的相似熟吏,區(qū)別在于headers中的User-Agent是不一樣的廊散,這個(gè)也是非常簡單的慰技,Chrome瀏覽器可以通過很簡單的方式進(jìn)行手機(jī)端登錄站點(diǎn)的模擬沃呢。具體實(shí)現(xiàn)可以在網(wǎng)上查找一下气堕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末登钥,一起剝皮案震驚了整個(gè)濱河市畔师,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌牧牢,老刑警劉巖看锉,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姿锭,死亡現(xiàn)場離奇詭異,居然都是意外死亡伯铣,警方通過查閱死者的電腦和手機(jī)呻此,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腔寡,“玉大人焚鲜,你說我怎么就攤上這事》徘埃” “怎么了忿磅?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凭语。 經(jīng)常有香客問我葱她,道長,這世上最難降的妖魔是什么叽粹? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任览效,我火速辦了婚禮,結(jié)果婚禮上虫几,老公的妹妹穿的比我還像新娘锤灿。我一直安慰自己,他們只是感情好辆脸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布但校。 她就那樣靜靜地躺著,像睡著了一般啡氢。 火紅的嫁衣襯著肌膚如雪状囱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天倘是,我揣著相機(jī)與錄音亭枷,去河邊找鬼。 笑死搀崭,一個(gè)胖子當(dāng)著我的面吹牛叨粘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瘤睹,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼升敲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轰传?” 一聲冷哼從身側(cè)響起驴党,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎获茬,沒想到半個(gè)月后港庄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體倔既,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年攘轩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叉存。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡度帮,死狀恐怖歼捏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情笨篷,我是刑警寧澤瞳秽,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站率翅,受9級(jí)特大地震影響练俐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冕臭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一腺晾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辜贵,春花似錦悯蝉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至厚棵,卻和暖如春蕉世,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婆硬。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工狠轻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彬犯。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓向楼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躏嚎。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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