使用requests爬取貓眼電影TOP100榜單
阿新 • • 發佈:2017-06-09
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榜單