QQ登录

只需一步,快速开始

登录 | 立即注册 | 找回密码

主题

帖子

荣誉

新鱼友

Rank: 1

积分
32
查看: 930|回复: 26

[技术交流] python爬虫爬取女u番号和磁力链接,封面,保存到csv文件

[复制链接]
最佳答案
0 
累计签到:4 天
连续签到:1 天
949898050 发表于 2017-8-7 23:28:25 93026 | 显示全部楼层 |阅读模式

马上注册加入鱼C,享用更多服务吧^_^

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

x
本帖最后由 949898050 于 2017-8-10 17:42 编辑

   暑假很无聊,学了一个月的爬虫,前两天写了一个爬取男人团上面的番号然后用番号到种子在线搜索的网站爬取磁力链接最后保存到csv文件的一个小案例,自己感觉很有趣,写一下大概的过程吧,给比我还新的爬虫选手参考参考。
    首先进入男人团的网站,选择一个女u,这里我选的波多老师,我们看第一页网页http://nanrenvip.net/boduoyejieyi/发现后面就是波多野结衣的拼音。再看下第二页
http://nanrenvip.net/boduoyejieyi/index_2.html就后面加了index_2.html以此类推后面多少页就改一个数字就行了。第一页不能用index_1亲测404。第一步先获得总共的页数,打开第一页拉到最下面,

                               
登录/注册后可看大图
在尾页的地方右键查看元素

                               
登录/注册后可看大图
所以一共18页。
获取页数的代码:
  1. def get_pages():
  2.     print('start get pages_num.')
  3.     lis = []
  4.     try:
  5.         url = 'http://nanrenvip.net/' + keyword + '/'   #构建第一页的url
  6.         html = urllib.request.urlopen(url,timeout=5)  #打开第一页,超时设置为5s
  7.         bsObj = BeautifulSoup(html,'lxml')
  8.         lis = bsObj.find('div',{'class':'dede_pages'}).find_all('li')#找到所有的页码
  9.     except Exception as e:
  10.         print(e)
  11.     if len(lis)>1:  #如果页数大于1  获取总页数
  12.         pages = lis[-1].a['href'].split('_')[-1].replace('.html','') #最后一个[-1]
  13.     else:
  14.         pages = 1  #否则页数为1
  15.     print('pages = ',pages)
  16.     return int(pages)
复制代码
每一个作品右键选择查看源代码,观察源代码发现每一个li标签代表一个作品,里面包含了一些我们需要的信息,
番号,封面,标题,时间,使用Beautifulsoup分别找到他们

                               
登录/注册后可看大图

                               
登录/注册后可看大图
代码:
  1. def get_one_page(pages):
  2.     print('begin get_one page')
  3.     global page
  4.     alls = []  #所有作品的列表
  5.     page = page + 1
  6.     if page <= pages:   #如果page数小于总数
  7.         if page == 1:
  8.             url ='http://nanrenvip.net/'+keyword+'/'  #第一页的url
  9.         else:
  10.             url = 'http://nanrenvip.net/'+keyword+'/index_'+str(page)+'.html' #后面的url
  11.         print(url)
  12.         try:
  13.             html = urllib.request.urlopen(url)
  14.             bsObj = BeautifulSoup(html,'lxml')
  15.             alls = bsObj.find_all('li',{'class':'post'})  #先找到所有class属性为post的li标签就是每一个作品
  16.         except Exception as e:
  17.             print(e)
  18.         for each in alls: #对每个作品
  19.             try:
  20.                 fengmian = '没获取到'   #初始化地址,封面地址里有-small和small-小图的意思,把它去掉获得高清大图
  21.                   #找到img标签,对照网页源代码data-original属性就是地址
  22.                 fengmian = each.find('img')['data-original'].replace('small-','').replace('-small','')
  23.             except Exception as e:
  24.                 print(e)
  25.             try:
  26.                 fanhao = '没获取到'
  27.                 fanhao = each.find('b').get_text()#番号在li标签的b标签里
  28.             except Exception as e:
  29.                 print(e)
  30.             try:
  31.                 the_time = '没获取到'   
  32.                 shijian = each.find_all('date')
  33.                 the_time = shijian[1].get_text()  #获取第二个date标签里的text就是日期
  34.             except Exception as e:
  35.                 print(e)
  36.             try:
  37.                 title = '没获取到'
  38.                 title = each.find('p').get_text() #li下面的p标签装的是名字
  39.             except Exception as e:
  40.                 print(e)

  41.             info.append([fanhao,the_time,title,fengmian])  #这个info是一个全局对象 创建在最前面 info = []
  42.         time.sleep(3)  #停3s太快可能会被封
  43.         get_one_page(pages)  #继续获取信息
复制代码

