1. 程式人生 > >python爬蟲教程,爬取貓眼電影 ,一網打盡好電影

python爬蟲教程,爬取貓眼電影 ,一網打盡好電影

一、頁面分析

首先開啟貓眼電影,然後點選一個正在熱播的電影(比如:毒液)。開啟開發者工具,點選左上角的箭頭,然後用滑鼠點選網頁上的票價,可以看到原始碼中顯示的不是數字,而是某些根本看不懂的字元,這是因為使用了font-face定義字符集,並通過unicode去對映展示,所以我們在網頁上看到的是數字,但是在原始碼中看到的卻是別的字元。

碰到這些根本看不懂的字元怎麼辦呢?不慌,右鍵選擇檢視網頁原始碼,然後找到相應的位置(如下圖)。那麼是不是“”映射出來就是28呢?

通過檢視原始碼,可以找到如下內容, 而當我們訪問這裡面的連結的時候,就可以下載相應的字型檔案,關於font-face可以點選這裡查看了解:

當我下載好字型檔案後,滿心歡喜的雙擊想要點開的時候,卻發現無法開啟(T_T)。查閱資料之後知道了一個叫做FontCreator的軟體,用這個軟體可以開啟我們下載的字型檔案,沒有安裝這個軟體的可以進入官網https://www.high-logic.com/下載安裝,如果下載得很慢的可以用百度雲下載(連結:https://pan.baidu.com/s/1ImxwPhKdzZo2g4bIjiGCZw ,提取碼:m0yf )。下載好之後開啟軟體,看到如下介面,選擇Use Evaluation Version,這個軟體我們可以免費使用三十天。

開啟軟體後,再開啟我們下載的字型檔案,可以看到數字2和8分別對應的是uniE83B和uniE375,和前面看到的編碼是一致的。

那麼我們下載好字符集之後,只要將其中的字元編碼和數字對應的資訊提取出來,再把網頁原始碼中的字元編碼替換掉,就能得到我們想要的資料了。這裡要用到一個三方庫fontTools,利用fontTools可以獲取每一個字元物件,這個物件你可以簡單的理解為儲存著這個字元的形狀資訊,而且編碼可以作為這個物件的id,具有一一對應的關係。不過這裡還有一個問題,就是網頁每次使用的字符集是隨機變化的,我們也就無法使用一個固定的字符集去做到反爬。

解決思路如下:先儲存一個字型檔案(比如base.woff),然後解析其數字和編碼的對應關係,然後爬取的時候把新的字型檔案下載下來(比如online.woff),網頁中的一個數字的編碼(比如ABCD),我們先通過編碼ABCD找到這個字元在online.woff中的物件,並且把它和base.woff中的物件逐個對比,直到找到相同的物件,然後獲取這個物件在base.woff中的編碼,再通過編碼確認是哪個數字。

二、主要程式碼 解析下載的字型檔案,由於字型檔案中有多餘的字元,需要捨棄掉。

'''
在學習過程中有什麼不懂得可以加我的python學習交流扣扣qun,934109170,群裡有不錯的學習教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。
'''
# 解析字型庫
def parse_ttf(font_name):
    """
    :param font_name: 字型檔名
    :return: 字元-數字字典
    """
    base_nums = ['3', '0', '1', '6', '4', '2', '5', '8', '9', '7']
    base_fonts = ['uniEB84', 'uniF8CA', 'uniEB66', 'uniE9DB', 'uniE03C',
                  'uniF778', 'uniE590', 'uniED12', 'uniEA5E', 'uniE172']
    font1 = TTFont('base.woff')  # 本地儲存的字型檔案
    font2 = TTFont(font_name)  # 網上下載的字型檔案
 
    uni_list = font2.getGlyphNames()[1:-1]  # 去掉頭尾的多餘字元
    temp = {}
    # 解析字型庫
    for i in range(10):
        uni2 = font2['glyf'][uni_list[i]]
        for j in range(10):
            uni1 = font1['glyf'][base_fonts[j]]
            if uni2 == uni1:
                temp["&#x" + uni_list[i][3:].lower() + ";"] = base_nums[j]
    return temp

