Python三種方法抓取豆瓣電影 top 250

更新:因豆瓣版本更新轿塔,正文內(nèi)代碼已失效昆淡,修復后的代碼放到了Github刺桃,主要變化:

  • 退2保平安匈睁,改用Python 3(free style)
  • 加入了隨機生成User Agent(Scrapy的user agent明明白白表示自己是個機器人...這是舊代碼抓不到任何數(shù)據(jù)的原因)
  • 更新了rate的xpath
  • 現(xiàn)在github repo里共有三個玩具爬蟲卷哩,分別使用beautifulsoup蛋辈、scrapy、selenium

下面是本文初始版将谊,詳述Python 2下的Scrapy方法:

第一次接觸scrapy冷溶,想找個簡單的頁面嘗試下,于是就抓了豆瓣電影TOP250尊浓。沒什么技術(shù)含量逞频,主要收獲是了解了scrapy的基本功能、xpath以及python中Unicode的編碼問題栋齿。

只想看結(jié)果的話請往后翻苗胀。

實現(xiàn)

items.py (scrapy)

import scrapy

class Movie250Item(scrapy.Item):
    rank = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    star = scrapy.Field()
    rate = scrapy.Field()
    quote = scrapy.Field()

spider_movie250.py (scrapy)

import scrapy
from movie250.items import Movie250Item

class Movie250Spider(scrapy.Spider):
  """docstring for Movie250Spider"""
  name = 'movie250'
  allowed_domains = ["douban.com"]
  start_urls = [
    "http://movie.douban.com/top250/"
  ]

  def parse(self, response):
    for info in response.xpath('//div[@class="item"]'):
      item = Movie250Item()
      item['rank'] = info.xpath('div[@class="pic"]/em/text()').extract()
      item['title'] = info.xpath('div[@class="pic"]/a/img/@alt').extract()
      item['link'] = info.xpath('div[@class="pic"]/a/@href').extract()
      item['star'] = info.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span/em/text()').extract()
      item['rate'] = info.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span/text()').extract()
      item['quote'] = info.xpath('div[@class="info"]/div[@class="bd"]/p[@class="quote"]/span/text()').extract()
      yield item

    # 翻頁
    next_page = response.xpath('//span[@class="next"]/a/@href')
    if next_page:
      url = response.urljoin(next_page[0].extract())
      yield scrapy.Request(url, self.parse)

以上代碼寫好后進入在Console里輸入以下命令,以爬取數(shù)據(jù)并存入json文件中:

scrapy crawl movie250 -o items.json

得到的json文件采樣:

[{"star": ["9.6"], "title": ["\u8096\u7533\u514b\u7684\u6551\u8d4e"], "quote": ["\u5e0c\u671b\u8ba9\u4eba\u81ea\u7531\u3002"], "rank": ["1"], "rate": ["628644\u4eba\u8bc4\u4ef7"], "link": ["http://movie.douban.com/subject/1292052/"]},
{"star": ["9.4"], "title": ["\u8fd9\u4e2a\u6740\u624b\u4e0d\u592a\u51b7"], "quote": ["\u602a\u8700\u9ecd\u548c\u5c0f\u841d\u8389\u4e0d\u5f97\u4e0d\u8bf4\u7684\u6545\u4e8b\u3002"], "rank": ["2"], "rate": ["598654\u4eba\u8bc4\u4ef7"], "link": ["http://movie.douban.com/subject/1295644/"]}]

最后自己再寫一個output得到結(jié)果(主要注意編碼問題瓦堵,注釋里已進行解釋基协,print語句有點長Orz):

output.py

import json

