• 多线程爬虫


    threading模块

    import threading
    import time
    
    def coding():
        for i in range(3):
            print("正在写代码%s"%threading.current_thread())
            time.sleep(1)
    
    def drawing():
        for i in range(3):
            print("正在画画%s"%threading.current_thread())
            time.sleep(1)
    
    def main():
        # 创建一个子线程
        t1 = threading.Thread(target=coding, )
        t1.start()
        t2 = threading.Thread(target=drawing, )
        t2.start()
    
    
    if __name__ == '__main__':
        main()

    condition的生产者消费者模式

    # threading.Condition 继承threading.Lock
    import threading
    import random
    import time
    
    gMoney = 1000
    gCondition = threading.Condition()
    gTimes = 0
    gTotalTimes = 10
    
    class Producer(threading.Thread):
        def run(self):
            global gMoney
            global gTimes
            global gTotalTimes
            while True:
                money = random.randint(100,1000)
                gCondition.acquire()
                if gTimes >= gTotalTimes:
                    gCondition.release()
                    break
    
                gMoney += money
                gTimes += 1
                print("%s生产了%d的钱,现在总共有%d" % (threading.current_thread(), money, gMoney))
                gCondition.notify_all() #通知wait等待的线程
                gCondition.release()
                time.sleep(1)
    
    
    class Consumer(threading.Thread):
        def run(self):
            global gMoney
            while True:
                money = random.randint(100,1000)
                gCondition.acquire()
    
                while gMoney < money:
                    if gTimes > gTotalTimes:
                        gCondition.release()
                        return
                    print("%s,准备消费%d,剩余金额%d,不足!!!" % (threading.current_thread, money, gMoney))
                    gCondition.wait()
    
                gMoney -= money
                print("消费者%s,消费了%d,剩余金额%d"%(threading.current_thread,money,gMoney))
                gCondition.release()
                time.sleep(1)
    
    def main():
        for x in range(2):
            t = Producer(name="生产者%d"%x)
            t.start()
    
        for x in range(3):
            t = Consumer(name='消费者%d'%x)
            t.start()
    
    
    if __name__ == '__main__':
        main()

    lock版的生产者消费者模式

    import threading
    import random
    import time
    
    gMoney = 1000
    gLock = threading.Lock()
    gTimes = 0
    gTotalTimes = 10
    
    class Producer(threading.Thread):
        def run(self):
            global gMoney
            global gTimes
            global gTotalTimes
            while True:
                money = random.randint(100,1000)
                gLock.acquire()
    
                # if gTimes >= gTotalTimes:
                #     gLock.release()
                #     break
                # gMoney += money
                # gTimes += 1
                # print("%s生产了%d的钱,现在总共有%d" % (threading.current_thread(), money, gMoney))
                # gLock.release()
                # time.sleep(1)
    
                if gTimes < gTotalTimes:
                    gMoney += money
                    gTimes += 1
                    print("%s生产了%d的钱,现在总共有%d"%(threading.current_thread(),money,gMoney))
                    gLock.release()
                    time.sleep(1)
                else:
                    print("已经生产了10次, 停止生产")
                    gLock.release()
                    break
    
    
    
    class Consumer(threading.Thread):
        def run(self):
            global gMoney
            while True:
                money = random.randint(100,1000)
                gLock.acquire()
                if gMoney >= money:
                    gMoney -= money
                    print("消费者%s,消费了%d,还剩有%d"%(threading.current_thread(),money,gMoney))
                else:
                    if gTimes >= gTotalTimes:
                        gLock.release()
                        break
                    print("余额不足,当前金额是%d, 需要消费的金额是%d"%(gMoney,money))
                gLock.release()
                time.sleep(1)
    
    def main():
        for x in range(2):
            t = Producer(name="生产者%d"%x)
            t.start()
    
        for x in range(3):
            t = Consumer(name='消费者%d'%x)
            t.start()
    
    
    if __name__ == '__main__':
        main()

    queue的线程安全

    from queue import Queue
    import time
    import threading
    
    
    # q.put(2)
    # q.put(1)
    # q.put(3)
    #
    # print(q.qsize())
    # print(q.full())
    # print(q.empty())
    # print(q.get())
    
    def set_value(q):
        index = 0
        while True:
            q.put(index)
            index += 1
            time.sleep(3)
    
    def get_value(q):
        while True:
            print(q.get())
    
    def main():
        q = Queue(4)
        t1 = threading.Thread(target=set_value,args=[q])
        t2 = threading.Thread(target=get_value,args=[q])
        t1.start()
        t2.start()
    
    if __name__ == '__main__':
        main()

    threading类实现多线程

    import threading
    import time
    
    class CodingThread(threading.Thread):
        def run(self):
            for i in range(3):
                print("正在写代码%s"%threading.current_thread())
                time.sleep(1)
    
    class DrawingThread(threading.Thread):
        def run(self):
            for i in range(3):
                print("正在画画%s"%threading.current_thread())
                time.sleep(1)
    
    
    def main():
        # 创建一个子线程
        t1 = CodingThread()
        t1.start()
        t2 = DrawingThread()
        t2.start()
    
    
    if __name__ == '__main__':
        main()

    selenium关闭页面和浏览器

    from selenium import webdriver
    import time
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    # 通过id 的方式获取
    inputTag = driver.find_element_by_id('kw')
    inputTag.send_keys('python')
    time.sleep(3)
    
    
    driver.close() # 关闭页面
    # driver.quit() # 关闭整个浏览器

    selenium页面等待

    from selenium import webdriver
    import time
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    # 等待10秒后找这个对应的id标签, 因为是错误的所以等待10秒后报错
    # 如果是正确的id 标签, 找到后直接继续执行, 不会等10 秒
    WebDriverWait(driver,10).until(
        EC.presence_of_element_located((By.ID,'shjdkah'))
    )

    selenium打开多个页面和页面间的切换

    from selenium import webdriver
    import time
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.get('https://www.baidu.com/')
    
    # 打开豆瓣
    driver.execute_script('window.open("https://www.douban.com/")')
    # 但是当前的driver还是停留在baidu页面
    print(driver.current_url)
    print(driver.window_handles)  # 窗口句柄 看看现在打开的窗口有什么
    driver.switch_to.window(driver.window_handles[1]) # 切换窗口
    print(driver.current_url)
    driver.close() # 关闭页面
    driver.switch_to.window(driver.window_handles[0]) # 切换窗口

    多线程共享全局变量

    import threading
    
    VALUE = 0
    gLock = threading.Lock() # 创建锁
    
    def add_value():
        global VALUE
        gLock.acquire()
        for x in range(1000000):
            VALUE += 1
        gLock.release()
        print("value,%d"%VALUE)
    
    def main():
        for x in range(2):
            t = threading.Thread(target=add_value)
            t.start()
    
    if __name__ == '__main__':
        main()

    selenium设置代理ip

    from selenium import webdriver
    
    
    options = webdriver.ChromeOptions()
    # 设置代理
    options.add_argument("--proxy-server-http://1.197.203.158:9999")
    
    driver_path = r"G:Crawler and Datachromedriver.exe"
    driver = webdriver.Chrome(executable_path=driver_path,chrome_options=options)
    driver.get('http://httpbin.org/ip')
  • 相关阅读:
    Day18:继续添加前端代码
    Day17:今天为前端做的几件小事
    Day16:接口调试完成&紧急转前端开发
    Day25:报告编写等
    Day24:结论的撰写&&openid再次尝试
    Day23:个人小结的撰写&&对coderunner的熟悉
    Day22:数据库导入&分工&准备科研训练
    Day21:尝试脱离相同ip连接
    Day20:update功能的实现
    Day19:代码整合等
  • 原文地址:https://www.cnblogs.com/kenD/p/11123543.html
Copyright © 2020-2023  润新知