解析網頁原始碼,把其中的編碼替換成數字,這裡選擇把網頁原始碼儲存下來,這樣的話編碼就不會改變,也就能正確的解析。

# 解析網頁得到數字資訊
def get_nums(font_dict):
    """
    :param font_dict: 字元-數字字典
    :return: 由評分、評分人數、票房和票價組成的列表
    """
    num_list = []
    with open('html', 'r', encoding='utf-8') as f:
        for line in f.readlines():
            lst = re.findall('(&#x.*?)<', line)
            if lst:
                num = lst[0]
                for i in font_dict.keys():
                    if i in num:
                        num = num.replace(i, font_dict[i])
                num_list.append(num)
    return num_list

完整程式碼

import re
import requests
from lxml import etree
from fontTools.ttLib import TTFont
'''
在學習過程中有什麼不懂得可以加我的python學習交流扣扣qun,934109170,群裡有不錯的學習教程、開發工具與電子書籍。
與你分享python企業當下人才需求及怎麼從零基礎學習好python,和學習什麼內容。
'''
headers = {
    "Host": "maoyan.com",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 "
                  "Safari/537.36"
}
 
 
# 解析字型庫
def parse_ttf(font_name):
    """
    :param font_name: 字型檔名
    :return: 字元-數字字典
    """
    base_nums = ['3', '0', '1', '6', '4', '2', '5', '8', '9', '7']
    base_fonts = ['uniEB84', 'uniF8CA', 'uniEB66', 'uniE9DB', 'uniE03C',
                  'uniF778', 'uniE590', 'uniED12', 'uniEA5E', 'uniE172']
    font1 = TTFont('base.woff')  # 本地儲存的字型檔案
    font2 = TTFont(font_name)  # 網上下載的字型檔案
 
    uni_list = font2.getGlyphNames()[1:-1]  # 去掉頭尾的多餘字元
    temp = {}
    # 解析字型庫
    for i in range(10):
        uni2 = font2['glyf'][uni_list[i]]
        for j in range(10):
            uni1 = font1['glyf'][base_fonts[j]]
            if uni2 == uni1:
                temp["&#x" + uni_list[i][3:].lower() + ";"] = base_nums[j]
    return temp
 
 
# 解析網頁得到數字資訊
def get_nums(font_dict):
    """
    :param font_dict: 字元-數字字典
    :return: 由評分、評分人數、票房和票價組成的列表
    """
    num_list = []
    with open('html', 'r', encoding='utf-8') as f:
        for line in f.readlines():
            lst = re.findall('(&#x.*?)<', line)
            if lst:
                num = lst[0]
                for i in font_dict.keys():
                    if i in num:
                        num = num.replace(i, font_dict[i])
                num_list.append(num)
    return num_list
 
 
# 爬取頁面
def get_page():
    url = "http://maoyan.com/cinemas?movieId=42964"
    res = requests.get(url, headers=headers)
    # 提取woff字型的連結
    woff_url = re.findall(r"vfile.*?woff", res.text)[0]
    # 下載字型檔案
    font_name = 'online.woff'
    with open(font_name, 'wb') as f:
        f.write(requests.get("http://" + woff_url).content)
    # 儲存res.text用於後面解析
    with open('html', 'w', encoding='utf-8') as f:
        f.write(res.text)
    # 解析字型檔案
    font_dict = parse_ttf(font_name)
    nums = get_nums(font_dict)
    price_list = nums[3:]  # 得到票價資訊列表
    s = etree.HTML(res.text)
    movie_name = s.xpath('/html/body/div[3]/div/div[2]/div[1]/h3/text()')[0]  # 名字
    movie_type = s.xpath('/html/body/div[3]/div/div[2]/div[1]/ul/li[1]/text()')[0]  # 型別
    info = s.xpath('/html/body/div[3]/div/div[2]/div[1]/ul/li[2]/text()')[0]
    movie_country = info.strip().split('\n')[0]  # 國家
    movie_time = info.strip().split('\n')[1].split('/ ')[-1]  # 時長
    movie_score = nums[0] + '(評分人數:{})'.format(nums[1])  # 評分
    box_office = nums[2] + s.xpath('/html/body/div[3]/div/div[2]/div[3]/div[2]/div/span[2]/text()')[0]  # 票房
    cinema_list = s.xpath('//*[@id="app"]/div[2]/div/div[1]/a/text()')
    address_list = s.xpath('//*[@id="app"]/div[2]/div/div[1]/p/text()')
    print(movie_name)
    print(movie_type + "/" + movie_country + "/" + movie_time)
    print("評分:"+movie_score, "票房:"+box_office)
    for cinema, address, price in zip(cinema_list, address_list, price_list):
        print(cinema, address, "票價:" + price + "元")
 
 
