Python爬蟲入門之 如何在豆瓣中獲取自己喜歡的TOP N電影信息

什么是爬蟲

按照一定規(guī)則自動的獲取互聯(lián)網(wǎng)上的信息(如何快速有效的利用互聯(lián)網(wǎng)上的大量信息)

爬蟲的應(yīng)用

  • 搜索引擎(Google、百度膘格、Bing等搜索引擎芳绩,輔助人們檢索信息)
  • 股票軟件(爬取股票數(shù)據(jù)催什,幫助人們分析決策凤覆,進(jìn)行金融交易)
  • Web掃描(需要對網(wǎng)站所有的網(wǎng)頁進(jìn)行漏洞掃描)
  • 獲取某網(wǎng)站最新文章收藏
  • 爬取天氣預(yù)報
  • 爬取漂亮mm照片

基礎(chǔ)知識

1.HTTP 協(xié)議
客戶端發(fā)起請求,服務(wù)器接收到請求后返回格式化的數(shù)據(jù)发乔,客戶端接收數(shù)據(jù)熟妓,并進(jìn)行解析和處理

2.HTML(超文本標(biāo)記語言)

html.png

3.Python

  • 基礎(chǔ)語法&常用系統(tǒng)模塊
  • 第三方模塊requests,pyquery使用
    安裝:
pip install requests
pip install pyquery

requests模塊使用:

#requests(發(fā)起HTTP請求,并獲取結(jié)果)
response = requests.get('http://localhost:9999/index.html')
response = requests.post()
print response.content

pyquery模塊使用

page = PyQuery(html)

選擇器
tag: page('title')
id: page('#job_1')
class: page('.job')

復(fù)合選擇器
page('div#job_1')
page('div.job')

子選擇器
page('div#job_1 li')
page('div#job_1 > li')
page('div#job_1').find('li')
page('div#job_1').children('li')

獲取標(biāo)簽內(nèi)的html page('div#job_1').html()
獲取標(biāo)簽內(nèi)的文本 page('div#job_1').text()
獲取標(biāo)簽屬性  page('div#job_1').attr['id']

csv模塊使用

writer = csv.writer()
writer.writerow()
writer.writerows()

程序運行

1.程序啟動

start.png

2.運行結(jié)果

result.png

手動搜索TOP N電影信息

1.獲取電影列表

list.png

2.獲取電影詳情超鏈接

link.png

3.獲取電影詳情

info.png

代碼走讀

1.程序啟動

main.png

2.查找電影列表

list.png

3.查找電影詳情

info.png

4.寫入csv文件

csv.png

源碼


#encoding: utf-8
import requests
from pyquery import PyQuery as pq
import csv

attrs = [u'超鏈接', u'名稱', u'評分', u'導(dǎo)演', u'編劇', u'主演', u'類型', u'制片國家/地區(qū)', u'語言', u'上映日期', u'片長', u'又名', u'IMDb鏈接']

'''
獲取電影詳情
'''
def attch_info(info, text, key, value):
    text = text.strip(' ')
    if text:
        if text in attrs:
            if key and value:
                info[key] = ' '.join(value)
            key = text
            value = []
        else:
            value.append(text)

    return info, key, value


'''
解析電影信息
'''
def parse_movie_info(text, info):
    key = None
    value = []

    for e in text.split(':'):
        e = e.strip()
        pos = e.rfind(' ')
        if -1 == pos:
            info, key, value = attch_info(info, e, key, value)
        else:
            info, key, value = attch_info(info, e[:pos], key, value)
            info, key, value = attch_info(info, e[pos:], key, value)

    if key not in info:
        info[key] = ' '.join(value)


'''
解析電影頁面
'''
def crawl_info(url):
    info = {}
    print url
    response = requests.get(url)
    page = pq(response.content)
    content = page('div#content').eq(0)

    info[u'超鏈接'] = url
    info[u'名稱'] = content('h1 span').eq(0).text()
    info[u'評分'] = content('div.rating_wrap strong.rating_num').text()

    info_text = content('div#info').text()
    parse_movie_info(info_text, info)

    return info


'''
獲取電影列表
'''
def crawl(query_text, count):
    start = 0
    rt_list = []
    isStop = False
    url = 'https://movie.douban.com/subject_search?start={start}&search_text={query_text}&cat=1002'
    while True:
        response = requests.get(url.format(query_text=query_text.encode('utf-8', 'ignore'), start=start))
        page = pq(response.content)
        links = page('div#content table a').not_('.nbg')
        if len(links) == 0:
            isStop = True

        for link in links:
            href = pq(link).attr['href']
            rt_list.append(crawl_info(href))
            start += 1
            if len(rt_list) >= count:
                isStop = True
                break

        if isStop:
            break

    return rt_list


