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

什么是爬蟲

按照一定規則自動的獲取互聯網上的信息(如何快速有效的利用互聯網上的大量信息)

爬蟲的應用

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

基礎知識

1.HTTP 協議
客戶端發起請求,服務器接收到請求后返回格式化的數據,客戶端接收數據,并進行解析和處理

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

html.png

3.Python

  • 基礎語法&常用系統模塊
  • 第三方模塊requests,pyquery使用
    安裝:
pip install requests
pip install pyquery

requests模塊使用:

#requests(發起HTTP請求,并獲取結果)
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')

復合選擇器
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')

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

csv模塊使用

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

程序運行

1.程序啟動

start.png

2.運行結果

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'導演', u'編劇', u'主演', u'類型', u'制片國家/地區', 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"請輸入關鍵字:".encode('utf-8', 'ignore'))
    count = raw_input(u"請輸入爬取得數據量:".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'關鍵字:{query_text}, 數量:{count}'.format(query_text=query_text, count=count)

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,578評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,701評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,691評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,974評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,694評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,026評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,015評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,193評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,719評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,442評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,668評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,151評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,846評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,255評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,592評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,394評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容

  • 爬蟲文章 in 簡書程序員專題: like:128-Python 爬取落網音樂 like:127-【圖文詳解】py...
    喜歡吃栗子閱讀 21,914評論 4 411
  • 1 前言 作為一名合格的數據分析師,其完整的技術知識體系必須貫穿數據獲取、數據存儲、數據提取、數據分析、數據挖掘、...
    whenif閱讀 18,101評論 45 523
  • 聲明:本文講解的實戰內容,均僅用于學習交流,請勿用于任何商業用途! 一、前言 強烈建議:請在電腦的陪同下,閱讀本文...
    Bruce_Szh閱讀 12,759評論 6 28
  • 昨晚十一點多,我在房間準備睡覺,阿肥在客廳吹頭發,突然有人敲門,阿肥想去開門,龜仔說這么晚不能隨便開門,先問問是誰...
    吃貨霞閱讀 636評論 0 0
  • 迎著北方來風的方向 我決心要種一株白色的桔梗 勤于施肥,勤于澆水 在星夜和夕陽里陪它眺望 我這般殷勤 不為了開花的...
    小小小洛閱讀 498評論 0 0