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() - 浏览器窗口最大化
标签:浏览器,--,selenium,self,driver,SPIDER,url,html 来源: https://www.cnblogs.com/zouzhibin/p/15939477.html