if __name__ == '__main__':
    get_page()

三、執行結果

相關推薦

Python爬蟲教程百度貼吧

貼吧爬取 寫程式碼前,構思需要的功能塊;寫程式碼時,把各個功能模組名提前寫好 初始化 初始化必要引數,完成基礎設定 爬取百度貼吧lol吧:爬取地址中的get引數須傳遞(可以指定不同主題的貼吧和頁碼) 主題名 初始網址 請求頭 生成網址 生成每一頁的路由

Python爬蟲教程崗位分析報告

本篇以拉勾網為例來說明一下如何獲取 Ajax 請求內容 本文目標 獲取 Ajax 請求,解析 JSON 中所需欄位 資料儲存到 Excel 中 資料儲存到 MySQL, 方便分析 簡單分析 五個城市 Python 崗位平均薪資水平 Python 崗位要求學歷分佈

python爬蟲教程貓眼電影 一網打盡電影

一、頁面分析 首先開啟貓眼電影,然後點選一個正在熱播的電影(比如:毒液)。開啟開發者工具,點選左上角的箭頭,然後用滑鼠點選網頁上

python爬蟲貓眼電影top100

import requests from bs4 import BeautifulSoup url_list = [] all_name = [] all_num = [] all_actor = [] all_score = [] class Product_url():

python 3.x 爬蟲基礎---正則表示式(案例:貓眼資訊寫入txt,csv,下載圖片)

python 3.x 爬蟲基礎 前言   正則表示式是對字串的一種邏輯公式,用事先定義好的一些特定字元、及這些特定字元的組合,組成一個“規則的字串”,此字串用來表示對字串的一種“過濾”邏輯。正在在很多開發語言中都存在,而非python獨有。對其知識點進行總結後,會寫一個demo。 1.正

資料視覺化 三步走(一):資料採集與儲存利用python爬蟲框架scrapy網路資料並存儲

前言     最近在研究python爬蟲,突然想寫部落格了,那就寫點東西吧。給自己定個小目標,做一個完整的簡單的資料視覺化的小專案,把整個相關技術鏈串聯起來,目的就是為了能夠對這塊有個系統的認識,具體設計思路如下: 1. 利用python爬蟲框架scr

[Python/爬蟲]利用xpath豆瓣電影top250

今天學習了一下xpath 感覺功能非常的強大,但是如果不太懂前端的小夥伴們可能比較吃力,建議看一下html的一些語法結構,程式碼如下: #!/usr/bin/env python import r

Python爬蟲之一:抓貓眼電影TOP100

執行平臺: Windows Python版本: Python3.6 IDE: Sublime Text 其他工具: Chrome瀏覽器1. 抓取單頁內容瀏覽器開啟貓眼電影首頁,點選“榜單”,然後再點選”TOP100榜”,就能看到想要的了。接下來通過程式碼來獲取網頁的HTML

Python爬蟲入門 | 2 豆瓣電影資訊

