一、selenium框架
1、selenium介绍
# 介绍:
1.selenium是一个web自动化测试用的框架. 程序员可以通过代码实现对浏览器的控制,
比如打开网页, 点 击网页中的元素, 实现鼠标滚动等操作.
2.它支持多款浏览器, 如谷歌浏览器, 火狐浏览器等等, 当然也支持无头浏览器.
# 目的:
在爬取数据的过程中, 经常遇到动态数据加载, 一般动态数据加载有两种,一种通过ajax请求加载数据, 另 一种通过js代码加载动态数据. selenium可以模拟人操作真实浏览器, 获取加载完成的页面数据ajax:url有规律且未加密, 直接构建url连接请求 url加密过无法破解规律 --> selenium
js动态数据加载 --> selenium
2、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')
3、selenium常用操作
from selenium import webdriver
browser = webdriver.Chrome('driverpath')
browser.get('https://www.baidu.com')
browser.get('https://image.baidu.com')
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代码
quit(): 退出浏览器
switch_to.frame('frameid')
4、用自动化模拟QQ,微博,登录
from selenium import webdriver
import time
browser = webdriver.Chrome('./chromedriver.exe')
browser.get('https://qzone.qq.com/')
time.sleep(1)
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()'''
微博模拟登陆
'''''
5、图片懒加载
'''
网址 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)
ret = tree.xpath('//div[@id="container"]/div/div/a/img/@src2')for i in ret:comment = requests.get(url=i,headers=headers).contentname = i.split('/')[-1]with open('./image/%s'% name,'wb') as f:f.write(comment)
二、Mongo数据库
1、mongo的安装
(将安装目录下的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服务设为开机自启
2、mongo数据库操作
//常用操作:
// 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})
3、Python与Mongo交互
import pymongo
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()
table.find({dict})
三、多线程爬虫
1、并发,并行的理解
# 并发:同一时间段同时运行
# 并行:同一时刻同时运行
# 时间片轮转法:10个视屏不间断播放,是并发运行,但给人的错觉是并行
# 高IO密集(比如在一个刚运行的代码前就有设置的) 阻塞,cup算法密集
2、实现多线程爬虫
***用多线程爬虫,最重要的就是传参,获取数据,思路********
import threading,requests
from threading import Lock
from queue import Queue
from lxml import etree
import pymongo
class CrawThread(threading.Thread):def __init__(self,name,pageQueue,dataQueue):super().__init__()self.name = nameself.pageQueue = pageQueueself.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 = dataQueuedef run(self):base_url = 'https://www.xiaohua.com/duanzi?page=%s'while 1:try:print('开始url')page = self.pageQueue.get(block=False)url = base_url % pageres = 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 = nameself.dataQueue = dataQueueself.look = lookdef run(self):while 1:try:html = self.dataQueue.get(block=False)print('正在解析')self.parserver(html)print('解析完毕')except:breakdef 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):conn = pymongo.MongoClient('localhost',27017)db = conn.XIAOHUAtable = db.xhtable.insert_one(item)def main():pageQueue = Queue()for j in range(1,11):pageQueue.put(j)dataQueue = Queue()crawlist = ['爬虫1号','爬虫2号','爬虫3号']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()
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!