1. 程式人生 > >使用requests爬取貓眼電影TOP100榜單

使用requests爬取貓眼電影TOP100榜單

esp 進行 得到 ensure .com key d+ odin pickle

  Requests是一個很方便的python網絡編程庫,用官方的話是“非轉基因,可以安全食用”。裏面封裝了很多的方法,避免了urllib/urllib2的繁瑣。

  這一節使用requests庫對貓眼電影的TOP100榜進行抓取。

1 獲得頁面。

首先確定要爬取的url為http://maoyan.com/board/4,通過requests模塊,打印出頁面的信息

def get_a_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:#狀態碼,200表示請求成功
            
return response.text #返回頁面信息 return None except RequestException : return None

上面是代碼及註釋,為了防止再抓取時候出現異常,requests的異常有這些,其中RequestException是異常的父類,故我們直接導入

from requests.exceptions import RequestException

作為異常處理。這樣就得到了該url地址的網頁內容。

2 分析頁面

  首先看一些頁面的大致情況,其中【霸王別姬】就是我們要抓取的欄目,欄目下面又分了一些小內容,如下面黑色箭頭所示。

技術分享

先看一下頁面大致情況,右鍵【審查元素】

技術分享

可以看出<dd>標簽包裹著每一個電影的信息,用正則表達式找到想要的元素。

reg = re.compile(<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name">
                     + <a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p> 
                     + .*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>
,re.S)

依次捕獲的是 排名,地址,名稱,主演,時間,整數評分,小數評分。這裏我用字典的形式存儲,返回一個生成器。

items = reg.findall(html)
    for item in items:
        yield{
            "index":item[0],
            "image":item[1],
            "title":item[2],
            "actor":item[3].strip()[3:],
            "time":item[4].strip()[5:],
            "score":item[5]+item[6]
            }

3 寫入文件

抓取到電影列表,剩下就是將電影列表寫入文件中,由於返回的是一個字典對象,可以使用pickle方法進行序列化,但為了方便以後的查閱,這裏用文本方式保存

def write_to_file(contents):
    c = ""
    with codecs.open("result.txt",a,encoding="utf-8",errors="ignore") as f:
        for key,value in contents.items():
            c += key + ":" + value +"\t"
        f.write(c + "\n")

返回的是一個字典格式,可是借助json方法進行序列化

def write_to_file(contents):
    with codecs.open("result.txt",a,encoding="utf-8",errors="ignore") as f:
        f.write(json.dumps(contents,ensure_ascii=False) + \n)

其中的dumps方法是將obj序列化為JSON格式的字符串,這裏面要註意的是編碼問題。最後就是抓取整個榜單了,可以加入多線程策略,最後的完整代碼

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

import requests,re
import codecs
from requests.exceptions import RequestException
from multiprocessing import Pool

import json
def get_a_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException :
        return  None
def parse_a_page(html):
    #排名,地址,名稱,主演,時間,評分1,評分2
    reg = re.compile(<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name">
                     + <a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p> 
                     + .*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>,re.S)
    items = reg.findall(html)
    for item in items:
        yield{
            "index":item[0],
            "image":item[1],
            "title":item[2],
            "actor":item[3].strip()[3:],
            "time":item[4].strip()[5:],
            "score":item[5]+item[6]
            }
    
    
def write_to_file(contents):#這裏面兩個方法。一種是用json,一種是轉為字符串
    c = ""
    with codecs.open("result.txt",a,encoding="utf-8",errors="ignore") as f:
        #for key,value in contents.items():
            #c += key + ":" + value +"\t"
        f.write(json.dumps(contents,ensure_ascii=False) + \n)
        #print c
        #f.write(c + "\n")
def main(offset):
    url = "http://maoyan.com/board/4?offset=%s" %offset
    print url
    html = get_a_page(url)
    for item in parse_a_page(html):
        write_to_file(item)

if __name__ == "__main__":
    ‘‘‘
    for i in range(10):
        main(i*10)
    ‘‘‘
        
    pool = Pool()#多線程
    pool.map(main,[i*10 for i in range(10)])

使用requests爬取貓眼電影TOP100榜單