前言:
当前小伙伴们对“python多进程爬虫”可能比较注意,姐妹们都想要学习一些“python多进程爬虫”的相关文章。那么小编在网摘上搜集了一些对于“python多进程爬虫””的相关资讯,希望兄弟们能喜欢,小伙伴们快快来了解一下吧!为什么要用到多进程爬虫呢?从字面上看就知道,多进程的创建,应用在爬虫中主要目的是提高爬取的效率,实现秒爬。
python多进程中有几种进程模块,这里我们挑选Pool进程池来讲解。为什么要使用Pool进程池呢?因为要启动大量的子进程,用进程池的方式可以批量创建子进程,效率高。
下面将要讲解关于进程中所有常用的方法,主要有三种:
第一种:进程池普通模式
第二种:进程池同步模式
第二种:进程池异步模式
下面上干货了:
1.导入模块
import os import time import requests from lxml import etreefrom multiprocessing import Pool #导入进程池模块
2.创建的子进程函数:
子进程函数,child_process
def child_process(page): url = '' + str(page) + '/' # 设置头文件 header = {'User-Agent':'Mozilla/5.0'} # print('测试3--') response = requests.get(url,headers=header ) # print(response)
获取网址源代码
html = response.text
创建etr对象,是为了提取网页中的信息为我们所用
etr = etree.HTML(html)
提取用户名和搞笑数,用xpath的匹配方法
titles = etr.xpath('//h2/text()') # print('第',page,'页',titles) happy = etr.xpath('//span[@class="stats-vote"]/i/text()') # print('第',page,'页',happy)
这里是通过遍历获取用户的数量
x = 0 for k in range(len(titles)): # z注意是为了获取这一页几个用户 x += 1 # print(x)
这里为了容易分析,每一页只输出2个用户
for k in range(2): print("子进程开始执行>>> pid={},ppid={},当下时间:{}".format(os.getpid(), os.getppid(), time.ctime())) print('#'*10,'第',page,'页-第',k+1,'个用户','#'*10) # 输出用户名和搞笑数 print('【用户名】:',titles[k],'【搞笑数】:',happy[k])
休眠2秒
time.sleep(2) print("子进程终止>>> pid={},ppid={},编号{}".format(os.getpid(), os.getppid(), page)) print('子进程结束--')
3.主进程(重点内容:多进程的核心都在这里)
通过遍历创建一个个进程,放进进程池中
if __name__ == '__main__': pool = Pool(3)
这里通过遍历爬取5页的网页内容
for i in range(1,6):
第一种爬取方法:多进程普通模式
pool.map(func=child_process,iterable=(i,)) # 或者 pool.map(child_process, (i,)) 这种也对
第二种爬取方法:多进程同步模式
# pool.apply(func=child_process,args=(i,))
第三种爬取方法:多进程异步模式
# pool.apply_async(func=child_process,args=(i,))
关闭进程池,停止接受其它进程
pool.close()
join()很常用且重要。zuoy主进程阻塞等待子进程安全退出,父子进程同步
pool.join()
print("主进程终止")
提示:需要源代码的朋友,留言发给你
4.输出结果为:(部分结果)
子进程开始执行>>> pid=4928,ppid=11056,当下时间:Wed Oct 10 21:17:44 2018########## 第 1 页-第 1 个用户 ##########【用户名】: 教蚂蚁掐死大象 【搞笑数】: 420子进程开始执行>>> pid=4928,ppid=11056,当下时间:Wed Oct 10 21:17:44 2018########## 第 1 页-第 2 个用户 ##########
标签: #python多进程爬虫