這是一個適用於小白的Python爬蟲免費教學課程,只有7節,讓零基礎的你初步瞭解爬蟲,跟著課程內容能自己爬取資源。看著文章,開啟電腦動手實踐,平均45分鐘就能學完一節,如果你願意,今天內你就可以邁入爬蟲的大門啦~ 好啦,正式開始我們的第二節課《爬取豆瓣電影資訊

50行Python程式碼教你貓眼電影TOP100榜所有資訊

來源: https://zhuanlan.zhihu.com/c_149865214對於Python初學者來說,爬蟲技能是應該是最好入門,也是最能夠有讓自己有成就感的,今天,戀習Python的手把手系列,手把手教你入門Python爬蟲,爬取貓眼電影TOP100榜資訊,將涉及到

python 爬蟲之requests頁面圖片的url並將圖片下載到本地

大家好我叫hardy   需求:爬取某個頁面,並把該頁面的圖片下載到本地   思考:   img標籤一個有多少種類型的src值?三種:1、以http開頭的網路連結。2、以“/”開頭絕對路徑。3、以“./”開頭相對路徑。當然還有其他型

python 爬蟲實戰4 淘寶MM照片

寫真 換行符 rip 多行 get sts tool -o true 本篇目標 抓取淘寶MM的姓名,頭像,年齡 抓取每一個MM的資料簡介以及寫真圖片 把每一個MM的寫真圖片按照文件夾保存到本地 熟悉文件保存的過程 1.URL的格式 在這裏我們用到的URL是 http:/

python爬蟲--打開頁面

PE brush OS htm tab quest replace %s class def requests_view(response): import webbrowser requests_url = response.url base_u

Python爬蟲入門 | 4 豆瓣TOP250圖書信息

Python 編程語言 Python爬蟲先來看看頁面長啥樣的:https://book.douban.com/top250 我們將要爬取哪些信息:書名、鏈接、評分、一句話評價……1. 爬取單個信息我們先來嘗試爬取書名,利用之前的套路,還是先復制書名的xpath:得到第一本書《追風箏的人》的書名xpath如下:

教你分分鐘學會用python爬蟲框架Scrapy你想要的內容

python 爬蟲 Scrapy python爬蟲 教你分分鐘學會用python爬蟲框架Scrapy爬取心目中的女神 python爬蟲學習課程,下載地址:https://pan.baidu.com/s/1v6ik6YKhmqrqTCICmuceug 課程代碼原件:課程視頻:教你分分鐘學會用py

python 爬蟲 requests+BeautifulSoup 巨潮資訊公司概況代碼實例

pan 字符 selenium 5.0 target 自我 color list tails 第一次寫一個算是比較完整的爬蟲,自我感覺極差啊,代碼low,效率差,也沒有保存到本地文件或者數據庫,強行使用了一波多線程導致數據順序發生了變化。。。 貼在這裏,引以為戒吧。 #

Python爬蟲入門 | 5 小豬短租租房信息

圖片 交流 ffffff 信息 jpg http 而已 基本 mat 小豬短租是一個租房網站,上面有很多優質的民宿出租信息,下面我們以成都地區的租房信息為例,來嘗試爬取這些數據。 小豬短租(成都)頁面:http://cd.xiaozhu.com/1.爬取租房標題 按照慣例,

Python 爬蟲入門(一)——糗百

upa ext win comment 地址 odi 批量 爬蟲程序 article 爬取糗百內容 GitHub 代碼地址https://github.com/injetlee/Python/blob/master/qiubai_crawer.py 微信公眾號:【智能制造專

Python爬蟲項目--自如網房源信息

xml解析 quest chrom 當前 b2b cal 源代碼 headers 判斷 本次爬取自如網房源信息所用到的知識點: 1. requests get請求 2. lxml解析html 3. Xpath 4. MongoDB存儲 正文 1.分析目標站點 1. url:

Python 爬蟲入門之妹子圖

Python 爬蟲入門之爬取妹子圖 來源:李英傑  連結: https://segmentfault.com/a/1190000015798452   聽說你寫程式碼沒動力?本文就給你動力,爬取妹子圖。如果這也沒動力那就沒救了。   GitHub 地址:&