多进程 Multiprocessing 模块

Process 类用来描述一个进程对象。创建子进程的时候,只需要传入一个执行函数和函数的参数即可完成 Process 示例的创建。

  • star() 方法启动进程,
  • join() 方法实现进程间的同步,等待所有进程退出。
  • close() 用来阻止多余的进程涌入进程池 Pool 造成进程阻塞。
multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
  • target 是函数名字,需要调用的函数
  • args 函数需要的参数,以 tuple 的形式传入

=======================================================================

Pool

Pool 可以提供指定数量的进程供用户使用,默认是 CPU 核数。当有新的请求提交到 Poll 的时候,如果池子没有满,会创建一个进程来执行,否则就会让该请求等待。 
- Pool 对象调用 join 方法会等待所有的子进程执行完毕 
- 调用 join 方法之前,必须调用 close 
- 调用 close 之后就不能继续添加新的 Process 了

pool.apply_async

apply_async 方法用来同步执行进程,允许多个进程同时进入池子。

pool.apply

apply(func[, args[, kwds]])

该方法只能允许一个进程进入池子,在一个进程结束之后,另外一个进程才可以进入池子。

下面就使用  Multiprocessing  和异步来做一个爬虫例子,直接上代码

  # coding:utf-8

from common.contest import *

def spider(resultList):

    item_url = resultList['item_url']

    headers = {
"cookie":"trctestcookie=ok; __ssid=0b09cf20-bcab-438c-9d06-3346409a800c;
    mp_invaluable_mixpanel=%7B%22distinct_id%22%3A%20%22161c7298aeabc-0da7fd442d45f7-5d1b3316-13c680-161c7298aeba04%22%7D;
     LANG-PROD=en-us; SHOW-ALERT=true; trctestcookie=ok; mp_mixpanel__c=45; afCustomerRef-prod=13LVMZ0E4C; afCustomerID-prod=4119514;
     afRememberMe=true; AZTOKEN-PROD=FAFE3733-2B21-4AC8-B127-3325BAE38594; oas-node-sid=s%3Az-KLM1REtfG-7_mRAJ3HAyv0ZFBbkSwu.
    YNq3143hCV%2FWZz0Zd15Q5g7u8aM6ARLoTOujSQnXSqQ; _gat=1; _ga=GA1.2.1505142091.1519353908;
    _gid=GA1.2.538844093.1519464821; _gat_UA-21191163-1=1; AUTHORIZATION=b3f7a9d1%2D75c3%2D425b%2Db16d%2D262135cf4dfa;
    OASTOKEN-PROD=FAFE3733%2D2B21%2D4AC8%2DB127%2D3325BAE38594; CUSTOMERID=4119514; CUSTOMERREF=13LVMZ0E4C; myinvaluablenav=1;
    _evgn_d902=%7B%22puid%22%3A%22AkLKM_odiDX3b9MMOOYEiDupItJqc6Ji2gO3amra_Qo%22%7D; _evga_d902=da0bcc787c51cd99.04r;
} try:
result = session.get(url=item_url,verify=False,headers=headers).content
except:
result = session.get(url=item_url, verify=False,headers=headers).content soup = BeautifulSoup(result, 'html.parser')
result_div = soup.find_all('div', attrs={"id": "lotPanel1"})[0]
result_replace = replace(result_div) item_desc = re.findall('<b>Description:</b>(.*?)</div><a class="rfi-modal-trigger-link"',result_replace)[0] print item_desc result1 = result.replace('\r\n','').replace('\n','').replace('\r','') hashcode = md5(str(item_url))
create_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
data2 = { "item_desc":str(item_desc),
# "html":str(result), "hashcode": hashcode,
"create_time": create_time,
} null = ""
item_data = (eval(json.dumps(resultList)))
item_data.pop('hashcode')
item_data.pop('create_time')
data_dict = dict(resultList,**data2) dbName = "oversea_invaluable_2017_2_detail_info"
  # 本方法已经封装,插入数据到数据库中去
result1 = insert_data(dbName, data_dict) if __name__ == "__main__":
time1 = time.time()
sql = """ SELECT * FROM `oversea_invaluable_2017_2_no_detail_info` limit 1000 """
  
   #select_data是数据库查询方法,查询结果是 [{},{},{},{}, .........]
resultList = select_data(sql) pool = multiprocessing.Pool(4)
for item in resultList:
pool.apply_async(spider, (item,))
pool.close()
pool.join() print time.time()-time1
多进程虽然为我们爬取网页提供了便利,但是不建议使用,因为这样会对目标网站造成压力,如果时间充足的话,尽量利用单进程慢慢的爬取

