requests+正則表達式爬取貓眼電影TOP100

一、目標站點分析html

首先打開瀏覽器(谷歌)、輸入maoyan.com進入貓眼電影的官網、找到榜單下的TOP100榜、右鍵單擊打開檢查或者直接按F12打開、點擊左上角鼠標圖標,點擊第一名霸王別姬,咱們發現每一個<dd>標籤都包含一個視頻的信息(img(圖片),每一個<p>標籤分別包含視頻名class=「name」、主演class=「star」、上映時間class=「releasetime」和評分(評分是有兩個<i>標籤拼接起來的,class分別爲integer和fraction),總體結構比較清晰正則表達式

二、流程框架json

  1. 抓取單頁內容:利用requests請求目標站點,獲得單個網頁HTML代碼,返回結果
  2. 正則表達式分析:根據HTML代碼分析獲得電影的名稱、主演、上映時間、評分、圖片連接等信息
  3. 保存至文件:經過文件的形式將結果保存,每一部電影一個結果一行json字符串
  4. 開啓循環及多線程:對多頁內容遍歷,開啓多線程提升抓取速度

三、爬蟲實戰:瀏覽器

打開pycharm,點擊左上角File—NewProject,新建名爲maoyanTOP100多線程

在maoyanTOP100目錄下新建一個spider.py文件,進入spider.py框架

詳細步驟解析已註釋,源代碼以下:ide

import requests#d導入requests模塊
from multiprocessing import Pool#進程池
from requests.exceptions import RequestException#用於異常處理
import json
import re#導入正則表達式

headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'
}
def get_one_page(url):#請求單頁內容的方法
    try:
        response = requests.get(url,headers=headers)#用requests.get請求url
        if response.status_code == 200:#判斷,若是請求到的狀態碼==200(請求成功)
            return response.text#返回網頁內容
        return None#若是是其餘狀態碼返回None
    except RequestException:
        return None

def parse_one_page(html):#解析單頁內容
    pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?src="(.*?)".*?name"><a'+'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
                         +'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)#編寫正則表達式
    items = re.findall(pattern,html)#應用已編好的正則表達式
    for item in items:#遍歷
        yield {
            '排名':item[0],
            '圖片地址': item[1],
            '標題': item[2],
            '主演': item[3].strip()[3:],
            '上映時間': item[4].strip()[5:],
            '評分': item[5]+item[6]
        }

def write_to_file(content):#將爬取結果保存到resuli.txt
    with open('result.txt','a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False)+'\n')
        f.close()

def main(offset):
    url = 'http://maoyan.com/board/4?offset='+str(offset)
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

if __name__=="__main__":
    pool = Pool()#構造進程池
    pool.map(main,[i*10 for i in range(10)])#爬取多頁
相關文章
相關標籤/搜索