现在我们已经把所有需要的信息都添加在了info的列表里,现在该写入文件了。
多线程下载封面
  1. def get_fengmian():
  2.     global info
  3.     i = 0
  4.     dir = 'good/' + keyword + '/'
  5.     if not os.path.exists(dir):   #判断路径是否存在 不存在就创建
  6.         os.makedirs(dir)
  7.     def process_queue(i):   #等会创建线程的函数
  8.         try:
  9.             urllib.request.urlretrieve(info[i][3],filename=dir + info[i][0]+'.jpg') #下载
  10.         except Exception as e:
  11.             print(e)

  12.     threads = []
  13.     while i < len(info):   #i小于info的长度

  14.         for thread in threads:   #判断每一个thread是否存活,没存活就去掉
  15.             if not thread.is_alive():
  16.                 threads.remove(thread)
  17.         while len(threads) < 5 and i < len(info):

  18.             thread = threading.Thread(target=process_queue,args=(i,))  #创建线程调用process_queue参数为i
  19.             thread.setDaemon(True)
  20.             thread.start()    #开始
  21.             threads.append(thread)  #添加到threads的列表
  22.             i += 1    #下一个info

  23.         time.sleep(3)
复制代码

获取种子,网上随便找的在线种子搜索,abc-123代表番号/1-3是Hot的意思,就选最火热的一个。然后右键获取源代码,得到地址。

                               
登录/注册后可看大图
打开地址,按照之前使用Beautiful找到标签,获取内容的方法就能获取到磁力地址了

                               
登录/注册后可看大图
代码:
  1. def get_zhongzi():
  2.     print('start get zhongzi')
  3.     i = 0
  4.     def process_queue(i):
  5.         #因为我们之前apend的时候是append的列表所以对于每一个的番号就是info[i][0]
  6.         search_url = 'http://www.btwhat.net/search/'+info[i][0]+'/1-3.html' #构建地址
  7.         try:
  8.             html = urllib.request.urlopen(search_url,timeout=5).read()
  9.             bsObj = BeautifulSoup(html,'lxml')
  10.             #获取第一个的地址
  11.             choose_hot_one = 'http://www.btwhat.net'+bsObj.find('div',{'class':'search-item'}).a['href']

  12.             zhongzi_page = urllib.request.urlopen(choose_hot_one,timeout=5)
  13.             bsObj = BeautifulSoup(zhongzi_page,'lxml')
  14.             cili = '没获取到'
  15.             if bsObj.find('div',{'class':'panel-body'}):
  16.                 cili = bsObj.find('div',{'class':'panel-body'}).a['href']  #获取种子

  17.             info[i].append(cili)  #对每一个append磁力链接
  18.             print(info[i])
  19.         except Exception as e:
  20.             print(e)
  21.     i = 0
  22. #和前面一样 多线程
  23.     threads = []
  24.     while i < len(info):
  25.         for thread in threads:
  26.             if not thread.is_alive():
  27.                 threads.remove(thread)
  28.         while i<len(info) and len(threads)<5:
  29.             thread = threading.Thread(target=process_queue,args=(i,))
  30.             thread.setDaemon(True)
  31.             thread.start()
  32.             threads.append(thread)
  33.             i += 1
  34.         time.sleep(SLEPP_TIME)
复制代码

写入csv文件:
  1. def write_to_csv():
  2.     print('xieru csv')
  3.     filename = 'good/'+keyword+'/'+keyword+'.csv'
  4.     path = os.path.dirname(filename)
  5.     if not os.path.exists(path):
  6.         os.makedirs(path)
  7.     csvfile = open(filename,'w')
  8.     writer = csv.writer(csvfile)
  9.     try:
  10.         writer.writerow(['番号','上映时间','标题','封面地址','种子'])
  11.     except Exception as e:
  12.         print(e)

  13.     global info

  14.     def process_queue(i):
  15.         try:
  16.             writer.writerow(info[i])
  17.         except Exception as e:
  18.             print(e)
  19.     i = 0
  20.     threads = []
  21.     while i < len(info):
  22.         for thread in threads:
  23.             if not thread.is_alive():
  24.                 threads.remove(thread)
  25.         while i < len(info) and len(threads) < 10:
  26.             thread = threading.Thread(target=process_queue,args=(i,))
  27.             thread.setDaemon(True)
  28.             thread.start()
  29.             threads.append(thread)
  30.             i += 1

  31.     csvfile.close()
复制代码

结果:

                               
登录/注册后可看大图

                               
登录/注册后可看大图
代码全部在:
游客,如果您要查看本帖隐藏内容请回复
改下代码中的名字 就能获取不同人的信息
写的乱七八糟。 0.0




楼层
跳转到指定楼层
最佳答案
0 
累计签到:4 天
连续签到:1 天
949898050  楼主| 发表于 2017-8-11 10:18:05 | 显示全部楼层
最佳答案
11 
累计签到:13 天
连续签到:13 天
shinemic 发表于 2017-8-11 12:37:20 | 显示全部楼层
虽为黄帖,但很有技术!
最佳答案
0 

