鱼C论坛

 找回密码
 立即注册
查看: 706|回复: 16

[已解决]多线程和多进程的问题

[复制链接]
发表于 2018-10-24 23:47:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
以前写爬虫都是单线程单进程来爬,现在看到网络上要多线程多进程,想想也是哈,对于大量数据还是得快点才行,那么问题来了,有人说在某些情况下还不如单线程爬的快,那哪个时候用多线程哪个时候用多进程?比如爬取风景图http://pic.netbian.com/4kfengjing/以这个网址为例,如何能更快又不被服务器那边察觉到爬虫。
  1. import requests,re,os,time
  2. from bs4 import BeautifulSoup
  3. from fake_useragent import UserAgent
  4. def openurl(url):
  5.     ua=UserAgent()
  6.     head={'User-Agent':ua.random}
  7.     res=requests.get(url,headers=head)
  8.     res.encoding=res.apparent_encoding
  9.     html=res.text
  10.     return html

  11. def main():
  12.     ua=UserAgent()
  13.     for i in range(2,176):
  14.         url='http://pic.netbian.com/4kfengjing/index_%d.html'%i
  15.         html=openurl(url)
  16.         soup=BeautifulSoup(html,'lxml')
  17.         ul=soup.find('ul',class_="clearfix")
  18.         img = ul.findAll('img')
  19.         for each in img:
  20.             newurl='http://pic.netbian.com'+each.attrs['src']
  21.             filename=newurl.split('/')[-1]
  22.             with open(filename,'wb') as f:
  23.                 f.write(requests.get(newurl,headers={"User-Agent":ua.random}).content)
  24.                 time.sleep(1)
  25. if __name__=='__main__':
  26.     os.mkdir('../小爬爬成果/4k风景图')
  27.     os.chdir('../小爬爬成果/4k风景图')
  28.     main()
复制代码
这是我的代码,把所有的风景图都爬下来了,虽然中间没有报403之类的错误,但速度确实不敢恭维。希望大佬们能讲讲该在哪个时候使用多线程或多进程,另外可以以这个实例补充一下代码。让爬取速度增加,不考虑电脑配置的影响。
最佳答案
2018-10-25 10:08:49
用scrapy,有一个注意的点是一定要写好网址规则。  
由于scrapy是异步的,如果直接进行全站爬取,会导致图片分类错误。  
最要一个一个来,例如先爬风景,然后到动漫。这样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-25 10:04:42 From FishC Mobile | 显示全部楼层
一般不会采取多进程,开启一个进程消耗比较大,可以用多线程,多进程一般适用于大量的数据运算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 10:08:49 | 显示全部楼层    本楼为最佳答案   
用scrapy,有一个注意的点是一定要写好网址规则。  
由于scrapy是异步的,如果直接进行全站爬取,会导致图片分类错误。  
最要一个一个来,例如先爬风景,然后到动漫。这样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 11:30:17 | 显示全部楼层
线程之间有线程锁GIL(没记错的话)如果你需要对一个数组做操作的时候,就会发生锁止影响效率。可以选用多进程代码,并通过queue来传递数据。不过一般写爬虫为什么要用多路并发呢,这样做反而容易被封。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-25 17:14:35 | 显示全部楼层
幽梦三影 发表于 2018-10-25 10:04
一般不会采取多进程,开启一个进程消耗比较大,可以用多线程,多进程一般适用于大量的数据运算

哦,那就是说那种大量数据运算的才用多进程了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-25 17:16:36 | 显示全部楼层
colinshi 发表于 2018-10-25 11:30
线程之间有线程锁GIL(没记错的话)如果你需要对一个数组做操作的时候,就会发生锁止影响效率。可以选用多 ...

啊啊,你和2楼的说法完全相反呢,就本列来讲,如何能加快速度,能演示一下代码最好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 17:48:17 From FishC Mobile | 显示全部楼层
fan1993423 发表于 2018-10-25 17:16
啊啊,你和2楼的说法完全相反呢,就本列来讲,如何能加快速度,能演示一下代码最好

GIL确实有的,多线程多进程都可以用queue进行通信,但是这样效率和单线程差不多,其实效率最高的是异步,如果你想了解多线程编程可以单独学习一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-25 18:10:43 | 显示全部楼层
幽梦三影 发表于 2018-10-25 17:48
GIL确实有的,多线程多进程都可以用queue进行通信,但是这样效率和单线程差不多,其实效率最高的是异步, ...

那异步用什么了,我只知道scrapy,目的就是增加爬取速度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-25 18:15:11 | 显示全部楼层
wongyusing 发表于 2018-10-25 10:08
用scrapy,有一个注意的点是一定要写好网址规则。  
由于scrapy是异步的,如果直接进行全站爬取,会导致图 ...

哦,你的意思是不是先设个starturl,然后慢慢延伸到其他url,这样来爬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 19:01:24 | 显示全部楼层
fan1993423 发表于 2018-10-25 18:15
哦,你的意思是不是先设个starturl,然后慢慢延伸到其他url,这样来爬


是的,不然你后期分类很麻烦
还有一点是,以后要把爬虫的速度压下来,不然会被封ip。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-25 21:35:43 | 显示全部楼层
wongyusing 发表于 2018-10-25 19:01
是的,不然你后期分类很麻烦
还有一点是,以后要把爬虫的速度压下来,不然会被封ip。

咋个压,time.sleep()?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 21:51:19 | 显示全部楼层
fan1993423 发表于 2018-10-25 21:35
咋个压,time.sleep()?

是的,虽然现在爬取大多数的小型网站不会检查你的浏览速度。  
以后真正爬取的时候,必须把速度压下来。  

除非你有一堆的代理ip和曲奇池

以爬取微信公众号为例,你在一定时间内(大概1分钟7篇文章)就会封ip。  

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-25 21:54:06 | 显示全部楼层
wongyusing 发表于 2018-10-25 21:51
是的,虽然现在爬取大多数的小型网站不会检查你的浏览速度。  
以后真正爬取的时候,必须把速度压下来。 ...

哦,但是这样会不会效率太低了呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 22:04:56 From FishC Mobile | 显示全部楼层
fan1993423 发表于 2018-10-25 21:54
哦,但是这样会不会效率太低了呢

现在爬取大型网站的数据,曲奇池和ip池是不可缺少的。
而且会有好多台服务器,采取分布式爬取。

上面我说的微信公众号爬取,别人手上百上千的ip去撞着来用。
爬一次,ip封三天,
而手头上没有资源只能压速度来爬取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-25 22:06:04 | 显示全部楼层
wongyusing 发表于 2018-10-25 22:04
现在爬取大型网站的数据,曲奇池和ip池是不可缺少的。
而且会有好多台服务器,采取分布式爬取。

哦哦,感觉现在的免费IP池的IP都不能用。曲奇池是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-25 22:07:45 From FishC Mobile | 显示全部楼层
fan1993423 发表于 2018-10-25 22:06
哦哦,感觉现在的免费IP池的IP都不能用。曲奇池是什么?

英语翻译一下,直接说会被审核
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-25 22:15:16 | 显示全部楼层
wongyusing 发表于 2018-10-25 22:07
英语翻译一下,直接说会被审核

哦,懂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 18:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表