SPIDER-DAY05--动态数据抓取,和selenium
1. 动态加载数据抓取
1.1 AJAX动态加载
-
【1】右键 -> 查看网页源码中没有具体数据
【2】滚动鼠标滑轮或其他动作时加载,或者页面局部刷新 -
分析流程
【1】F12打开控制台,页面动作抓取网络数据包
【2】抓取json文件URL地址
2.1) 控制台中 XHR :异步加载的数据包
2.2) XHR -> QueryStringParameters(查询参数)
1.2 豆瓣电影爬虫
1.2.1 项目需求
【1】地址: 豆瓣电影 - 排行榜 - 剧情
【2】目标: 电影名称、电影评分
1.2.2 抓包分析
【1】Request URL(基准URL地址) :https://movie.douban.com/j/chart/top_list?
【2】Query String(查询参数)
# 抓取的查询参数如下:
type: 13 # 电影类型
interval_id: 100:90
action: ''
start: 0 # 每次加载电影的起始索引值 0 20 40 60
limit: 20 # 每次加载的电影数量
1.2.3 代码实现
"""
抓取豆瓣电影排行榜
在此代码基础上做如下扩展:
1、自动抓取剧情类别下的所有电影(获取电影总数)
2、抓取所有类别的所有电影
运行效果如下
请输入电影类别(剧情|喜剧|动作|爱情|....):爱情
结果:抓取爱情类别下的所有电影
"""
import requests
import json
import time
import random
from fake_useragent import UserAgent
import re
?
class DouBanSpider:
def __init__(self):
self.url = 'https://movie.douban.com/j/chart/top_list?type={}&interval_id=100%3A90&action=&start={}&limit=20'
?
def get_html(self, url):
"""请求功能函数"""
headers = {'User-Agent':UserAgent().random}
html = requests.get(url=url, headers=headers).text
?
return html
?
def parse_html(self, url):
"""爬虫逻辑函数"""
html = self.get_html(url=url)
# html: [{},{},...{}]
html = json.loads(html)
for one_film_dict in html:
item = {}
item['rank'] = one_film_dict['rank']
item['title'] = one_film_dict['title']
item['score'] = one_film_dict['score']
item['time'] = one_film_dict['release_date']
print(item)
?
def get_dic(self):
"""获取所有类别和对应type值的大字典"""
url = 'https://movie.douban.com/chart'
html = self.get_html(url=url)
regex = ''
# r_list: [('剧情','11'), ('喜剧','23'), ...]
r_list = re.findall(regex, html, re.S)
dic = {}
for r in r_list:
dic[r[0]] = r[1]
?
return dic
?
def get_total(self, type_num):
"""获取电影总数量"""
url = 'https://movie.douban.com/j/chart/top_list_count?type={}&interval_id=100%3A90'.format(type_num)
html = self.get_html(url=url)
html = json.loads(html)
total = html['total']
?
return total
?
def crawl(self):
# 大字典:{"剧情":"11", '喜剧':'24', '爱情':'13', ....}
dic = self.get_dic()
# 生成显示的菜单
menu = ''
for item in dic:
menu += item + '|'
print(menu)
# 让用户选择