鱼C论坛

 找回密码
 立即注册
查看: 5566|回复: 9

[技术交流] 用python爬取宅男们心中的女优排行榜

[复制链接]
发表于 2018-7-6 20:26:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 chenxz186 于 2018-7-6 20:29 编辑

1.jpg
        是否觉得TOP.1那位很熟?没错,她就是波多野结衣,人称波姐,竟然成为广大宅男心中的NO.1,厉害厉害。可惜我不是很喜欢看她的片片,我喜欢的水野朝阳,小川阿佐美,西野翔等等,当然你们也可以通过此程序来爬取你们心中的女神到底在排行榜哪几名。
        这次的程序用到模块相对比较多,分别是requests, bs4, multiprocessing,time, datetime, os
        这次爬虫里用到多进程,特别是apply_async 异步非阻塞的方法,若用apply方法就跟单进程没啥分别,因为它是进入子进程执行后,等待当前子进程执行完毕,在继续执行下一个进程,所以python官方才建议:废弃apply,使用apply_async。
        好了,上代码先。
  1. import requests
  2. import bs4
  3. from multiprocessing import Pool
  4. import time
  5. import datetime
  6. import os
  7. '''成功作品,吸取上一个作品的失败而作,我将38个子网页不再分成38个子进程,而是将每个子网页要爬的所有图片分成相
  8. 应的子进程去爬,例如每1页有50个图片就分成50个子进程去爬,38页只有一个就一个进程去爬。'''


  9. def download_actress_img(data):
  10.     file = data[2]
  11.     print(datetime.datetime.now())
  12.     print('进程号-%s' % (os.getpid()))
  13.     print(data[0])
  14.     actress_res = open_url(data[1])
  15.     filename = file + '/%s.jpg' % data[0]
  16.     print(filename)
  17.     with open(filename, 'ab') as f:
  18.         f.write(actress_res.content)


  19. def find_actress_urls(soup):
  20.     # 女优排名
  21.     actress_top = []
  22.     all_need_td = soup.find_all('td', class_="main2_title_td")
  23.     # all_need_td = soup.select('.main2_title_td')# 或者用CSS选择器
  24.     for each in all_need_td:
  25.         actress_top.append(each.text)
  26.     # 找出女优的名字
  27.     actress_names = []
  28.     all_need_a = soup.find_all('a', target="_blank")
  29.     # all_need_a = soup.select('.clink')# 或者用CSS选择器
  30.     for each in all_need_a:
  31.         if 'vote/rankdetail' in each['href']:
  32.             actress_names.append(each.text)
  33.     # 找出女优的链接
  34.     actress_urls = []
  35.     all_need_img = soup.find_all('img')
  36.     # all_need_img = soup.select('a img')# 或者用CSS选择器
  37.     for each in all_need_img:
  38.         actress_urls.append(('http://www.ttpaihang.com/image/vote/' + each['src'].split('/', 3)[3]))
  39.     print(actress_urls)
  40.     # 女优名与链接相应对接
  41.     actress_data = []
  42.     length = len(actress_top)
  43.     for j in range(length):
  44.         actress_data.append([actress_top[j] + ' ' + actress_names[j], actress_urls[j]])
  45.     return actress_data


  46. def cooking_soup(res):
  47.     soup = bs4.BeautifulSoup(res.text, 'html.parser')
  48.     return soup


  49. def open_url(url):
  50.     headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
  51.                              ' Chrome/55.0.2883.87 Safari/537.36'}
  52.     res = requests.get(url, headers=headers)
  53.     res.encoding = 'gbk'
  54.     return res


  55. def file_func(folder='actressTop'):
  56.     """生成文件夹"""
  57.     if os.path.exists(folder):
  58.         os.chdir(folder)
  59.     else:
  60.         os.mkdir(folder)
  61.         os.chdir(folder)
  62.     file = os.getcwd()
  63.     return file


  64. def main():
  65.     file = file_func()
  66.     for i in range(1, 39):
  67.         page_url = 'http://www.ttpaihang.com/vote/rank.php?voteid=1089&page=%d' % i
  68.         res = open_url(page_url)
  69.         soup = cooking_soup(res)
  70.         actress_data = find_actress_urls(soup)
  71.         for d in range(len(actress_data)):
  72.             actress_data[d].append(file)
  73.         length = len(actress_data)
  74.         p = Pool(length)
  75.         print(actress_data)
  76.         # p.map(download_actress_img, actress_data) # 用map()虽然可以1行代码代替下面2行代码,虽然相对快点,但出现某些图片损坏
  77.         for each in actress_data:
  78.             p.apply_async(download_actress_img, args=(each,))
  79.         p.close()
  80.         p.join()


  81. if __name__ == '__main__':
  82.     start_time = time.time()
  83.     main()
  84.     print('全部结束,耗时%d' % (time.time() - start_time))

复制代码



点击运行后,程序就会将女优排行榜内的女优排名及图片都下载下来。直接看我的截图吧。
1.png
这只是冰山一角,你们可以慢慢体会。感觉有了requests及bs4这两个模块后,能随便的为所欲为了,哈哈,我还用它们爬一些些羞羞的网站,咳咳,还是说正经的话题吧。以上的代码若需要我逐个分析的话,请各位在留言,我会将里面每个函数体及模块都详细讲解下,也说下我为何这样写代码。好了,今日的帖就到此结束,我还要继续做量化去。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-7-6 21:35:42 | 显示全部楼层
滴滴滴
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-6 23:15:33 | 显示全部楼层
666厉害啊啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-7 00:31:44 | 显示全部楼层
图片不打码啊= =,,小心被和谐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-7 07:17:40 | 显示全部楼层
塔利班 发表于 2018-7-7 00:31
图片不打码啊= =,,小心被和谐

这是公开的女优排行榜的网站啊,而且她们也不露哦,哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-7 07:18:21 | 显示全部楼层

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

使用道具 举报

发表于 2018-7-7 14:56:29 | 显示全部楼层
效率很低啊^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-8 12:05:05 From FishC Mobile | 显示全部楼层
zhou995287902 发表于 2018-7-7 14:56
效率很低啊^_^

是有些低,不过加了多进程了,速度已提升3到5倍,这速度还要再改善下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 10:38:59 | 显示全部楼层
上个车
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-7 13:45:17 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 02:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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