尚未签到

zxcf144 发表于 2017-8-13 10:00:12 | 显示全部楼层
最佳答案
56 
累计签到:355 天
连续签到:1 天
jerryxjr1220 发表于 2017-8-13 10:22:12 From FishC Mobile | 显示全部楼层
多看伤身
最佳答案
0 
累计签到:9 天
连续签到:1 天
Enjoyjiajia 发表于 2017-8-14 12:18:22 | 显示全部楼层
本着学习的态度来的
最佳答案
0 

尚未签到

fromtokyo 发表于 2017-8-14 12:39:58 | 显示全部楼层
感謝分享~~~~~~~~~
最佳答案
0 
累计签到:58 天
连续签到:1 天
2740710202 发表于 2017-8-14 15:33:01 | 显示全部楼层
哈哈,这个是学习的动力啊
最佳答案
0 
累计签到:260 天
连续签到:1 天
drin 发表于 2017-8-14 16:02:41 | 显示全部楼层
厉害了老铁,学习学习,学习python学习车技
最佳答案
0 
累计签到:58 天
连续签到:1 天
2740710202 发表于 2017-8-15 09:32:29 | 显示全部楼层
运行后出现这个问题是什么意思啊
start get pages.
'NoneType' object has no attribute 'find_all'
pages =  1
begin get_one page
http://nanrenvip.net/caimeixunguo/
begin get_one page
start get zhongzi
xieru csv
最佳答案
0 
累计签到:4 天
连续签到:1 天
949898050  楼主| 发表于 2017-8-15 11:53:39 | 显示全部楼层
2740710202 发表于 2017-8-15 09:32
运行后出现这个问题是什么意思啊
start get pages.
'NoneType' object has no attribute 'find_all'

可能你网页不对  
最佳答案
0 
累计签到:4 天
连续签到:1 天
949898050  楼主| 发表于 2017-8-15 12:01:34 | 显示全部楼层
2740710202 发表于 2017-8-15 09:32
运行后出现这个问题是什么意思啊
start get pages.
'NoneType' object has no attribute 'find_all'

没毛病呀  我刚把代码复制运行了一遍,你哪个没找到可能是因为网页没打开
start get pages.
pages =  3
begin get_one page
http://nanrenvip.net/caimeixunguo/
begin get_one page
http://nanrenvip.net/caimeixunguo/index_2.html
begin get_one page
http://nanrenvip.net/caimeixunguo/index_3.html
begin get_one page
start get zhongzi
['ABP-607', '2017-06-23', 'あやみ旬果を、飼いならす。 3', 'http://img1.nanrenvip.net/uploads/2017/05/pb_e_tktabp-607.jpg', 'magnet:?xt=urn:btih:eb7e5a47c4f1dec3ba604c76accf220746b071d']
最佳答案
0 
累计签到:5 天
连续签到:1 天
octopussss 发表于 2017-8-15 13:14:14 From FishC Mobile | 显示全部楼层
支持一个
最佳答案
0 

尚未签到

logic_s 发表于 2017-8-15 14:40:10 | 显示全部楼层
带着目的学习
最佳答案
0 
累计签到:58 天
连续签到:1 天
2740710202 发表于 2017-8-15 16:05:01 | 显示全部楼层

可以了,有个地方弄错了
最佳答案
0 

尚未签到

pythonxxzy 发表于 2017-9-18 20:57:30 | 显示全部楼层
初学者学习一下。
最佳答案
0 
累计签到:2 天
连续签到:2 天
十梦九妳 发表于 2017-9-18 22:48:08 From FishC Mobile | 显示全部楼层
请问像你这种水平可以独立写出想实现的功能,需要多久~
最佳答案
0 
累计签到:42 天
连续签到:4 天
baicel21314 发表于 2017-9-19 08:39:48 | 显示全部楼层
楼主,你是一个大好人!!
最佳答案
0 

尚未签到

Communication 发表于 2017-9-19 22:35:19 | 显示全部楼层
xuexixuexi
最佳答案
0 
累计签到:4 天
连续签到:1 天
949898050  楼主| 发表于 2017-9-21 11:22:24 | 显示全部楼层
十梦九妳 发表于 2017-9-18 22:48
请问像你这种水平可以独立写出想实现的功能,需要多久~

一下午

发表回复

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

本版积分规则

关闭

小甲鱼强烈推荐 上一条 /2 下一条

    移动客户端下载(未启用)
    微信公众号

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备11014136号

Copyright 2018 鱼C论坛 版权所有 All Rights Reserved.

Powered by Discuz! X3.1 Copyright
© 2001-2018 Comsenz Inc.    All Rights Reserved.

小黑屋|手机版|Archiver|鱼C工作室 ( 粤公网安备 44051102000370号 | 粤ICP备11014136号

GMT+8, 2017-12-16 18:51

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