1. 程式人生 > >貓眼網基礎爬蟲-小白的第一次爬蟲經歷

貓眼網基礎爬蟲-小白的第一次爬蟲經歷

以下為最近爬取貓眼TOP100榜單的程式碼:

import requests
import re
import json
import datetime
import time

def get_one_page(url):
    #獲取網頁
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
    }
    response = requests.get(url,headers=headers,)
    #此處一定要加一個headers=headers來模擬瀏覽器傳送請求
    if response.status_code==200:
        return response.text
    return None

# main()
def parse_one_page(html):
    #使用正則表示式抓取網頁資訊
    pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?}">'
                         '(.*?)</a>.*?">(.*?)</p>.*?">(.*?)</p>.*?integer">(.*?)</i>.*?">(.*?)</i>',re.S)
    items = re.findall(pattern,html)
    for item in items:
        yield {
            'index':item[0],
            'img':item[1],
            'title':item[2],
            'actor':item[3].strip()[3:] if len(item[3])>3 else '',
            'time':item[4].strip()[5:] if len(item[4])>5 else '',
            'score':item[5].strip()+item[6].strip()
        }
        #迭代生成器,相當於依次生成了一個列表
        # dict = {
        #     'index':item[0],
        #     'img':item[1],
        #     'title':item[2],
        #     'actor':item[3].strip()[3:] if len(item[3])>3 else '',
        #     'time':item[4].strip()[5:] if len(item[4])>5 else '',
        #     'score':item[5].strip()+item[6].strip()
        # }
        # print(dict)
        # print(item)

def write_to_file(context):
    with open('result.txt','a',encoding='utf-8') as f:
        #以附加模式開啟檔案result.txt
        f.write(json.dumps(context,ensure_ascii=False)+'\n'+str(datetime.datetime.now()))
        '''json.dumps,將檔案裝換為json格式寫入,ensure_ascii=False保證輸出的結果是中文形式而不是Unicode編碼,
          末尾新增爬取時系統時間 '''

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

if __name__ == '__main__':
    for i in range(10):
        #傳入offset引數
        main(offset = i*10)
        time.sleep(1)

程式碼參考至網路爬蟲開發實戰--崔慶才