范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Python爬虫抓取动态加载数据

  本节讲解如何抓取豆瓣电影"分类排行榜"中的电影数据(https://movie.douban.com/chart),比如输入"犯罪"则会输出所有犯罪影片的电影名称、评分,效果如下所示:剧情|喜剧|动作|爱情|科幻|动画|悬疑|惊悚|恐怖|纪录片|短片|情色|同性|音乐|歌舞|家庭|儿童|传记|历史|战争|犯罪|西部|奇幻|冒险|灾难|武侠|古装|运动|黑色电影| 你想了解什么类型电影:犯罪 {"name": "肖申克的救赎", "score": 9.7} {"name": "控方证人", "score": 9.6} ... 电影总数量:302部123456复制代码类型:[python]确定网站类型
  首先要明确豆瓣电影网站的类型,即是动态还是静态。检查方法:右键查看网页源码—>搜索"辛德勒的名单"关键字,如下图所示:
  最终发现源码页中没有出现想要抓取的数据,只有一大堆的JS代码,由此确定该网站为动态网站。影片详情信息
  接下来,使用快捷键F12打开控制台进行抓包,点击NetWork选项卡—>XHR选项—>Preview选项卡—>刷新当前页面抓取数据包,如下图所示:
  从图2可知,我们想要抓取的数据取全部包含在当前的数据包中。当我们向下滚动鼠标滑轮时,左侧栏内的数据包会实现自动加载,这是使用Ajax异步加载技术实现的。
  通过查看数据Headers选项可以明确url地址、查询参数等信息,如下所示:
  从上图可以得知请求的基准URL(由于还未拼接查询参数,所以称之为基准URL),如下所示:"https://movie.douban.com/j/chart/top_list?"1复制代码类型:[python]
  继续滚动鼠标滑轮可知查询参数具有如下规律:type: 4  # 电影类型 interval_id: 100:90  #代表网页上滑动条的百分比(好于100%-90%的历史片) action: ""  # 空 start: 0  # 每次加载电影的起始索引值 0 20 40 60 limit: 20 # 每次加载的电影数量,1为初始值,后续加载时20固定不变12345复制代码类型:[python]
  注意:寻找规律时,后加载出来的数据包会排在最前面,除去第一个数据包外,其余数据包如下所示:影片总数量
  注意:第一个数据包反映了每个类型中电影的总数量,其url与响应信息如下:请求的URL地址 : https://movie.douban.com/j/chart/top_list_count?type=4&interval_id=100%3A90 Response信息:{"playable_count":41,"total":104,"unwatched_count":104}12复制代码类型:[java]影片类型与类型码
  影片的类型与类型码包含在电影排行榜的主界面中,如下所示:
  分析上述页面结构,然后使用正则表达式来提取想要的数据,并定义选择菜单"menu",代码如下所示:import re def get_all_type_films(self):     # 获取影片类型和类型码     url = "https://movie.douban.com/chart"     headers = self.get_headers()     html = requests.get(url=url, headers=headers).text     re_bds = r""     pattern = re.compile(re_bds, re.S)     r_list = pattern.findall(html)     # 存放所有类型和对应类型码大字典     type_dict = {}     # 定义一个选择电影类型的菜单     menu = ""     # r_list[{"剧情 , 11"},{},..]     for r in r_list:         type_dict[r[0].strip()] = r[1].strip()         # 获取input的菜单,显示所有电影类型         menu += r[0].strip() + "|"     #返回类型字典以供后续函数调用,并返回输入菜单menu     # {"剧情": "11", "喜剧": "24",...}     return type_dict, menu 12345678910111213141516171819202122复制代码类型:[python]编写完整程序
  完成上述分析后,下面开始编写Python爬虫程序,代码如下:#coding:utf8 import requests import time import random import re import json from ua_info import ua_list class DoubanSpider(object):     def __init__(self):         self.url = "https://movie.douban.com/j/chart/top_list?"         self.i = 0     # 获取随机headers     def get_headers(self):         headers = {"User-Agent":random.choice(ua_list)}         return headers     # 获取页面     def get_page(self,params):       # 将json转换为 python 数据类型,并返回       html = requests.get(url=self.url,params=params,headers=self.get_headers()).text       html=json.loads(html)       self.parse_page(html)     # 解析并保存数据     def parse_page(self,html):        item = {}         # html列表类型: [{电影1},{电影2},{电影3}...]        for one in html:             # 名称 + 评分            item["name"] = one["title"].strip()            item["score"] = float(one["score"].strip())            print(item)            self.i += 1     # 获取电影总数     def total_number(self,type_number):         # F12抓包抓到的地址,type表示电影类型         url = "https://movie.douban.com/j/chart/top_list_count?type={}&interval_id=100%3A90".format(type_number)         headers = self.get_headers()         html = requests.get(url=url,headers=headers).json()         total = int(html["total"])         return total     # 获取所有电影的类型和对应type值     def get_all_type_films(self):         # 获取类型与类型码         url = "https://movie.douban.com/chart"         headers = self.get_headers()         html = requests.get(url=url,headers=headers).text         re_bds = r""         pattern = re.compile(re_bds,re.S)         r_list = pattern.findall(html)         # 存放所有类型和对应类型码大字典         type_dict = {}         #定义一个选择电影类型的菜单         menu = ""         for r in r_list:             type_dict[r[0].strip()] = r[1].strip()             # 获取input的菜单,显示所有电影类型             menu += r[0].strip() + "|"         return type_dict,menu     # 主程序入口函数     def main(self):         # 获取type的值         type_dict,menu = self.get_all_type_films()         menu = menu + " 你想了解什么类型电影:"         name = input(menu)         type_number = type_dict[name]         # 获取电影总数         total = self.total_number(type_number)         for start in range(0,(total+1),20):            #构建查询参数             params = {                 "type" : type_number,                 "interval_id" : "100:90",                 "action" : "",                 "start" : str(start),                 "limit" : "20"             }             # 调用函数,传递params参数             self.get_page(params)             # 随机休眠1-3秒             time.sleep(random.randint(1,3))         print("电影总数量:%d部"%self.i ) if __name__ == "__main__":     spider = DoubanSpider()     spider.main()1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283复制代码类型:[python]
  输出示例:剧情|喜剧|动作|爱情|科幻|动画|悬疑|惊悚|恐怖|纪录片|短片|情色|同性|音乐|歌舞|家庭|儿童|传记|历史|战争|犯罪|西部|奇幻|冒险|灾难|武侠|古装|运动|黑色电影| 你想了解什么类型电影:科幻 {"name": "盗梦空间", "score": 9.3} {"name": "星际穿越", "score": 9.3} {"name": "楚门的世界", "score": 9.3} {"name": "机器人总动员", "score": 9.3} {"name": "蝙蝠侠:黑暗骑士", "score": 9.2} {"name": "超感猎杀:完结特别篇", "score": 9.2} {"name": "新世纪福音战士 第0:0话 诞生之始", "score": 9.2} {"name": "少年骇客:变身之谜", "score": 9.2} ... ... 电影总数量:147部12345678910111213复制代码类型:[python]
  最后我们对抓取动态网站数据做简单地总结:
  1.确定网站是否为动态网站,通过查看源码搜索相应的关键字即可确定。
  2.动态网站主要通过异步方式加载数据。触发数据加载的JS事件主要有滚动鼠标滑轮、鼠标点击、拉动滚动条等有关动作,也有一些网站通过局部更新的方式加载数据,比如有道翻译案例。
  新闻资讯-开课吧广场_第1页

比亚迪6月产销快报公布,订单车主发问产能什么时候才能跟上?相较于仍纠结在刹车门事件的美系新能源品牌,比亚迪在上半年内屡屡曝出半导体拆分上市获批海豚正式亮相DMi销售火爆百万辆纯电动车型下线等利好消息,也为比亚迪在资本市场也带来涨幅较高的提续航525公里,售价27。6万元,ModelY标准续航版上市虽然近期特斯拉刹车门引发的风波尚未停息,但从销量数据来看特斯拉旗下车型并没有受到太大影响,特别是特斯拉ModelY自上市以来销量一路走高,在国内市场的销量已经逐步超越Model3。ModelY推出标准续航版换装磷酸铁锂电池价格下探到27。6万最近特斯拉是风口浪尖上的风云人物,但这并没有打乱它的步伐。在近日,又针对ModelY车型推出标准续航版车型,共一款车型,它的续航里程可以达到525公里,并使用了磷酸铁锂电池,预计会突发特斯拉ModelSPlaid自燃车主持有11亿美元特斯拉股票特斯拉ModelSPlaid自燃近日,美国宾夕法尼亚州一辆刚刚交付的特斯拉ModelSPlaid自燃起火。车主表示,当时自己就坐在驾驶位,发现车尾冒烟后,他多次尝试解锁车门,但似乎老年人有必要戴助听器吗?为什么?老年聋常表现为听力下降(耳背)听力渐进性下降,或由于重病麻醉等原因听力突然下降能听见声音,但不知道在说什么辨别方向的能力下降60的耳背老人还伴有耳鸣。日常生活中,老年人的听力问题常纠结了很久,市区代步还是新能源汽车好,这3款动力强劲续航也长现在国内车市堪称百花齐放,消费者也深陷选择困难症,不知该如何下手。对于市区代步车而言,很多朋友都在传统油车和新能源车型之间纠结,导致购车计划一拖再拖,迟迟没有答案。不过在续航问题得车市半年报同增235新能源车从绿叶变红花封面天天见封火轮在激增这个关键词下,中国车市划下了今年中场的句号。7月6日,公安部发布最新数据,2021年上半年,全国新注册登记机动车1871万辆,与去年同期相比增加457万辆登记新能源汽车1107月9日开售!拥有人间绝绝紫的Reno6值不值得买?一文看懂作为OPPOReno系列的最新一代产品,Reno6系列自上市之初,就被寄予了厚望,而从销量数据来看,OPPOReno6系列也确实不负众望。首销当日就斩获了全网全价位段销量销售额双冠人间绝绝紫!Reno6新配色官宣,张子枫最爱的颜色会是你的菜?不难发现只有太多手机颜色匹配,现在只有两种颜色的两种颜色。像红色,绿色,黄色等一样,全部使整个手机看起来更精力充沛。今年,苹果,三星,这两个大植物,没有泥炭进入手机的新颜色,这证明小米11Ultra拍照如何?三个月使用者的无恰饭纯独立评价号称打响手机与相机拐点之战的小米11Ultra,在拍照方面的表现是否对得起这句豪迈的口号呢?这或许是很多想购买这款手机,但又未亲自使用过小米11Ultra的人心里最大的顾虑了。小米俞永福,不是阿里的张小龙本文转自媒体壹番财经作者太史詹姆斯还沉浸在高德经济特区去年美妙业绩当中的俞永福可能畅想过他会被老板委以重任,但没想到会来的这么快。7月2日,阿里高管会宣布由他执掌基于地理位置服务管
只有8000人的ampampquot袖珍小县佛坪全县只有8000人,出租车就9辆,没有红绿灯,没有肯德基麦当劳。户籍人口3万人,常驻人口8000人的小县佛坪,最近因获袖珍县称号而火了。这地方在哪?陕西汉中东北部,省会西安的西南方当前通货膨胀是在填坑时出现的,不可怕中泰证券首席经济学家李迅雷演讲摘要现在大家担心比较大的就是通胀。你看美国的通胀那么厉害,最近大宗商品价格涨得那么厉害今年我们怎么办?我们输入型通胀是不是也会很厉害?这些担心不是没有任泽区高端机械制造业从邢湾走来河北县域特色产业集群样本68机械制造是邢台市任泽区(2020年前为任县)的一张名片,传承百年,全国闻名。最近十年,他们破解百年不死,百年不活的难题,推动机械制造业从价值链低端转向中工程院院士芯片产能严重不足,中国需要8个现有中芯国际产能在6月9日于南京开幕的2021世界半导体大会主论坛上,提及芯片需求与供给的矛盾,中国工程院院士浙江大学微纳电子学院院长吴汉明称,中国需要8个现有中芯国际的产能。今年以来,汽车缺芯成3000亿芯片巨头破产重组!紫光股份紫光国微提示股权变动风险来源证券之星7月12日消息,近日,3000亿芯片巨头紫光集团被债权人申请破产重组引发了广大股民的关注。7月9日,紫光集团发布公告称,接法院通知,债权人徽商银行以紫光集团不能清偿到期顶配双显卡超级战神GX10CP7性能爆表售39999元游戏发烧友对于顶级游戏本的喜爱程度不言而喻,神舟电脑作为国内游戏本品牌领导者,在原来战神系列游戏本的基础上,推出了多款新品超级战神高端电竞游戏本。其中,超级战神GX10CP7PRO颜值与性能齐飞!华为畅享7S千元全面屏手机1499元起售2017年12月18日,华为畅享7S在西安交通大学思源体育馆正式发布。作为一款定位年轻用户群的千元品质手机,华为畅享7S搭载了海思麒麟659,配备了当下最流行的全面屏和后置双摄像头ILIFEX800智能视觉导航扫地机器人家庭清洁好助手每个人都喜欢大房子,除了每天打扫卫生的时候。家庭生活日常中打扫卫生这个再正常不过的事情,通常我们采用的都是传统的清洁方式,随着科技的发展扫帚逐渐被吸尘器所替代,虽然在效果以及效率上货都没有就先收钱X猫号称iPhoneX敞开购近日,备受瞩目的iPhone全新旗舰机型iPhoneX正式开启预售,销售情况异常的火爆,一扫iPhone8销售萎靡的状态。借着iPhoneX预售火爆的东风,各大销售平台也在不断的吹双冠称雄竟不是小米!雷军最不愿看到的事还是发生了在今年双11大战还未打响之前,一向风生水起的手机厂家之间的较量更是进入了白热化。截止到11月11日14点,荣耀手机领跑京东平台手机销量冠军,以及中国手机品牌销售额双料冠军!在这个已第一个敢在电影院办体验会的头戴私人影院Cinera之初体验11月8日由首影科技(深圳)有限公司主办的2017年Cinera头戴私人影院京东众筹体验会活动在北京悠唐生活广场博纳国际影城举办,这也是Cinera头戴私人影院上线京东众筹的第2天