其他分享
首页 > 其他分享> > SPIDER-DAY05--动态数据抓取,和selenium

SPIDER-DAY05--动态数据抓取,和selenium

作者:互联网

1. 动态加载数据抓取

1.1 AJAX动态加载

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 环境安装

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() - 浏览器窗口最大化

 

标签:浏览器,--,selenium,self,driver,SPIDER,url,html
来源: https://www.cnblogs.com/zouzhibin/p/15939477.html