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 = '<span><a href=.*?type_name=(.*?)&type=(.*?)&interval_id=100:90&action=">'
       # 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)
       # 让用户选择
       choice = input('请输入电影类别:')
       type_num = dic[choice]
       # 计算此类别电影总数
       total = self.get_total(type_num)
       for start in range(0, total, 20):
           page_url = self.url.format(type_num, start)
           self.parse_html(url=page_url)
           # 控制频率
           time.sleep(random.uniform(0, 1))

if __name__ == '__main__':
   spider = DouBanSpider()
   spider.crawl()

2. selenium爬虫

2.1 selenium概述

【1】定义
   1.1) 开源的Web自动化测试工具
   
【2】用途
   2.1) 对Web系统进行功能性测试,版本迭代时避免重复劳动
   2.2) 兼容性测试(测试web程序在不同操作系统和不同浏览器中是否运行正常)
   2.3) 对web系统进行大数量测试
   
【3】特点
   3.1) 可根据指令操控浏览器
   3.2) 只是工具,必须与第三方浏览器结合使用
   
【4】安装
   4.1) Linux: sudo pip3 install selenium
   4.2) Windows: python -m pip install selenium

2.2 PhantomJS概述

phantomjs为*面浏览器(又称无头浏览器),在内存中进行页面加载,高效

2.3 环境安装

  • 环境安装

    【1】环境说明('以下三种环境任意安装其中一种即可')
    环境一:selenium + PhantomJS
    环境二:selenium + chromedriver + Chrome ('我们安装此版本')
    环境三:selenium + geckodriver + Firefox

    【2】提前下载驱动
    2.1) chromedriver : 下载对应版本
           http://npm.taobao.org/mirrors/chromedriver/
    2.2) geckodriver
           https://github.com/mozilla/geckodriver/releases
    2.3) phantomjs
           https://phantomjs.org/download.html
               
    【3】添加到系统环境变量
       2.1) windows: 将解压后的可执行文件拷贝到Python安装目录的Scripts目录中
            windows查看python安装目录(cmd命令行):where python
       2.2) Linux :  将解压后的文件拷贝到/usr/bin目录中
            sudo cp chromedriver /usr/bin/
           
    【3】Linux中需要修改权限
       sudo chmod 777 /usr/bin/chromedriver
       
    【4】验证
    4.1) Ubuntu | Windows
    from selenium import webdriver
    webdriver.Chrome()
    webdriver.Firefox()

    4.2) Mac
    from selenium import webdriver
    webdriver.Chrome(executable_path='/Users/xxx/chromedriver')
    webdriver.Firefox(executable_path='/User/xxx/geckodriver')

3. selenium详解

3.1 代码演示

"""
使用selenium打开浏览器,进入百度的搜索页面
"""
# 导入selenium的webdriver接口
from selenium import webdriver

# 1.打开浏览器 - 创建浏览器对象
driver = webdriver.Chrome()
# 浏览器窗口最大化
driver.maximize_window()
# 2.在地址栏输入 百度的URL地址
driver.get(url='http://www.baidu.com/')
# 3.page_source属性:获取HTML结构源码
html = driver.page_source
# quit(): 关闭浏览器
driver.quit()
"""示例代码二:打开百度,搜索高圆圆,点击搜索,查看"""

from selenium import webdriver

# 1. 打开浏览器,输入百度URL地址
driver = webdriver.Chrome()
driver.get(url='http://www.baidu.com/')
# 2. 找到搜索框节点,并发送关键字:高圆圆
node = driver.find_element_by_xpath('//*[@id="kw"]')
node.send_keys('高圆圆')
# 3. 找到 百度一下 按钮,并点击确认
driver.find_element_by_xpath('//*[@id="su"]').click()

3.2 浏览器对象方法

【1】driver.get(url=url)   - 地址栏输入url地址并确认
【2】driver.quit()         - 关闭浏览器
【3】driver.close()        - 关闭当前页
【4】driver.page_source    - HTML结构源码
【5】driver.page_source.find('字符串')
    从html源码中搜索指定字符串,没有找到返回:-1,经常用于判断是否为最后一页
【6】driver.maximize_window() - 浏览器窗口最大化

 

上一篇:html,css笔记


下一篇:WebRTC Qos策略--PACER网络报文平滑策略