# 介绍:
1.selenium是一个web自动化测试用的框架. 程序员可以通过代码实现对浏览器的控制,
比如打开网页, 点 击网页中的元素, 实现鼠标滚动等操作.
2.它支持多款浏览器, 如谷歌浏览器, 火狐浏览器等等, 当然也支持无头浏览器.
# 目的:
在爬取数据的过程中, 经常遇到动态数据加载, 一般动态数据加载有两种,
一种通过ajax请求加载数据, 另 一种通过js代码加载动态数据.
selenium可以模拟人操作真实浏览器, 获取加载完成的页面数据
ajax:
url有规律且未加密, 直接构建url连接请求
url加密过无法破解规律 --> selenium
js动态数据加载 --> selenium
三要素: 浏览器, 驱动程序, selenium框架
浏览器: 推荐谷歌浏览器, 标准稳定版本 驱动程序:
http://chromedriver.storage.googleapis.com/index.html pip install selenium
# 测试:
from selenium import webdriver
# 将驱动放在脚本所在的文件夹
browser = webdriver.Chrome('./chromedriver.exe')
browser.get('https://www.baidu.com')
# 实例化浏览器对象:
from selenium import webdriver
browser = webdriver.Chrome('driverpath')
# 发送get请求:
browser.get('https://www.baidu.com')
browser.get('https://image.baidu.com')
# 获取网页的数据: browser.page_source ---> str类型
# 获取页面元素:
find_element_by_id:根据元素的id
find_element_by_name:根据元素的name属性 find_element_by_xpath:根据xpath表达式 find_element_by_class_name:根据class的值 find_element_by_css_selector:根据css选择器
# 节点交互操作:
click(): 点击
send_keys(): 输入内容
clear(): 清空操作
execute_script(js): 执行指定的js代码
# JS代码: window.scrollTo(0, document.body.scrollHeight)可以模拟鼠标滚动一屏高度
quit(): 退出浏览器
# frame
# 若爬取一个页面,需观察如果有两个HTML(一个父HTML,一个子HTML),所需内容在子HTML中,则需要switch_to.frame('frameid') 转至子页面继续操作
switch_to.frame('frameid')
from selenium import webdriver
import time
# 实例化浏览器对象
browser = webdriver.Chrome('./chromedriver.exe')
# 打开qq空间登陆页面
browser.get('https://qzone.qq.com/')
time.sleep(1)
# 转至frame子页面
browser.switch_to.frame('login_frame')
# 获取密码登陆选项并点击
a_tag = browser.find_element_by_id('switcher_plogin')
a_tag.click()
time.sleep(1)
# 获取账号输入框并输入账号
browser.find_element_by_id('u').clear()
user = browser.find_element_by_id('u')
user.send_keys('1816668038')
time.sleep(1)
# 获取密码输入框并输入密码
browser.find_element_by_id('p').clear()
pwd = browser.find_element_by_id('p')
pwd.send_keys('1971628197192liu')
time.sleep(1)
# 获取登陆按钮并单击
button = browser.find_element_by_id('login_button')
button.click()
'''
微博模拟登陆
'''''
# import requests,time
# from selenium import webdriver
# broeser = webdriver.Chrome('./chromedriver.exe')
# broeser.get('https://weibo.com/login.php')
#
# input_tag = broeser.find_element_by_id('loginname')
# input_tag.clear()
# input_tag.send_keys('15135544556')
# time.sleep(3)
# input_tag_pwd = broeser.find_element_by_xpath('//div[@class="info_list password"]/div[@class="input_wrap"]/input')
# input_tag_pwd.clear()
# input_tag_pwd.send_keys('123456789liu')
# time.sleep(3)
# button_tag = broeser.find_element_by_xpath('//div[@class="W_login_form"]/div[@class="info_list login_btn"]/a')
# button_tag.click()
'''
网址 http://sc.chinaz.com/tupian/ 站长素材
图片懒加载
'''''
import requests
from lxml import etree
url = 'http://sc.chinaz.com/tupian/bingxueshijie.html'
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
res = requests.get(url=url,headers=headers)
tree = etree.HTML(res.text)
#src2的位置,在必要的时候可以把值赋给src----懒加载核心
ret = tree.xpath('//div[@id="container"]/div/div/a/img/@src2')
for i in ret:
comment = requests.get(url=i,headers=headers).content
name = i.split('/')[-1]
with open('./image/%s'% name,'wb') as f:
f.write(comment)
(将安装目录下的bin目录添加到系统环境变量中)
# mongo的配置:
1.创建数据库文件及日志文件目录, 并将目录写入配置文件
2.在系统终端执行以下命令: mongod --bind_ip 127.0.0.1 --logpath "D:\Professional\MongoDB\log\mongodb.log" - -logappend --dbpath "D:\Professional\MongoDB\db" --port 27017 --serviceName "MongoDB" --serviceDisplayName "MongoDB" --install 3.将MongoDB服务设为开机自启
//常用操作:
// 1.查看数据库
show dbs
// 2.创建并使用数据库
use tst
// 3.查看当前工作的数据库
db
// 4.创建集合并插入一条数据
db.goods.insert({
"name":"辣条", "price":0.5})
// 5.查看所有表
show tables
// 6.查询表中所有数据
db.goods.find()
// 7.删除表操作
db.goods.drop()
// 8.删除数据库
db.dropDatabase()
--------------------------------------------------------------------------
# 增加数据操作:
db.tablename.insert({
dict})
# 示例: 增加数据操作:
db.goods.insert({
"name":"辣条", "price":0.5})
db.goods.insert({
"name":"辣条", "price":1})
db.goods.insert({
"name":"干脆面", "price":0.5}) db.goods.insertOne({
"name":"单身狗粮", "price":4.5}) db.goods.insertMany([{
"name":"小洋人", "price":3.5}, {
"name":"麦香鸡块", "price":5.5}])
----------------------------------------------------------------------------
# 查询数据操作:
//1、查看数据库 show dbs只能查看有数据的数据库
show dbs
//2、创建并使用数据库
use a1903
//3、查看当前正在工作的数据库
db
//4、插入数据
db.student.insert({
'name':'胡歌','age':30})
db.student.insertOne([{
'name':'胡歌'}])
db.student.insertMany([{
'name':'鹿晗','age':27},{
'name':'关晓彤','age':23}])
db.student.insertMany([{
'name':'刘国鑫','age':22},{
'name':'庞明哲','age':20}])
//5、查询表中数据
db.student.find()
db.student.find().limit(3)
// 按条件查询
// 1.等值查询
db.student.find({
'name':'晓彤'})
// 2.非等值查询:大于$gt(great than),小于$lt(little than),大于等于$gte(great than equal),小于等于$lte(little than equal),不等于$ne
db.student.find({
age:{
$gt:23}})
db.student.find({
'age':{
$lt:23}})
db.student.find({
'age':{
$ne:21}})
// 3. and 与 or
db.student.find({
'name':'晓彤','age':21})
db.student.find({
$or[{
'name':'晓彤'},{
'age':27}]})
// and a 与 b之间
db.student.find({
'age':{
$gt:20},'age':{
$lte:27}})
db.student.find({
'age':{
$gt:20,$lte:27}})
db.student.find({
$or:[{
'age':{
$lt:23}},{
'age':{
$gt:25}}]})
// 更新数据操作
db.student.update({
'name':'晓彤'},{
$set{
'age':18}})
//6、查看表
show tables
//7、删除表
db.student.drop()
//8、删除库
db.dropDatabase()
//9、指定删除
db.student.remove({
'name':''})
-----------------------------------------------------------------------------
# 更新数据操作:
db.table.update({
定位字典}, {
指定修改的键值})
# 示例:更新数据操作:
db.goods.update({
"price":0.5},{
$set:{
"price":5}})
# 参数中的第一个字典用于定位要修改的数据
# 参数中的第二个字典是指定要更新已定位的数据
# 第二个参数中的字典是指定要将哪个字段的修改为什么
----------------------------------------------------------------------------
# 删除数据操作:
db.tablename.remove({
定位字典})
# 示例:删除数据操作:
db.goods.remove({
"price":5})
# 导入模块 如果没安装先安装 pip install pymongo
import pymongo
# 连接MongoDB数据库
conn = pymongo.MongoClient('localhost', 27017)
# 创建库或连接数据库
db = conn.goods
# 创建表或连接表
table = db.snacks
# 数据操作: 插入数据
table.insert(dict)
table.insert_one(dict) ******************在py文件中看具体清空使用
table.insert_many([dict1, dict2, dict3])
# 数据操作: 查询数据
table.find_one({
dict})
# 返回一个字典形式数据
table.find()
# 返回一个mongo对象, 需要使用for循环遍历取值
table.find({
dict}) # 同上
# 并发:同一时间段同时运行
# 并行:同一时刻同时运行
# 时间片轮转法:10个视屏不间断播放,是并发运行,但给人的错觉是并行
# 高IO密集(比如在一个刚运行的代码前就有设置的) 阻塞,cup算法密集
***用多线程爬虫,最重要的就是传参,获取数据,思路********
import threading,requests
# 导入多线程锁机制
from threading import Lock
# 导入线程队列
from queue import Queue
from lxml import etree
import pymongo
# 爬虫类,负责采集数据的
class CrawThread(threading.Thread):
# 初始化init方法,接收参数
def __init__(self,name,pageQueue,dataQueue):
super().__init__()
self.name = name
self.pageQueue = pageQueue
self.headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'
}
self.dataQueue = dataQueue
# 执行run方法,在def函数调用时执行
def run(self):
# 爬取的页数不确定,格式化输出
base_url = 'https://www.xiaohua.com/duanzi?page=%s'
while 1:
try:
print('开始url')
# 传参时要抓取几页的数据已准备好直接get获取,block为False用try捕获异常抓取结束,就终止循环
page = self.pageQueue.get(block=False)
# 将页码拼接
url = base_url % page
res = requests.get(url=url,headers=self.headers)
self.dataQueue.put(res.text)
print('URL完成')
except:
break
# 数据解析类
class Parse(threading.Thread):
def __init__(self,name,dataQueue,look):
super().__init__()
self.name = name
self.dataQueue = dataQueue
self.look = look
def run(self):
while 1:
try:
html = self.dataQueue.get(block=False)
print('正在解析')
# 把获取的HTML的文本放在下一个函数的里进行操作
self.parserver(html)
print('解析完毕')
except:
break
def parserver(self,html):
# 解析
tree = etree.HTML(html)
div_list = tree.xpath('//div[@class="one-cont"]')
for div in div_list:
item = {
}
author = div.xpath('./div/div/a/i/text()')
item['author'] = author[0]
# 上锁
with self.look:
self.save(item)
def save(self,item):
# 连接MongoDB数据库
conn = pymongo.MongoClient('localhost',27017)
db = conn.XIAOHUA
table = db.xh
table.insert_one(item)
def main():
# 存放URl----实例化队列对象
pageQueue = Queue()
for j in range(1,11):
# put将所需要的数据存入
pageQueue.put(j)
#存放脏数据
dataQueue = Queue()
crawlist = ['爬虫1号','爬虫2号','爬虫3号']
# join等待进程以防有一个进程死掉
for i in crawlist:
c = CrawThread(i,pageQueue,dataQueue)
c.start()
c.join()
# 实例化机制锁对象
look = Lock()
jiexi = ['解析1号','解析2号','解析3号',]
for var2 in jiexi:
cc = Parse(var2,dataQueue,look)
cc.start()
# 等待其他线程执行,以防提早结束其他线程死掉
cc.join()
if __name__ == '__main__':
main()
文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态
文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境
文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn
文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker
文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机
文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk
文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入
文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。 Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。
文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动
文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计
文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;gt;Jni-&amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图
文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法