鱼C论坛

 找回密码
 立即注册
查看: 3423|回复: 4

[已解决]多进程爬虫的顺序输出问题

[复制链接]
发表于 2018-2-13 06:44:55 | 显示全部楼层 |阅读模式

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

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

x
这些天捣鼓多进程,发现有个绕不过去的弯,就是多线程的顺序输出问题。
简单来说,就是开启了多进程爬虫后,可让不同线程同时抓取网页,但是返回的数据顺序并不是按照网页排列的顺序执行。
请问一下有什么好的解决办法吗?

以豆瓣Top250电影为例,写了如下代码:
  1. import requests
  2. from bs4 import BeautifulSoup
  3. from multiprocessing import Pool
  4. import time

  5. '''解析内容,并创建多线程执行,存入CSV文档中'''
  6. hds = {'User-Agent': 'ozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36'}
  7. def scraper(url):
  8.     r = requests.get(url, headers=hds)
  9.     #print(r.status_code)
  10.     soup = BeautifulSoup(r.text, 'lxml')
  11.     infos = soup.select("div.item")
  12.     for info in infos:
  13.         num = info.select('div.pic em')[0].text
  14.         name = info.span.text  ##选择info里面首次出现的span标签
  15.         rating = info.select("span.rating_num")[0].text
  16.         try:
  17.             comment = info.select("span.inq")[0].text.replace("\u22ef", "")
  18.         except:
  19.             comment = "【空】"
  20.         #print(num,name,rating,comment)

  21.         with open("movie_top250_3.csv", "a") as f:
  22.             f.write("{},{},{},{}\n".format(num, name, rating, comment))



  23. if __name__ == '__main__':    #多进程必须使用此语句,否则报错
  24.    
  25.     '''构建网页列表并将其入队'''
  26.     url_list = ["https://movie.douban.com/top250?start={}&filter=".format(str(i*25)) for i in range(0, 10)]
  27.     #print(url_list)
  28.    

  29.     start1 = time.time()
  30.     for url in url_list:
  31.         scraper(url)
  32.     stop1 = time.time()
  33.    
  34.     print("单线程耗时", stop1 - start1)

  35.     start2 = time.time()
  36.     pool = Pool(processes=2)
  37.     pool.map(scraper,url_list)
  38.     stop2 = time.time()
  39.     print("2个进程耗时", stop2 - start2)

  40.     start3 = time.time()
  41.     pool = Pool(processes=2)
  42.     pool.map(scraper,url_list)
  43.     stop3 = time.time()
  44.     print("4个进程耗时", stop3 - start3)
复制代码


结果:
  1. 耗时 4.628264665603638
  2. 耗时 3.9972286224365234
  3. 耗时 3.8952226638793945
复制代码


文件截图:
单线程的输出顺序没问题,后面的2进程和4进程顺序不确定。
2.png





最佳答案
2018-2-13 07:18:38
。。我是萌新啊。。
你试试先排序再存储。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-13 07:18:38 | 显示全部楼层    本楼为最佳答案   
。。我是萌新啊。。
你试试先排序再存储。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-13 08:25:32 | 显示全部楼层
新手·ing 发表于 2018-2-13 07:18
。。我是萌新啊。。
你试试先排序再存储。

感谢大神提供思路,排序的方法大概摸清楚了,可以用numpy模块结合sort方法来完成。但是苦于numpy的数组不知道如何导入,可否再指点一二?  在numpy中是否有类似于list的append方法可以导入数组呢?导入格式为:【2,霸王别姬,9.5,风华绝代。】
目前搜索了一些资料,暂时找不到答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-13 08:32:39 | 显示全部楼层
据我所知,你只能:
http://blog.csdn.net/lishuandao/article/details/52444288
通过增加行列,然后修改其中的内容。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-2-13 22:31:31 | 显示全部楼层
新手·ing 发表于 2018-2-13 08:32
据我所知,你只能:
http://blog.csdn.net/lishuandao/article/details/52444288
通过增加行列,然后修改 ...

谢谢,我有空再研究一下,今天一直忙其他事都抽不出时间。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 17:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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