def readMovieJson():
    inFile = open("D:\Users\Simon\movie250\items.json",'r',0)
    text = inFile.read() # text是str
    movie_dict = json.loads(text) # movie_dict是list
    for movie in movie_dict: # movie是dict
        rank = movie["rank"][0] # rank等都是Unicode
        title = movie["title"][0]
        link = movie["link"][0]
        star = movie["star"][0]
        rate = movie["rate"][0]
        if movie["quote"]:
            quote = movie["quote"][0]
        else: quote = "暫無".decode("utf-8")
        
        # str和Unicode不能混用,要么將Unicode類型encode為其他編碼菇用,
          要么將str類型decode為其他編碼
        # python的內(nèi)部使用Unicode澜驮,str如“電影: ”是字節(jié)串,由Unicode
          經(jīng)過編碼(encode)后的字節(jié)組成的
        # 與下句不同的另一種組合字符串方式:print "電影: " + title.encode("utf-8")
        print "top".decode("utf-8") + rank + ".".decode("utf-8") + \
              title + " 評分".dec1ode("utf-8") + star + \
              '('.decode("utf-8") + rate + ')'.decode("utf-8") + \
              "\n鏈接:".decode("utf-8") + link + \
              "\n豆瓣評論:".decode("utf-8") + quote + "\n"

結(jié)果

top1.肖申克的救贖 評分9.6(628644人評價)
鏈接:http://movie.douban.com/subject/1292052/
豆瓣評論:希望讓人自由惋鸥。

top2.這個殺手不太冷 評分9.4(598654人評價)
鏈接:http://movie.douban.com/subject/1295644/
豆瓣評論:怪蜀黍和小蘿莉不得不說的故事杂穷。

top3.阿甘正傳 評分9.4(528435人評價)
鏈接:http://movie.douban.com/subject/1292720/
豆瓣評論:一部美國近現(xiàn)代史。

top4.霸王別姬 評分9.4(430468人評價)
鏈接:http://movie.douban.com/subject/1291546/
豆瓣評論:風華絕代卦绣。

top5.美麗人生 評分9.4(291120人評價)
鏈接:http://movie.douban.com/subject/1292063/
豆瓣評論:最美的謊言亭畜。

(下略)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市迎卤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玷坠,老刑警劉巖蜗搔,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異八堡,居然都是意外死亡樟凄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門兄渺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缝龄,“玉大人,你說我怎么就攤上這事∈迦溃” “怎么了瞎饲?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炼绘。 經(jīng)常有香客問我嗅战,道長,這世上最難降的妖魔是什么俺亮? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任驮捍,我火速辦了婚禮,結(jié)果婚禮上脚曾,老公的妹妹穿的比我還像新娘东且。我一直安慰自己,他們只是感情好本讥,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布珊泳。 她就那樣靜靜地躺著,像睡著了一般囤踩。 火紅的嫁衣襯著肌膚如雪旨椒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天堵漱,我揣著相機與錄音综慎,去河邊找鬼。 笑死勤庐,一個胖子當著我的面吹牛示惊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愉镰,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼米罚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丈探?” 一聲冷哼從身側(cè)響起录择,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碗降,沒想到半個月后隘竭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡讼渊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年动看,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爪幻。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡菱皆,死狀恐怖须误,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情仇轻,我是刑警寧澤京痢,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站拯田,受9級特大地震影響历造,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜船庇,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一吭产、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸭轮,春花似錦臣淤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至按厘,卻和暖如春医吊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逮京。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工卿堂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人懒棉。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓草描,卻偏偏與公主長得像,于是被迫代替她去往敵國和親策严。 傳聞我的和親對象是個殘疾皇子穗慕,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

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

  • scrapy安裝以及簡單使用 1.進入終端,輸入命令pip install scrapy 安裝模塊妻导。安裝成功后逛绵,新...
    happyte閱讀 875評論 0 2
  • 01 如今唯一不變的就是變化了吧,在一家公司能呆上10年的人絕對是忠粉倔韭。工作占用了我們挺大比例的時間暑脆。魔都的交通四...
    遇見小娜閱讀 689評論 0 21
  • 陽光明媚的周末,我離開半徑不超過10公里的生活圈沥曹。 經(jīng)常說拿著一線城市的工資過著鄉(xiāng)下的生活份名。去圖書館借了書碟联,出來時...
    夏語冰橙閱讀 424評論 0 0
  • 音樂零距離 《看月亮爬上來》 不是每個夜晚都有星星,也不是每顆星星都會在星空下閃爍僵腺,當你輕輕開口鲤孵,淡淡吟唱,那些...
    single兮婧閱讀 523評論 6 5