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()
发布了209 篇原创文章 · 获赞 85 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/ck784101777/article/details/104271725