'''
寫入文件
'''
def write_to_file(lines, path):
    with open(path, 'wb') as fhandler:
        writer = csv.writer(fhandler)
        writer.writerow(map(lambda x: x.encode('gbk', 'ignore'), attrs))
        for line in lines:
            row = []
            for key in attrs:
                row.append(line.get(key, '').encode('gbk', 'ignore'))
            writer.writerow(row)


if __name__ == '__main__':

    query_text = raw_input(u"請輸入關(guān)鍵字:".encode('utf-8', 'ignore'))
    count = raw_input(u"請輸入爬取得數(shù)據(jù)量:".encode('utf-8', 'ignore'))

    query_text = query_text.strip().decode('utf-8') if query_text.strip() else u'長城'
    count = int(count) if count.isdigit() else 10

    print u'關(guān)鍵字:{query_text}, 數(shù)量:{count}'.format(query_text=query_text, count=count)

    rt_list = crawl(query_text, count)
    write_to_file(rt_list, 'result.csv')

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栏尚,一起剝皮案震驚了整個濱河市起愈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌译仗,老刑警劉巖抬虽,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纵菌,居然都是意外死亡阐污,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門咱圆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笛辟,“玉大人,你說我怎么就攤上這事序苏∈执保” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵忱详,是天一觀的道長围来。 經(jīng)常有香客問我,道長匈睁,這世上最難降的妖魔是什么监透? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮航唆,結(jié)果婚禮上胀蛮,老公的妹妹穿的比我還像新娘。我一直安慰自己佛点,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布黎比。 她就那樣靜靜地躺著超营,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阅虫。 梳的紋絲不亂的頭發(fā)上演闭,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音颓帝,去河邊找鬼米碰。 笑死窝革,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吕座。 我是一名探鬼主播虐译,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吴趴!你這毒婦竟也來了漆诽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锣枝,失蹤者是張志新(化名)和其女友劉穎厢拭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撇叁,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡供鸠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了陨闹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楞捂。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖正林,靈堂內(nèi)的尸體忽然破棺而出泡一,到底是詐尸還是另有隱情,我是刑警寧澤觅廓,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布鼻忠,位于F島的核電站,受9級特大地震影響杈绸,放射性物質(zhì)發(fā)生泄漏帖蔓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一瞳脓、第九天 我趴在偏房一處隱蔽的房頂上張望塑娇。 院中可真熱鬧,春花似錦劫侧、人聲如沸埋酬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽写妥。三九已至,卻和暖如春审姓,著一層夾襖步出監(jiān)牢的瞬間珍特,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工魔吐, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留扎筒,地道東北人莱找。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像嗜桌,于是被迫代替她去往敵國和親奥溺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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

  • 爬蟲文章 in 簡書程序員專題: like:128-Python 爬取落網(wǎng)音樂 like:127-【圖文詳解】py...
    喜歡吃栗子閱讀 21,753評論 4 411
  • 1 前言 作為一名合格的數(shù)據(jù)分析師症脂,其完整的技術(shù)知識體系必須貫穿數(shù)據(jù)獲取谚赎、數(shù)據(jù)存儲、數(shù)據(jù)提取诱篷、數(shù)據(jù)分析壶唤、數(shù)據(jù)挖掘、...
    whenif閱讀 18,072評論 45 523
  • 聲明:本文講解的實戰(zhàn)內(nèi)容棕所,均僅用于學(xué)習(xí)交流闸盔,請勿用于任何商業(yè)用途! 一琳省、前言 強(qiáng)烈建議:請在電腦的陪同下迎吵,閱讀本文...
    Bruce_Szh閱讀 12,704評論 6 28
  • 昨晚十一點多,我在房間準(zhǔn)備睡覺针贬,阿肥在客廳吹頭發(fā)击费,突然有人敲門,阿肥想去開門桦他,龜仔說這么晚不能隨便開門蔫巩,先問問是誰...
    吃貨霞閱讀 630評論 0 0
  • 迎著北方來風(fēng)的方向 我決心要種一株白色的桔梗 勤于施肥圆仔,勤于澆水 在星夜和夕陽里陪它眺望 我這般殷勤 不為了開花的...
    小小小洛閱讀 491評論 0 0