面向对象补充,进程,数据共享,锁,进程池,模块(requests,bs4(beautifulsoup)),协程

news/2024/7/19 12:15:30 标签: 操作系统, 爬虫, python

一丶面向对象补充

"""
class Foo(object):
    def __init__(self):
        self.info = {}

    def __setitem__(self, key, value):
        self.info[key] = value

    def __getitem__(self, item):
        return self.info.get(item)


obj = Foo()
obj['x'] = 123
print(obj['x'])
"""
from flask import globals
class Foo(object):

    def __init__(self):
        object.__setattr__(self, 'info', {}) # 在对象中设置值的本质

    def __setattr__(self, key, value):
        self.info[key] = value

    def __getattr__(self, item):
        print(item)
        return self.info[item]

obj = Foo()
obj.name = 'alex'
print(obj.name)
v = []
for i in range(10000):
    v.append(i)

print(v)
小补充...

 

 

二丶进程

进程间数据不共享

data_list = []
            def task(arg):
                data_list.append(arg)
                print(data_list)


            def run():
                for i in range(10):
                    p = multiprocessing.Process(target=task,args=(i,))
                    # p = threading.Thread(target=task,args=(i,))
                    p.start()

            if __name__ == '__main__':
                run()
...

 

常用功能:
- join
- deamon
- name
- multiprocessing.current_process()
- multiprocessing.current_process().ident/pid

类继承方式创建进程

class MyProcess(multiprocessing.Process):

                def run(self):
                    print('当前进程',multiprocessing.current_process())


                def run():
                    p1 = MyProcess()
                    p1.start()

                    p2 = MyProcess()
                    p2.start()

            if __name__ == '__main__':
                run()
...

 

进程间数据共享

Queue:

                q = multiprocessing.Queue()

                def task(arg,q):
                    q.put(arg)

                def run():
                    for i in range(10):
                        p = multiprocessing.Process(target=task, args=(i, q,))
                        p.start()

                    while True:
                        v = q.get()
                        print(v)

                run()
linux:

 

                def task(arg,q):
                    q.put(arg)

                if __name__ == '__main__':
                    q = multiprocessing.Queue()
                    for i in range(10):
                        p = multiprocessing.Process(target=task,args=(i,q,))
                        p.start()
                    while True:
                        v = q.get()
                        print(v)
windows:

 

Manager:(*)

                m = multiprocessing.Manager()
                dic = m.dict()

                def task(arg):
                    dic[arg] = 100

                def run():
                    for i in range(10):
                        p = multiprocessing.Process(target=task, args=(i,))
                        p.start()

                    input('>>>')
                    print(dic.values())
                    
                if __name__ == '__main__':
                    
                    run()
Linux:

 

                def task(arg,dic):
                    time.sleep(2)
                    dic[arg] = 100

                if __name__ == '__main__':
                    m = multiprocessing.Manager()
                    dic = m.dict()

                    process_list = []
                    for i in range(10):
                        p = multiprocessing.Process(target=task, args=(i,dic,))
                        p.start()

                        process_list.append(p)

                    while True:
                        count = 0
                        for p in process_list:
                            if not p.is_alive():
                                count += 1
                        if count == len(process_list):
                            break
                    print(dic)
    
windows:

 

 

三丶进程锁

  

 

 

 

四丶进程池

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor (官方推荐方式)

import time
        from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

        def task(arg):
            time.sleep(2)
            print(arg)

        if __name__ == '__main__':

            pool = ProcessPoolExecutor(5)
            for i in range(10):
                pool.submit(task,i)
进程池

 

 

五丶初识爬虫

  安装:

      pip3 install requests

      pip3 intall beautifulsoup4

    问题:

      找不到命令?

        方式一:

        C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Scripts\pip3 install requests
        方式二:
        C:\Users\Administrator\AppData\Local\Programs\Python\Python36\Scripts\pip3 install requests

    实例:

import requests
            from bs4 import BeautifulSoup
            from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor


            # 模拟浏览器发送请求
            # 内部创建 sk = socket.socket()
            # 和抽屉进行socket连接 sk.connect(...)
            # sk.sendall('...')
            # sk.recv(...)

            def task(url):
                print(url)
                r1 = requests.get(
                    url=url,
                    headers={
                        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36'
                    }
                )

                # 查看下载下来的文本信息
                soup = BeautifulSoup(r1.text,'html.parser')
                print(soup.text)
                # content_list = soup.find('div',attrs={'id':'content-list'})
                # for item in content_list.find_all('div',attrs={'class':'item'}):
                #     title = item.find('a').text.strip()
                #     target_url = item.find('a').get('href')
                #     print(title,target_url)

            def run():
                pool = ThreadPoolExecutor(5)
                for i in range(1,50):
                    pool.submit(task,'https://dig.chouti.com/all/hot/recent/%s' %i)


            if __name__ == '__main__':
                run()
实例

 

  相关:
  a. 以上示例进程和线程那个好?
  - 线程好
  b. requests模块模拟浏览器发送请求
  - 本质 requests.get(...):
  - 创建socket客户端
  - 连接 【阻塞】
  - 发送请求
  - 接收请求【阻塞】
  - 断开连接

  c. 线程和进程池

 

转载于:https://www.cnblogs.com/xintiao-/p/9635926.html


http://www.niftyadmin.cn/n/1117926.html

相关文章

饮食与健康、饮食与历史与文化

1. 清热去火 马蹄(mǎ t),又称荸荠(b qi)。原产于印度。我国是盛产马蹄的地方。 荸荠炒肉马蹄属寒性食物,胃寒的人不宜多吃,生吃是最去火的,也可以煲汤。2. 霸王别姬 “霸王别姬”是…

读《打造FaceBook》

这本书是微博上的一位朋友推荐的,当天就下单购买了,花了几个晚上看完,全书主要讲作者在FaceBook的从业经历以及离职后对天使投资和创业的一些想法。下面是我看完本书后的一些感想。 团队合作 任何的团队都需要团队合作,其重要性毋…

怎么去掉只读_UG用户默认设置只读保存不了怎么办?

NX用户默认设置无法修改怎么办?显示:用户(只读)解决方案:问题原因:你的NX用户默认设置文件所在目录有只读权限,导致NX软件无法对其进行修改,所有会提示你修改不了。UG用户默认设置配置文件不在UG软件目录里…

Linux 文件操作函数

底层文件操作函数: #include<unistd.h> int open(const char* pathname,int flags); int open(const char* pathname,int flags,mode_t mode);//返回值&#xff1a;成功&#xff0c;返回文件描述符 失败&#xff0c;返回-1&#xff0c;失败原因记录在errno中int close(…

textarea文本域宽度和高度(width、height)自己主动适应变化处理

文章来源&#xff1a;http://www.cnblogs.com/jice/archive/2011/08/07/2130069.html <HTML> <HEAD> <TITLE>textarea宽度、高度自己主动适应处理方法</TITLE> <!-- 控制宽度的自己主动适应 --> <style type"text/css"> .commen…

力扣(LeetCode)141

题目地址&#xff1a;https://leetcode-cn.com/probl...给定一个链表&#xff0c;判断链表中是否有环。 为了表示给定链表中的环&#xff0c;我们使用整数 pos 来表示链表尾连接到链表中的位置&#xff08;索引从 0 开始&#xff09;。 如果 pos 是 -1&#xff0c;则在该链表中…

复用一个页面_计算机网络自学笔记:多路复用与多路分解

这篇文章讨论传输层的多路复用与多路分解&#xff0c;也就是将网络层所提供的主机到主机交付服务扩展到为在主机上运行的应用程序所提供的进程到进程交付服务。在目的主机&#xff0c;传输层从紧邻其下的网络层接收报文段。传输层负责将这些报文段中的数据交付给在主机上运行的…

BigDecimal精度与相等比较的坑

先想一下&#xff0c;创建BigDecimal对象的时候一般是怎么创建的&#xff1f; new一个&#xff0c;传进去值BigDecimal.valueOf方法&#xff0c;传进去值作为一个数字类型&#xff0c;经常有的操作是比较大小&#xff0c;有一种情况是比较是否相等。用equal方法还是compareTo方…