python apply_async函数_进程池未执行apply_async中添加的函数就直接结束了
代码没有执行apply_async中添加的函数就直接结束了
from bs4 import BeautifulSoup
import random
import requests
import pymongo
import datetime
import random
import time
from multiprocessing import Pool
user_agents = [
'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 '
'Mobile/13B143 Safari/601.1]',
'Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/48.0.2564.23 Mobile Safari/537.36',
'Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/48.0.2564.23 Mobile Safari/537.36']
heads = {
'User_Agent': random.choice(user_agents)
}
ipHeads = {
'Upgrade-Insecure-Requests':'1',
'User-Agent':random.choice(user_agents),
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Referer':'http://www.xicidaili.com/nn/',
'Accept-Encoding':'gzip, deflate, sdch',
'Accept-Language':'zh-CN,zh;q=0.8',
}
class douban():
def __init__(self):
self.client = pymongo.MongoClient('localhost', 27017)
self.db = self.client['books']
self.tool = self.client['tool']
self.collectIp = self.tool['ip']
def getFromSQL(self):
item = self.collectIp.find_one({'http': 'http'})
proxies = {}
proxies[item['http']] = 'http://' + item['ip'] + ':' + item['port']
return proxies
def getAllTag(self):
ipDic = {}
url = 'https://book.douban.com/tag/?view=type&icn=index-sorttags-all'
proxies = self.getFromSQL()
s = requests.get(url,headers=heads,proxies=proxies)
if s.status_code == 403:
values = list(proxies.values())[0]
ip = values.split('//')[1].split(':')[0]
self.collect.remove({'ip': ip})
proxies = getFromSQL()
s = requests.get(url,headers=heads,proxies=proxies)
soup = BeautifulSoup(s.text,'lxml')
titleTags= soup.find_all('a', class_='tag-title-wrapper')
tagList = soup.find_all('table',class_='tagCol')
href = {}
titleList = []
i = 0
for titleTag in titleTags:
title = titleTag['name']
titleList.append(title)
trs = tagList[i].find_all('tr')
hreflist = []
for tr in trs:
hreflist.append(tr.td.a['href'])
href[title] = hreflist
i = i + 1
return titleList,href
def getAllBookUrl(self,title, hrefDic):
print('a')
collect = self.db[title]
for href in hrefDic[title]:
index = 0
while 1:
url = 'https://book.douban.com' + href +'?start='+ str(index) + '&type=T'
proxies = self.getFromSQL()
s = requests.get(url, headers=heads,proxies=proxies)
if s.status_code == 403:
values = list(proxies.values())[0]
ip = values.split('//')[1].split(':')[0]
collect.remove({'ip': ip})
proxies = self.getFromSQL()
s = requests.get(url,headers=heads,proxies=proxies)
html = s.text
soup = BeautifulSoup(html, 'lxml')
liList= soup.find_all('li',class_='subject-item')
if len(liList):
for li in liList:
id = li.find('a')['href'][32:-1]
collect.insert({'bookId':id})
index += 20
time.sleep(3)
else:
break
if __name__== '__main__':
p = Pool(4)
a = douban()
titleList, hrefDic = a.getAllTag()
for i in range(len(titleList)):
print('开始爬取%s'%titleList[i])
p.apply_async(a.getAllBookUrl, args=(titleList[i],hrefDic))
p.close()
p.join()
# a = douban()
# titleList, hrefDic = a.getAllTag()
# a.getAllBookUrl(titleList[0],hrefDic)
# print('done')
python apply_async函数_进程池未执行apply_async中添加的函数就直接结束了相关推荐
- java lambda函数_最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)
最常用的 Java 8 中的 Lambda 函数(项目中实用笔记) 简介 Java 8 中的新特性,虽然现在都出到了Java14版本,不过在日常的开发过程中,8的版本是足够使用了,再说现在的8以上的版 ...
- c语言的结构体能存放函数吗,在C语言结构体中添加成员函数
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
- Python学习笔记之进程池pool
平时很多操作都会用到多进程,比如爬虫.数据处理. 下面介绍一下多进程的函数方法.参数及使用方法. 目录 一.进程池Pool介绍 1.apply() 2.apply_async 3.map() 4.ma ...
- Python并发编程之进程池
Python并发编程之进程池 一.进程池简介 二.进程池代码实例 一.进程池简介 可以用Pool类来创建进程池,可以把各种数据处理任务都提交给进程池.进程池提供的功能有点类似于列表解析和功能性编程操作 ...
- python使用matplotlib可视化、使用annotate函数以及arrowprops参数在可视化图像中添加箭头和文本注释(arrow and text annotation)
python使用matplotlib可视化.使用annotate函数以及arrowprops参数在可视化图像中添加箭头和文本注释(arrow and text annotation) 目录
- Yii2 中添加全局函数
方法一 直接在入口文件 web/index.php 里面写函数,示例代码如下: // 全局函数 if (!function_exists('pp')) {//传递数据以易于阅读的样式格式化后输出fun ...
- C++模板学习02(类模板)(类模板语法、类模板与函数模板的区别、类模板中的成员函数创建时机、类模板对象做函数参数、类模板与继承、类模板成员函数类外实现、类模板分文件编写、类模板与友元)
C++引用详情(引用的基本语法,注意事项,做函数的参数以及引用的本质,常量引用) 函数高级C++(函数的默认参数,函数的占位参数,函数重载的基本语法以及注意事项) C++类和对象-封装(属性和行为作为 ...
- python的进程池map函数_python进程池map
python进程池怎么实现 当进程池中任务队列非空时,才会触发worker进程去工作,那么如何向进程池中的任务队列中添加任务呢,进程池类有两组关键方法来创建任务,分别是apply/apply_asyn ...
- python 多进程multiprocessing 如何获取子进程的返回值?进程池pool,apply_async(),get(),
案例1 # -*- coding: utf-8 -*- """ @File : 20200318_摄像头多进程流传输.py @Time : 2020/3/18 14:58 ...
最新文章
- stm32 usart 单线半双工串口 DMA发送 最后一个字节发不出来问题
- ceontos7安装mysql5.5_centos7 安装mysql5.7及配置
- vue限制只能输入数字_vue的input中,如何限制只能输入number
- 用 Python 写软件原来这么简单
- 巴萨队徽_巴塞罗那选择Linux,Apple的Lisa OS开源,更多新闻
- bash功能特性二 命令别名和历史命令
- Fill-倒水问题(Uva-10603-隐式图路径寻找问题)
- 181201每日一句
- SEP客户端部署方式及故障处理手册____借鉴文档的思路方法
- vue中detele删除对象属性时视图不能响应更新 - 解决办法
- sqlite内存模式
- 1个月到2岁半的育儿方案,有了它宝宝都不用去上早教啦
- 智能名片为什么使用场景都是微信小程序?哪些新玩法值得一试?
- 想去美国?看完会成功率飙升的美国签证面试技巧
- 一英国公司打造极速家庭宽带:每秒1G
- vs2010c语言一闪而过,[转载]关于vs2010运行C程序时,运行结果窗口一闪而过的问题...
- OpenCV2.4.13 文本分割(水平垂直,直方图投影)
- python利用range生成包含1-10的列表_Python列表干货:创建数字列表:range()函数用法...
- Java EE入门教程系列第三章JavaBean(二)——JavaBean在JSP中的应用
- vue+echarts实现仪表盘