如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页

打开https://movie.douban.com/
在这里插入图片描述
地址有变化
在这里插入图片描述
在这里插入图片描述
注意啊观察
在这里插入图片描述
到这里不要以为我找到了热映电影基本信息页了
下面有更多信息加载,你点击一下或出现下面情况
在这里插入图片描述
红色部分出现就是以为是动态数据的加载,这个时候建议你打开网页源代码页
view-source:https://movie.douban.com/tv/#!type=tv&tag=热门&sort=recommend&page_limit=20&page_start=40
你会发现源代码没有任何你想要的的点数据信息,你要的东西不是静态的,那数据会在哪里呢?
这就回到动态网页分析了
在这里插入图片描述
第一步是清空
第二步打开XHR(ajax加载信息大多数都是在这里)
第三步点击加载跟多
第四你会发现是出现很多信息
在这里插入图片描述

这个时候点击“4”一个一个查看
在这里插入图片描述
当你看到这个情况是注意一下,点开"Preview"

在这里插入图片描述
你会左边电视信息和右边一样,就可以认定这是数据源
点开"Headers" 找到URL request
在这里插入图片描述
点击https://movie.douban.com/j/search_subjects?type=tv&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0
最近热播点数据信息都在这里
这个时候点击“Headers”,拉倒最下面,找到如下界面红色框内信息
在这里插入图片描述
type 类型,是电影还是电视剧动漫
tag 标志热门还是冷门
sort 分类
page_limit 每个页面限制多少条信息
page_start是从什么位置开始
在这里插入图片描述
当你改变参数时,动态页面也会发生变化。到这里就完成整个动态页面分析了
https://movie.douban.com/j/search_subjects?是网站的基本位置

def get_one_page():
‘’’
url=‘https://movie.douban.com/j/search_subjects?type=tv&tag=热门&sort=recommend&page_limit=20&page_start=0
其实电影信息真实网页是这样的,但是为了后面功能我们要构造url
:return:
‘’’
data={
“type”: “tv”,
“tag”: “热门”,
“sort”: “recommend”,
“page_limit”: 20,
“page_start”: 0
}
#构造url
start_url='https://movie.douban.com/j/search_subjects?’
url=start_url+urlencode(data)
#print(url)
res=requests.get(url,proxies=proxies,headers=headers)
if res.status_code==200:
cont=res.content.decode()
return cont
在这里插入图片描述
cover就是海报url,url是电视剧的详情页url这是我们必须得到的
下面只要解析就好了这页就好了
def parse_one_page(cont):
cont=json.loads(cont)
info_=[]
if cont and ‘subjects’ in cont.keys():
for items in cont.get(‘subjects’):
espisode_name_=items.get(“title”)
espisode_url_=items.get(“url”)
espisode_img_url=items.get(“cover”)
espisode_info={
“espisode_name_”:espisode_name_,
“espisode_url_”:espisode_url_,
“espisode_img_url”:espisode_img_url
}
info_.append(espisode_info)
return info_
如上操作就可以得到如下
在这里插入图片描述
接下来我们需要得到电视剧详情页的信息了
在这里插入图片描述
在之前已经文章中已经获取豆瓣网全部信息,在这里我们只获取基本信息,如上图红色边框信息

获取电视基本信息如下‘真好一百条’

在这里插入图片描述
在这里插入图片描述
完整代码如下
#!/usr/bin/env python

-- coding: utf-8 --

@File : hotdianshiju.py

@Software: PyCharm

import requests
import re
from urllib.parse import urlencode
import json
from demo01.util import buid_proxy,get_header
proxies=buid_proxy()
headers=get_header()

import time
#获取电影信息第一个网页
def get_one_page(offset):
‘’’
url=‘https://movie.douban.com/j/search_subjects?type=tv&tag=热门&sort=recommend&page_limit=20&page_start=0
其实电影信息真实网页是这样的,但是为了后面功能我们要构造url
:return:
‘’’
data={
“type”: “tv”,
“tag”: “热门”,
“sort”: “recommend”,
“page_limit”: offset,
“page_start”: 0
}
#构造url
start_url='https://movie.douban.com/j/search_subjects?’
url=start_url+urlencode(data)
#print(url)
res=requests.get(url,proxies=proxies,headers=headers)
if res.status_code==200:
cont=res.content.decode()
return cont

def parse_one_page(cont):
#cont解压
cont=json.loads(cont)
info_=[]
#
if cont and ‘subjects’ in cont.keys():
for items in cont.get(‘subjects’):
espisode_name_=items.get(“title”)
espisode_url_=items.get(“url”)
espisode_img_url=items.get(“cover”)
espisode_info={
“espisode_name_”:espisode_name_,
“espisode_url_”:espisode_url_,
“espisode_img_url”:espisode_img_url
}
info_.append(espisode_info)
return info_

