Python爬蟲,4567電影網電影信息爬取,二級頁面處理方案

目錄

4567電影網電影信息爬取

1.需求分析

2.URL分析

3.正則表達式分析 

4.程序設計

5.程序代碼


4567電影網電影信息爬取

1.需求分析

4567電影網首頁如下,點擊一部電影,看看具體的頁面呈現。

電影信息有電影名,類型,地區,年份,主演,等等。在這裏我們僅提取電影名和電影簡介 

 

 進入到電影分類頁面,我們的目的是提取某一類型所有電影的名字和簡介

 

2.URL分析

1.一級URL分析

動作欄的電影URL爲:https://www.4567tv.tv/index.php/vod/show/id/5/page/1.html

從這個URL可以得出兩條信息:

1.動作類型的電影id號爲5

2.第一頁的html爲1.html,第二頁爲2.html,依次推列

2.二級URL分析

在動作欄電影頁面右鍵查看源代碼,分析源代碼得到他的鏈接地址。

 

得出的結果爲:/movie/index29612.html

這顯然不是一個完整的URL,我們在動作欄頁面點擊肥龍過江,看到他的URL如下若是,於是我們得出結論。

二級URL="https://www.4567tv.tv"+鏈接地址

 

3.正則表達式分析 

1.二級URL正則表達式分析

我們想要的是href裏面的那一次,分析劃線部分的代碼,發現規律,於是正則表達式可以這麼寫:

<a class="stui-vodlist__thumb lazyload" href="(.*?)".*?</a>

以<a class="stui-vodlist__thumb lazyload" 開頭,(.*?)提取子模式,.*?非貪婪匹配後續,直到</a>

 

2.電影名和簡介正則表達式分析

我們要提取的信息是電影名和簡介,根據分析,發現電影名以<div class="stui-content__detail">開頭,簡介以<span class="detail-content" style="display: none;">開頭。那麼正則表達式如下:

<div class="stui-content__detail">.*?<h1 class="title">(.*?)</h1>.*?<span class="detail-content" style="display: none;">(.*?)</span>

注意:這裏有兩個子模式,所以返回的結果爲元組列表

 

4.程序設計

1.定義一個類,Movies4567_spider封裝方法

2.初始化信息,包括一級URL和正則,二級URL和正則,請求頭代理

3.定義獲取頁面的函數:get_html()

4.定義獲取一級頁面內容的函數(獲取二級頁面的URL):parse_first()

5.定義獲取二級頁面內容的函數(獲取電影名和簡介):parse_second()

6.定義正則匹配函數,返回匹配列表(這裏單獨來寫是爲了一二級頁面的解耦):regex_func()

7.定義入口函數:run()

 

5.程序代碼

from urllib import request
import re
import time
import random

class Movies4567_spider(object):
    def __init__(self):
        self.frist_url="https://www.4567tv.tv/index.php/vod/show/id/5/page/{}.html"
        self.second_url="https://www.4567tv.tv"
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
        self.regex_first = '<a class="stui-vodlist__thumb lazyload" href="(.*?)".*?</a>'
        self.regex_second = '<div class="stui-content__detail">.*?<h1 class="title">(.*?)</h1>.*?<span class="detail-content" style="display: none;">(.*?)</span>'

    #獲取頁面
    def get_html(self,url):
        req = request.Request(url=url, headers=self.headers)
        rep = request.urlopen(req)
        html = rep.read().decode("utf-8","ignore")
        return html

    #提交html頁面,正則表達式regex,返回列表
    def regex_func(self,regex,html):
        pattern=re.compile(regex,re.S)
        lists=pattern.findall(html)
        return lists

    #一級頁面:獲取二級頁面的url
    def parse_first(self,first_url):
        html_first=self.get_html(first_url)
        #獲取到二級頁面的url
        list_second=self.regex_func(self.regex_first,html_first)
        print(list_second)
        #對二級頁面做信息提取
        for i in list_second:
            # url拼接
            url_second=self.second_url+i
            item=self.parse_second(url_second)
            print(item)
            time.sleep(random.uniform(1,2))
    
    #處理二級頁面,獲取電影名和簡介
    def parse_second(self,second_url):
        #下載頁面內容
        html_second=self.get_html(second_url)
        #返回匹配內容
        info=self.regex_func(self.regex_second,html_second)
        #將返回內容打包成集合返回
        items={}
        items["name"]=info[0][0]
        items["detail"]=info[0][1]
        return items
    
    #入口函數
    def run(self):
        #獲取一到第十頁
        for i in range(1,10):
            #url拼接
            url=self.frist_url.format(i)
            self.parse_first(url)

if __name__ == "__main__":
    spider=Movies4567_spider()
    spider.run()
發佈了214 篇原創文章 · 獲贊 88 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章