python 多线程爬虫 实例的更多相关文章

  1. python多线程爬虫+批量下载斗图啦图片项目(关注、持续更新)

    python多线程爬虫项目() 爬取目标:斗图啦(起始url:http://www.doutula.com/photo/list/?page=1) 爬取内容:斗图啦全网图片 使用工具:requests ...

  2. Python 多进程爬虫实例

    Python  多进程爬虫实例 import json import re import time from multiprocessing import Pool import requests f ...

  3. python多线程爬虫设计及实现示例

    爬虫的基本步骤分为:获取,解析,存储.假设这里获取和存储为io密集型(访问网络和数据存储),解析为cpu密集型.那么在设计多线程爬虫时主要有两种方案:第一种方案是一个线程完成三个步骤,然后运行多个线程 ...

  4. Python多线程爬虫与多种数据存储方式实现(Python爬虫实战2)

    1. 多进程爬虫 对于数据量较大的爬虫,对数据的处理要求较高时,可以采用python多进程或多线程的机制完成,多进程是指分配多个CPU处理程序,同一时刻只有一个CPU在工作,多线程是指进程内部有多个类 ...

  5. python多线程同步实例分析

    进程之间通信与线程同步是一个历久弥新的话题,对编程稍有了解应该都知道,但是细说又说不清.一方面除了工作中可能用的比较少,另一方面就是这些概念牵涉到的东西比较多,而且相对较深.网络编程,服务端编程,并发 ...

  6. Python多线程爬虫爬取电影天堂资源

    最近花些时间学习了一下Python,并写了一个多线程的爬虫程序来获取电影天堂上资源的迅雷下载地址,代码已经上传到GitHub上了,需要的同学可以自行下载.刚开始学习python希望可以获得宝贵的意见. ...

  7. python 多线程爬虫

    最近,一直在做网络爬虫相关的东西. 看了一下开源C++写的larbin爬虫,仔细阅读了里面的设计思想和一些关键技术的实现. 1.larbin的URL去重用的很高效的bloom filter算法: 2. ...

  8. Python多线程爬虫爬取网页图片

    临近期末考试,但是根本不想复习!啊啊啊啊啊啊啊!!!! 于是做了一个爬虫,网址为 https://yande.re,网页图片为动漫美图(图片带点颜色........宅男福利 github项目地址为:h ...

  9. Python多线程爬虫详解

    一.程序进程和线程之间的关系 程序:一个应用就是一个程序,比如:qq,爬虫 进程:程序运行的资源分配最小单位, 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知 ...

随机推荐

  1. directio mysql 编绎选项

    http://www.myexception.cn/linux-unix/495407.html http://www.iyunv.com/thread-25950-1-1.html

  2. 2014 百度之星 题解 1004 Labyrinth

    Problem Description 度度熊是一仅仅喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫仅仅能从矩阵左上角第一个方格開始走,仅仅有走到右上角的第一个格子才算走出迷宫,每一次仅仅能 ...

  3. cocos2d-x_lua中tolua++绑定c++分享

    cocos2d-x_lua中tolua++绑定c++分享    我用的版本号是cocos2d-x 2.x的版本号   下面操作为了保证不更改引擎的一个类LuaCocos2d.cpp  1.操作前 能够 ...

  4. jacob使用入门及问题解析

    转自:http://blog.csdn.net/hemingwang0902/article/details/4377994 本博客 jacob 列文章导读Java操作Microsoft Word之j ...

  5. [Linux] du-查看文件夹大小-并按大小进行排序

    reference : http://blog.csdn.net/jiaobuchong/article/details/50272761# 某天,我想检查一下电脑硬盘的的使用情况,作为一个命令控,废 ...

  6. Python学习(四)数据结构 —— list tuple range

    序列类型 list   tuple   range list 和 tuple list: 列表,由 [] 标识: 有序:可改变列表元素 tuple: 元组,由 () 标识: 有序:不可改变元组元素(和 ...

  7. 写的一个split函数

    vector<string> strsplit(const string& str) { vector<string> vec; string sstr1=str, s ...

  8. Android程序调试

    1. 使用Log.d方法输出Debug日志信息. Log.d方法用来输出DEBUG故障日志信息,该方法有两种重载形式,其中开发人员经常用到的重载形式语法如下: public static int d( ...

  9. 实现SQL Server中的切割字符串SplitString函数

    有时我们要用到批量操作时都会对字符串进行拆分,可是SQL Server中却没有自带Split函数,所以要自己来实现了.没什么好说的,需要的朋友直接拿去用吧 SET ANSI_NULLS ON GO S ...

  10. 【Android JNI】JNIEnv和JavaVM的区别

     JNI的实现可涉及两个关键类:JNIEnv和JavaVM. JavaVM:这个代表java的虚拟机.所有的工作都是从获取虚拟机的接口开始的.             第一种方式,在加载动态链接库的时 ...