1.selenium是什么?
Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本
2.selenium的优点
1.因为是浏览器自动化操作,所以没有反爬机制的限制。
2.能够适应很多浏览器,包括chrome、firefox、ie等主流浏览器,同时各浏览器拥有不同的驱动程序。
3.适合动态网页的爬取,selenium使用的等待操作可以很好的适应动态网页的动态加载问题。
3.项目实战
1.爬虫代码
目标:爬取某宝上的关于七夕的数据,少量测试,只做学习使用,主要代码(因为是刚开始使用Selenium框架,重在目标的实现,代码结构有待完善,可以整合Scrapy框架等)
import json
from typing import Text
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
data={
"title": {
"text": '七夕销量和价格分析',
"subtext": '数据来自网络'
},
"tooltip": {
"trigger": 'axis',
"axisPointer": {
"type": 'shadow'
}
},
"legend": {
"data": ['销量', '价格']
},
"grid": {
"left": '3%',
"right": '4%',
"bottom": '3%',
"containLabel": "true"
},
"xAxis": {
"type": 'value',
"boundaryGap": [0, 0.01]
},
"yAxis": {
"type": 'category'
},
"series": [
{
"name": '销量',
"type": 'bar'
},
{
"name": '价格',
"type": 'bar'
}
]
}
opt = Options()
# 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数
opt.add_argument('--headless')
# 创建chrome无界面对象
browser = webdriver.Chrome(options=opt)
lists_name=[]
lists_sell=[]
lists_value=[]
for i in range(0,10):
print("正在爬取第{0}页数据-----------------------".format(i))
browser.get("https://uland.taobao.com/sem/tbsearch?keyword=%E4%B8%83%E5%A4%95&pnum={0}".format(i))
browser.execute_script("window.scrollBy(0,4000)")
wait = WebDriverWait(browser,10)
element=wait.until(EC.presence_of_element_located((By.XPATH,"//ul[@class='pc-search-items-list']")))
li=element.find_elements_by_xpath("//li[@class='pc-items-item item-undefined']")
for item in li:
title_text=item.find_element_by_class_name("title-text").text
lists_name.append(title_text)
# dict["ord_price"]=item.find_element_by_class_name("coupon-price-old").text
newprice=item.find_element_by_class_name("coupon-price-afterCoupon").text
lists_value.append(newprice)
# data[""]=item.find_element_by_class_name("seller-name").text
sell_info=item.find_element_by_class_name("sell-info").text
lists_sell.append(sell_info.split()[1])
print("第{0}页数据爬取完成".format(i))
browser.close()
data["yAxis"]["data"]=lists_name
data["series"][0]["data"]=lists_sell
data["series"][1]["data"]=lists_value
with open("./数据.json","a") as a:
a.write(json.dumps(data,ensure_ascii=False))
2.HTML演示页面代码
<!--
THIS EXAMPLE WAS DOWNLOADED FROM https://echarts.apache.org/examples/zh/editor.html?c=bar-y-category
-->
<!DOCTYPE html>
<html style="height: 2000%">
<head>
<meta charset="utf-8">
</head>
<body style="height: 100%; margin: 0">
<div id="container" style="height: 100%"></div>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
<!-- Uncomment this line if you want to dataTool extension
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/extension/dataTool.min.js"></script>
-->
<!-- Uncomment this line if you want to use gl extension
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-gl@2/dist/echarts-gl.min.js"></script>
-->
<!-- Uncomment this line if you want to echarts-stat extension
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts-stat@latest/dist/ecStat.min.js"></script>
-->
<!-- Uncomment this line if you want to use map
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/china.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/map/js/world.js"></script>
-->
<!-- Uncomment these two lines if you want to use bmap extension
<script type="text/javascript" src="https://api.map.baidu.com/api?v=2.0&ak=<Your Key Here>"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/extension/bmap.min.js"></script>
-->
<script type="text/javascript">
var dom = document.getElementById("container");
var myChart = echarts.init(dom);
var app = {};
var option;
option = //爬到的数据
if (option && typeof option === 'object') {
myChart.setOption(option);
}
</script>
</body>
</html>
3.运行效果
希望大家喜欢,求赞,谢谢