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

打开https://movie.douban.com/
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第1张图片
地址有变化


注意啊观察
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第2张图片
到这里不要以为我找到了热映电影基本信息页了
下面有更多信息加载,你点击一下或出现下面情况
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第3张图片
红色部分出现就是以为是动态数据的加载,这个时候建议你打开网页源代码页
view-source:https://movie.douban.com/tv/#!type=tv&tag=热门&sort=recommend&page_limit=20&page_start=40
你会发现源代码没有任何你想要的的点数据信息,你要的东西不是静态的,那数据会在哪里呢?
这就回到动态网页分析了
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第4张图片
第一步是清空
第二步打开XHR(ajax加载信息大多数都是在这里)
第三步点击加载跟多
第四你会发现是出现很多信息
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第5张图片

这个时候点击“4”一个一个查看
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第6张图片
当你看到这个情况是注意一下,点开"Preview"


你会左边电视信息和右边一样,就可以认定这是数据源
点开"Headers" 找到URL request
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第7张图片
点击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是从什么位置开始
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第8张图片
当你改变参数时,动态页面也会发生变化。到这里就完成整个动态页面分析了
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
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第9张图片
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_
如上操作就可以得到如下
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第10张图片
接下来我们需要得到电视剧详情页的信息了
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第11张图片
在之前已经文章中已经获取豆瓣网全部信息,在这里我们只获取基本信息,如上图红色边框信息

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

如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第12张图片
如何利用正则表达式和request抓取豆瓣网热门电视剧并实现翻页_第13张图片
完整代码如下
#!/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='

.*?

' 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">(.*?)' 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='
.*?
' 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("
") 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">(.*?)',info_dict.get("directedBy",""),re.S|re.M) scenarist=re.findall('(.*?)',info_dict.get("actor",""),re.M|re.S) genre=re.findall('.*?genre">(.*?)',info_dict.get("genre",""),re.M|re.S) contry=re.findall('(.*?)$',info_dict.get("contry",""),re.S|re.M) contry=contry[0] if contry else "" language=re.findall('(.*?)$',info_dict.get("language",""),re.M|re.S) language=language[0] if language else "" release_date=re.findall('(.*?)',info_dict.get("release_date",""),re.M|re.S) total=re.findall('(.*?)$',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()

你可能感兴趣的