def get_detail_info(espisode_info):
espisode_info_=[]
#在上个方法中我们得到了电视剧基本信息并且以key-value对形式存储在list中,这个是要拿出每个电视剧详情页url就好
for items in espisode_info:
espisode_d={
“title”:"",
“directedBy”:"",
“scenarist”: “”,
“actor”: “”,
“genre”: “”,
“contry”: “”,
“language”: “”,
“release_date”: “”,
“total”: “”
,
}
espisode_name_=items.get(“espisode_name_”)
espisode_url_=items.get(“espisode_url_”)

    res=requests.get(espisode_url_,proxies=proxies,headers=headers)
    #print(espisode_name_,espisode_url_)
    if res.status_code==200:
        detail_html=res.content.decode()

        re_title='<h1>.*?</h1>'
        re_title_block=re.search(re_title,detail_html,re.S|re.M)
        re_title_block_res=re_title_block.group() if re_title_block else ""
        title_block_res='itemreviewed">(.*?)</span>'
        title=re.findall(title_block_res,re_title_block_res,re.S|re.M)
        espisode_d["title"]="".join(title)
        #print(title)

        #其他基本信息都在id="id"
        re_info='<div id="info">.*?</div>'
        cont_info_res=re.search(re_info,detail_html,re.S|re.M)
        cont_info=cont_info_res.group() if cont_info_res else ""
        cont_list=cont_info.split("<br/>")
        info_dict=dict()
        for info in cont_list:
            if "导演" in info:
                info_dict["directedBy"]=info
            elif "编剧" in info:
                info_dict["scenarist"] = info
            elif "主演" in info:
                info_dict["actor"] = info
            elif "类型" in info:
                info_dict["genre"] = info
            elif "制片国家/地区" in info:
                info_dict["contry"] = info
            elif "语言" in info:
                info_dict["language"] = info
            elif "首播" in info:
                info_dict["release_date"] = info
            elif "集数" in info:
                info_dict["total"] = info
        directedBy=re.findall('.*?directedBy">(.*?)</a>',info_dict.get("directedBy",""),re.S|re.M)
        scenarist=re.findall('<a href="/subject_search?.*?>(.*?)</a>',info_dict.get("scenarist",""),re.M|re.S)
        actor=re.findall('.*?starring">(.*?)</a>',info_dict.get("actor",""),re.M|re.S)
        genre=re.findall('.*?genre">(.*?)</span>',info_dict.get("genre",""),re.M|re.S)
        contry=re.findall('</span>(.*?)$',info_dict.get("contry",""),re.S|re.M)
        contry=contry[0]    if contry else ""
        language=re.findall('</span>(.*?)$',info_dict.get("language",""),re.M|re.S)
        language=language[0] if language else ""
        release_date=re.findall('<span property="v:initialReleaseDate".*?">(.*?)</span>',info_dict.get("release_date",""),re.M|re.S)
        total=re.findall('</span>(.*?)$',info_dict.get("total",""),re.S|re.M)
        total= total[0] if total else ""
        espisode_d["directedBy"]="/".join(directedBy)
        espisode_d["scenarist"]="/".join(scenarist)
        espisode_d["actor"]="/".join(actor)
        espisode_d["genre"]="".join(genre)
        espisode_d["contry"]="/".join(contry)
        espisode_d["language"]=" ".join(language)
        espisode_d["release_date"]="".join(release_date)
        espisode_d["total"]="".join(total)
        espisode_info_.append(espisode_d)
return espisode_info_

path=‘E:/test001/douban/espisode/’
def save_to_file(detail_cont):
‘’’
file_path下载电影基本信息的时候同时创建电影信息文件,
:param detail_info:
:return:
‘’’
file_path=path+time.strftime("%Y_%m_%d")+’.json’
print(“正在下载热映中的电视剧”)
for i,items in enumerate(detail_cont):
title=items.get(“title”)
print(i,title)
with open(file_path,‘w’,encoding=‘utf-8’) as f_f:
f_f.write(str(detail_cont))
f_f.write("\n")
f_f.close()
def save_img_dir(espisode_info):
for items in espisode_info:
espisode_img_url=items.get(“espisode_img_url”)
espisode_name_=items.get(“espisode_name_”)
#print(espisode_name_)
res=requests.get(espisode_img_url,proxies=proxies,headers=headers)
content=res.content
img_path=path+espisode_name_+’.jpg’
with open(img_path,‘wb’) as f:
f.write(content)
f.close()

def main():
for i in range(5):
offset=i*20
cont=get_one_page(offset)
# print(cont)
espisode_info=parse_one_page(cont)
# print(espisode_info)
detail_cont=get_detail_info(espisode_info)
#print(detail_cont)
save_to_file(detail_cont)
save_img_dir(espisode_info)

if name == ‘main’:
main()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值