爬虫周结

2018-12-02  本文已影响0人  山野过客

多线程

什么是多任务:同时执行多个任务

同时执行:并行

单核同时执行的任务数量只有一个,但是看上去像是在执行多个任务,是因为切换的间隔时间级短

多核cpu:同时可以执行多个任务,假如任务量超过核心数,在某个核心下任务会交替执行

并发和并行的概念:

并发:单核cpu同时执行多个任务,任务是同时发起的,但是并不是同时执行,而是交替执行

并行:任务数量小于或等于核心数,这个时候每一个核心都在执行任务,任务是同时执行的,

实现多任务的手段(方式):

1.多线程

2.多进程

3.协程

线程之间的操作是无序的

一个线程下面有一个主线程

线程:相当于打开一个浏览器

进程:相当于在浏览器里面打开多个窗口

  启动线程: thread.start()

  添加join的目的:为了让任务队里中的所有请求都执行完毕

  线程锁:threadlock = threading.Lock()

队列

创建一个队列:queue_obj = queue.Queue(maxsize=30)

maxsize :表示允许存储的最

(FIFO) : 对列--先进先出

存值 : queue_obj.put( )

取值 : queue_obj.get( )

获取队列的大小 : queue_obj.qsize( )

判断队列是否满 : queue_obj.full( )

判断队列是否为空 : queue_obj.empty()

进程池

导入    from multiprocessing import Pool

创建一个进程池:pool = Pool()

pool.apply()  同步的方法,执行效率比较低

apply_async  是一个异步方法,可以提高任务执行的效率

func,对应的任务的函数名称

args=(),传递参数(元组)

kwds={}, 传递参数(字典)

callback=None,(执行成功后的回调)

error_callback=None,(执行错误之后的回调)

关闭进程池:pool.close  pool.join() :join 方法 让进程池中的任务执行完毕后,回到主线程继续执行  pool.submit(): 向进程池中添加任务  .add_done_callback():添加回调方法  pool.shutdown():执行了join 方法  dataqueue.put()  :向队列中存值whilenot dataqueue.empty():print(dataqueue.get())    使用manage().Queue() 创建一个队列,可以实现在进程池的进程中实现数据的共享(通讯)  q = Manger().Queue()

可迭代对象:能够执行遍历循环的都可以称为可迭代对象(可以使用 for i in 循环)

迭代器一定是一个可迭代对象

可迭代对象不一定是一个迭代器

常见的可迭代对象:list,set,dict,str,tuple

判断是否是可迭代对象的方法: isinstance      print(isinstance(a,Iterable))

把可迭代对象转换为一个迭代器:data_obj = iter(data)

生成器是一个特殊的迭代器,生成器一定是一个可迭代对象,可以使用next方法取值

python 中实现生成器的两种方式

第一种:利用tuple(元祖)实现生成器

第二种;使用yield 实现生成器,一旦某个方法中出现了yield这个关键字,这个方法就不单单是一个方法了,得到的就是一个生成器

异常处理模块

创建一个浏览器驱动

导入 webdriver : from selenium import webdriver

创建一个浏览器驱动:driver = webdriver.Chrome(executable_path= '/home/tian/桌面/驱动/chromedriver' )

异常处理模块:from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException

TimeoutError:超时

NoSuchElementException :没有此节点

NoSuchFrameException:没有iframe

切换到子页面:driver.switch_to_frame('loginIframe')

在子页面找按钮,然后模拟点击:driver.find_element_by_id('switcher_plogin').click()

输入账号:driver.find_element_by_xpath('//input[@id="u"]').send_keys('464660217')

找到登录按钮,然后点击:driver.find_element_by_xpath('//input[@id="login_button"]').click()

登录之后可以获取到cookies信息,保存本地,可以以后使用:print(driver.get_cookies())

负责循环等待:from selenium.webdriver.support.ui import WebDriverWait

以什么方式寻找节点:from selenium.webdriver.common.by import By

添加条件模块:from selenium.webdriver.support import expected_conditions as EC

显示等待:同样可以指定一个等待时间,不过更加灵活,可以指定一个最长等待时间如果在最长时间还没找到节点则抛出异常,如果找到则立即返回节点信息

寻找节点:element = WebDriverWait(driver,10).until(

#添加寻找节点的条件

EC.presence_of_element_located((By.ID,'anony-time'))

)

创建一个浏览器驱动:driver = webdriver.Chrome(executable_path= '/home/tian/桌面/驱动/chromedriver' )

找到输框:driver.find_element_by_xpath('//input[@id="form_email"]').send_keys('18518753265')

构建一个浏览器的驱动:driver = webdriver.Chrome(

executable_path='/home/ljh/桌面/driver/chromedriver'

)

driver.get('https://www.baidu.com/')

获取a标签:a_action1 = driver.find_element_by_xpath('//div[@id="u1"]/a[3]')

将鼠标移动到a标签上: ActionChains(driver).move_to_element(a_action1).perform()

单击:ActionChains(driver).move_to_element(a_action).click(a_action).perform()

双击:ActionChains(driver).move_to_element(a_action).double_click(a_action).perform()

拖拽:a_action2 = driver.find_element_by_xpath('//div[@id="u1"]/a[5]')

ActionChains(driver).drag_and_drop(a_action1,a_action2).perform()

切换到系统的提示框:alter = driver.switch_to_alert()

执行js代码,重新打开一个窗口:js = 'window.open("https://www.douban.com/")'

driver.execute_script(js)

切换浏览器的窗口:driver.switch_to.window(driver.window_handles[0])

切换到子页面iframe:frame = driver.switch_to_frame('loginIframe') driver.find_element_by_xpath()

将图片转换为灰度图:image5 =  image3.convert("L")

设置图片的伐值:pointvalue = 150

.send_keys(key) 输入关键字

.click():按钮点击

上一篇下一篇

猜你喜欢

热点阅读