返回列表 发帖

网络爬虫_爬(豆瓣电影)

例子一:
保存通过URL(https://movie.douban.com)获取到的网页源代码和内容:

笺注:
当前很多网站都有反爬虫机制,对于爬虫请求会一律拒绝。
网站的程序是怎样区分一个请求是正常请求还是爬虫程序发出的请求呢?
网站的程序其实是通过判断发送请求中是否有浏览器信息,从而区分一个请求是正常请求还是爬虫程序发出的请求。
当访问有反爬虫机制的网站时,可以在请求中设置浏览器信息(伪装成浏览器),这是通过修改http包中的headers实现。


脚本内容:
#coding=utf-8
import urllib.request #内置模块,无需额外安装

headers = {
'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201Firefox/3.5.6'
}

url_1 = 'https://movie.douban.com' #网站 (豆瓣电影)的URL

ret = urllib.request.Request(url_1,headers = headers)
response = urllib.request.urlopen(ret)

Key_1 = response.read().decode("utf-8")

Path_1 = "./1.txt"

f_name = open(Path_1,'w',encoding='utf-8') #写入(覆盖)文件内容
Result_1 = f_name.write(Key_1)

f_name.close()


运行脚本的结果:(脚本所在目录下会生成文件1.txt,文件里会包含网页源代码和内容)
C:\Users\jacky\Desktop>python xx.py

C:\Users\jacky\Desktop>





######

例子二:
从例子一获取的数据中筛选出版块[正在热映]下的所有电影名称:

笺注:
版块[正在热映]的电影名称格式,如下:
<li class="ui-slide-item"  data-title="边缘行者" data-release="2022" data-rate="5.3" data-star="30" data-trailer="https://movie.douban.com/subject/35192672/trailer" data-ticket="https://movie.douban.com/ticket/redirect/?movie_id=35192672" data-duration="113分钟" data-region="中国大陆" data-director="黄明升" data-actors="任贤齐 / 任达华 / 方中信" data-intro="" data-enough="true" data-rater="12771">

<li class="ui-slide-item"  data-title="少年英雄董存瑞" data-release="2022" data-rate="" data-star="00" data-trailer="https://movie.douban.com/subject/35917114/trailer" data-ticket="https://movie.douban.com/ticket/redirect/?movie_id=35917114" data-duration="82分钟" data-region="中国大陆" data-director="张利鹏" data-actors="林子杰 / 高宇阳 / 赵中华" data-intro="" data-enough="false" data-rater="4">

<li class="ui-slide-item"  data-title="小妈妈 Petite maman" data-release="2021" data-rate="7.9" data-star="40" data-trailer="https://movie.douban.com/subject/35225859/trailer" data-ticket="https://movie.douban.com/ticket/redirect/?movie_id=35225859" data-duration="72分钟" data-region="法国" data-director="瑟琳·席安玛" data-actors="约瑟芬·桑兹 / 加布里埃尔·桑兹 / 尼娜·梅尔瑞斯" data-intro="" data-enough="true" data-rater="11007">


脚本内容:
#coding=utf-8
import re #导入正则表达式的模块;内置模块,无需额外安装

from io import StringIO
String_1 = StringIO()

def func1(): #读取文件内容
        Path_1 = "./1.txt"
        f_name = open(Path_1,'r',encoding='utf-8')

        fields_1 = f_name.readlines() #输出结果为列表,包含换行符
        f_name.close()
       
        func2(fields_1)

       
def func2(fields_1): #从func1()获得的数据中进行筛选

        print('版块[正在热映]下的所有电影名称:')
       
        K_1 = 'data-title=' #关键字

        for Key_1 in fields_1:
                if K_1 in Key_1:
                       
                        Result_1 = re.compile(u'<li.*?data-title="(.*?)".*?')
                        Result_2 = Result_1.findall(Key_1)
                        print(Result_2[0])
                       
                        Result_3 = f"{Result_2[0]}\n"
                        String_1.write(Result_3)
                       
        Result_4 = String_1.getvalue()
       
        func3(Result_4)
       
       
def func3(Result_4): #把电影名称保存到文件

        Path_1 = "./2.txt"

        f_name = open(Path_1,'w',encoding='utf-8') #写入(覆盖)文件内容
        Result_1 = f_name.write(Result_4)

        f_name.close()
       

if __name__ == '__main__':

        func1()


脚本运行的结果:
C:\Users\jacky\Desktop>python xx.py
版块[正在热映]下的所有电影名称:
哆啦A梦:大雄的宇宙小战争2021 ドラえもん のび太の宇宙小戦争リトル・スター・ウォーズ2021
刿心剑
边缘行者
超级特战队
盒子的秘密
亡命救护车 Ambulance
少年英雄董存瑞
小妈妈 Petite maman
加加林 Gagarine


C:\Users\jacky\Desktop>


脚本所在目录下会生成文件2.txt,文件里会包含版块[正在热映]下的所有电影名称:
图片1.png
2022-6-1 23:09






######

例子三:
获取电影《长津湖之水门桥》的相关内容:

笺注:
电影相关信息的格式,如下:
<i class="">长津湖之水门桥的剧情简介</i>

<p>导演 徐克 主演 吴京 / 易烊千玺 / 中国大陆 / 中国香港 / 7.2分(286069评价)</p>

<span property="v:summary" class="">
                                  电影以抗美援朝战争第二次战役中的长津湖战役为背景,讲述了在结束了新兴里和下碣隅里的战斗之后,七连战士们又接到了更艰巨的任务……
                        </span>

注释:简介那里有两次换行,多了两个换行符\n



脚本内容:
#coding=utf-8
import re
import urllib.request

def func1(): #获取电影《长津湖之水门桥》的网页源代码和内容
        headers = {
        'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201Firefox/3.5.6'
        }

        url_1 = 'https://movie.douban.com/subject/35613853/?tag=%E7%83%AD%E9%97%A8&from=gaia_video' #电影《长津湖之水门桥》的URL

        ret = urllib.request.Request(url_1,headers = headers)
        response = urllib.request.urlopen(ret)

        Key_1 = response.read().decode("utf-8")

        Path_1 = "./3.txt"

        f_name = open(Path_1,'w',encoding='utf-8') #写入(覆盖)文件内容
        Result_1 = f_name.write(Key_1)

        f_name.close()
       
        func2()
       
       
def func2(): #从文件中读取数据   
        Path_1 = "./3.txt"
        f_name = open(Path_1,'r',encoding='utf-8')

        fields_1 = f_name.read() #输出文件全部内容
        f_name.close()
   
        func3(fields_1)
        func4(fields_1)
        func5(fields_1)
       
       
def func3(fields_1): #输出电影名称
        Result_1 = re.compile(u'<i class=.*?>(.*?)的剧情简介</i>.*?')
        Result_2 = Result_1.findall(fields_1)
        print("电影名称:",Result_2[0])
       
        Result_3 = f"{Result_2[0]}\n"
       
        Path_1 = "./4.txt"
        f_name = open(Path_1,'a',encoding='utf-8') #写入(追加)文件内容
        Result_1 = f_name.write(Result_3)
        f_name.close()
       
       
def func4(fields_1): #输出导演、主演、产地、豆瓣评分
        Result_1 = re.compile(u'.*?<p>导演(.*?)</p>.*?')
        Result_2 = Result_1.findall(fields_1)
        print(f"导演、主演、产地、豆瓣评分:导演{Result_2[0]}")
       
        Result_3 = f"导演{Result_2[0]}\n"
       
        Path_1 = "./4.txt"
        f_name = open(Path_1,'a',encoding='utf-8') #写入(追加)文件内容
        Result_1 = f_name.write(Result_3)
        f_name.close()
       
       
def func5(fields_1): #输出电影简介
        Result_1 = re.compile(u'<span property="v:summary.*?>\n(.*?)</span>.*?',re.S) # re.S 包括换行符\n在内的任意字符;换行符\n可以不写
        Result_2 = Result_1.findall(fields_1)
        Result_3 = Result_2[0].strip() #去除左边和右边的空格、换行符
        print("电影简介:",Result_3)
       
        Result_3 = f"{Result_3}\n"
       
        Path_1 = "./4.txt"
        f_name = open(Path_1,'a',encoding='utf-8') #写入(追加)文件内容
        Result_1 = f_name.write(Result_3)
        f_name.close()

if __name__ == '__main__':

        func1()


脚本运行的结果:(脚本所在目录下会生成文件3.txt,文件里会包含电影《长津湖之水门桥》的所有网页源代码和内容)
C:\Users\jacky\Desktop>python xx.py
电影名称: 长津湖之水门桥
导演、主演、产地、豆瓣评分:导演 徐克 主演 吴京 / 易烊千玺 / 中国大陆 / 中国香港 / 7.2分(286472评价)
电影简介: 电影以抗美援朝战争第二次战役中的长津湖战役为背景,讲述了在结束了新兴里和下碣隅里的战斗之后,七连战士们又接到了更艰巨的任务……

C:\Users\jacky\Desktop>


笺注:
脚本所在目录下会生成文件4.txt,文件里会包含电影《长津湖之水门桥》的如下内容:
长津湖之水门桥
导演 徐克 主演 吴京 / 易烊千玺 / 中国大陆 / 中国香港 / 7.2分(286472评价)
电影以抗美援朝战争第二次战役中的长津湖战役为背景,讲述了在结束了新兴里和下碣隅里的战斗之后,七连战士们又接到了更艰巨的任务……






######

例子四:
获取电影《新边缘行者》的相关内容:

笺注:
电影相关信息的格式,如下:
<i class="">边缘行者的剧情简介</i>

<p>导演 黄明升 主演 任贤齐 / 任达华 / 中国大陆 / 中国香港 / 5.3分(12775评价)</p>

<span property="v:summary" class="">
                                  1997年回归前夕,多方势力矛盾激化,暴力事件频发。
                                    <br />
                                  巨变当前,黑帮龙头林耀昌(任达华 饰)对亲信阿骆(任贤齐 饰)委以帮派重任。多重身份的阿骆在黑白边缘行走,一场除暴行动正悄然掀开反杀的序幕。
                        </span>                    

注释:跟例子三相比,简介那里除了多换行符\n,多了个“<br />



脚本内容:
#coding=utf-8
import re
import urllib.request

def func1(): #获取电影《边缘行者》的网页源代码和内容
        headers = {
        'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201Firefox/3.5.6'
        }

        url_1 = 'https://movie.douban.com/subject/35192672/?from=showing'

        ret = urllib.request.Request(url_1,headers = headers)
        response = urllib.request.urlopen(ret)

        Key_1 = response.read().decode("utf-8")

        Path_1 = "./5.txt"

        f_name = open(Path_1,'w',encoding='utf-8') #写入(覆盖)文件内容
        Result_1 = f_name.write(Key_1)

        f_name.close()
       
        func2()
       
       
def func2(): #从文件中读取数据   
        Path_1 = "./5.txt"
        f_name = open(Path_1,'r',encoding='utf-8')

        fields_1 = f_name.read() #输出文件全部内容
        f_name.close()
   
        func3(fields_1)
        func4(fields_1)
        func5(fields_1)
       
       
def func3(fields_1): #输出电影名称
        Result_1 = re.compile(u'<i class=.*?>(.*?)的剧情简介</i>.*?')
        Result_2 = Result_1.findall(fields_1)
        print("电影名称:",Result_2[0])
       
        Result_3 = f"电影名称:{Result_2[0]}\n"
       
        Path_1 = "./6.txt"
        f_name = open(Path_1,'a',encoding='utf-8') #写入(追加)文件内容
        Result_1 = f_name.write(Result_3)
        f_name.close()
       
       
def func4(fields_1): #输出导演、主演、产地、豆瓣评分
        Result_1 = re.compile(u'.*?<p>导演(.*?)</p>.*?')
        Result_2 = Result_1.findall(fields_1)
        print(f"导演、主演、产地、豆瓣评分:导演{Result_2[0]}")
       
        Result_3 = f"导演、主演、产地、豆瓣评分:导演{Result_2[0]}\n"
       
        Path_1 = "./6.txt"
        f_name = open(Path_1,'a',encoding='utf-8') #写入(追加)文件内容
        Result_1 = f_name.write(Result_3)
        f_name.close()
       
       
def func5(fields_1): #输出电影简介
        Result_1 = re.compile(u'<span property="v:summary.*?>(.*?)</span>.*?',re.S) # re.S 包括换行符\n在内的任意字符;换行符\n可以不写
        Result_2 = Result_1.findall(fields_1)
        Result_3 = Result_2[0].strip() #去除左边和右边的空格、换行符
       
        a = Result_3.split('<br />')[0].strip() #去除“<br />
        b = Result_3.split('<br />')[1].strip()
        Result_4 = a + b
        print("电影简介:",Result_4)
       
        Result_5 = f"电影简介:{Result_4}\n"
       
        Path_1 = "./6.txt"
        f_name = open(Path_1,'a',encoding='utf-8') #写入(追加)文件内容
        Result_1 = f_name.write(Result_5)
        f_name.close()


if __name__ == '__main__':

        func1()


脚本运行的结果:(脚本所在目录下会生成文件5.txt,文件里会包含电影《边缘行者》的所有网页源代码和内容)
C:\Users\jacky\Desktop>python xx.py
电影名称: 边缘行者
导演、主演、产地、豆瓣评分:导演 黄明升 主演 任贤齐 / 任达华 / 中国大陆 / 中国香港 / 5.3分(12780评价)
电影简介: 1997年回归前夕,多方势力矛盾激化,暴力事件频发。巨变当前,黑帮龙头林耀昌(任达华 饰)对亲信阿骆(任贤齐 饰)委以帮派重任。多重身份的阿骆在黑白边缘行走,一场除暴行动正悄然掀开反杀的序幕。

C:\Users\jacky\Desktop>


笺注:
脚本所在目录下会生成文件6.txt,文件里会包含电影《边缘行者》的如下内容:
电影名称:边缘行者
导演、主演、产地、豆瓣评分:导演 黄明升 主演 任贤齐 / 任达华 / 中国大陆 / 中国香港 / 5.3分(12791评价)
电影简介:1997年回归前夕,多方势力矛盾激化,暴力事件频发。巨变当前,黑帮龙头林耀昌(任达华 饰)对亲信阿骆(任贤齐 饰)委以帮派重任。多重身份的阿骆在黑白边缘行走,一场除暴行动正悄然掀开反杀的序幕。






相关文章:
正则表达式
文件操作(创建、读取、写入、追加)
网络爬虫_爬(blog.zhuohua.store)

返回列表