失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 爬虫 自动化工具-mongo-多线程爬虫

爬虫 自动化工具-mongo-多线程爬虫

时间:2021-09-21 12:50:13

相关推荐

爬虫  自动化工具-mongo-多线程爬虫

一、selenium框架

1、selenium介绍

# 介绍: 1.selenium是一个web自动化测试用的框架. 程序员可以通过代码实现对浏览器的控制, 比如打开网页, 点 击网页中的元素, 实现鼠标滚动等操作. 2.它支持多款浏览器, 如谷歌浏览器, 火狐浏览器等等, 当然也支持无头浏览器. # 目的: 在爬取数据的过程中, 经常遇到动态数据加载, 一般动态数据加载有两种,一种通过ajax请求加载数据, 另 一种通过js代码加载动态数据. selenium可以模拟人操作真实浏览器, 获取加载完成的页面数据ajax:url有规律且未加密, 直接构建url连接请求 url加密过无法破解规律 --> selenium js动态数据加载 --> selenium

2、selenium安装

三要素: 浏览器, 驱动程序, selenium框架 浏览器: 推荐谷歌浏览器, 标准稳定版本 驱动程序:http://chromedriver./index.html pip install selenium # 测试: from selenium import webdriver # 将驱动放在脚本所在的文件夹 browser = webdriver.Chrome('./chromedriver.exe') browser.get('')

3、selenium常用操作

# 实例化浏览器对象: from selenium import webdriver browser = webdriver.Chrome('driverpath') # 发送get请求: browser.get('')browser.get('')# 获取网页的数据: 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')

4、用自动化模拟QQ,微博,登录

from selenium import webdriverimport time# 实例化浏览器对象browser = webdriver.Chrome('./chromedriver.exe')# 打开qq空间登陆页面browser.get('/')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('/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()

5、图片懒加载

'''网址 /tupian/ 站长素材图片懒加载'''''import requestsfrom lxml import etreeurl = '/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).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),不等于$nedb.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交互

# 导入模块 如果没安装先安装 pip install pymongoimport 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}) # 同上

三、多线程爬虫

1、并发,并行的理解

# 并发:同一时间段同时运行# 并行:同一时刻同时运行# 时间片轮转法:10个视屏不间断播放,是并发运行,但给人的错觉是并行# 高IO密集(比如在一个刚运行的代码前就有设置的) 阻塞,cup算法密集

2、实现多线程爬虫

***用多线程爬虫,最重要的就是传参,获取数据,思路********import threading,requests# 导入多线程锁机制from threading import Lock# 导入线程队列from queue import Queuefrom lxml import etreeimport pymongo# 爬虫类,负责采集数据的class CrawThread(threading.Thread):# 初始化init方法,接收参数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 = dataQueue# 执行run方法,在def函数调用时执行def run(self):# 爬取的页数不确定,格式化输出base_url = '/duanzi?page=%s'while 1:try:print('开始url')# 传参时要抓取几页的数据已准备好直接get获取,block为False用try捕获异常抓取结束,就终止循环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('正在解析')# 把获取的HTML的文本放在下一个函数的里进行操作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):# 连接MongoDB数据库conn = pymongo.MongoClient('localhost',27017)db = conn.XIAOHUAtable = db.xhtable.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()

如果觉得《爬虫 自动化工具-mongo-多线程爬虫》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。