QQ登录

只需一步,快速开始

搜索
鱼C论坛笔记大赛成绩公示
查看: 756|回复: 0

[原创] 哈哈哈哈,分享一下我的爬虫小分队.

[复制链接]
最佳答案
0 
累计签到:8 天
连续签到:3 天
发表于 2017-9-11 14:23:18 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 神奇的yxq 于 2017-9-11 14:29 编辑

学完小甲鱼的爬虫教程,迫不及待的写了几个爬虫~

爬虫功能:爬取电影资源

py版本:3.6.2

放源码:

1、主爬虫代码:

  1. #爬虫名称:movies爬
  2. #爬虫功能:爬取电影资源,生成一个html文本
  3. #爬虫版本:1.0
  4. #作者:yangxq
  5. #时间:2017.09.10

  6. import sys
  7. sys.path.append('E:\LearnCode\python\MyMod')
  8. import re
  9. import random
  10. import gethtml
  11. import time
  12. import savehtml

  13. #主函数
  14. def main():
  15.     target = 'http://www.mp4ba.net/'

  16.     #需要爬取的页数
  17.     pages = 10
  18.    
  19.     #逐页爬取电影
  20.     for i in range(1,pages + 1):
  21.         
  22.         #拼接每页的地址
  23.         pageurl = target + 'forum-mp4ba-' + str(i) +'.html'
  24.         
  25.         #获取第i页的电影列表
  26.         code,html = gethtml.gethtml(pageurl)
  27.         html = html.decode(code)
  28.         
  29.         print('\n正在访问第 %d/10页 : %s\n' % (i,pageurl) + '-' * 50)
  30.         movies_name,movies_url = getmovies(html)
  31.         num = len(movies_name)

  32.         info = []
  33.         #获取每个电影的磁力链接
  34.         for j in range(num):
  35.             print('\n第%d页 %d/%d | 正在爬取 %s 的详情页...' % (i,j + 1,num,movies_name[j]))
  36.             code,html = gethtml.gethtml(movies_url[j])
  37.             html = html.decode(code)
  38.             movies_summary,magnet= getmagnet(html)
  39.             print('\n%s 的资源已经爬取!正在赶往下一个网页...' % movies_name[j] + '\n' * 2 + '-' * 30 )

  40.             temp = []
  41.             #电影信息打包处理
  42.             temp.append(movies_summary)
  43.             for each in magnet:
  44.                 temp.append(magnet)
  45.             info.append(temp)

  46.         #按页保存到html文件
  47.         savehtml.savehtml(movies_name,movies_url,info)

  48. #获取页面电影链接
  49. def getmovies(html):
  50.     movies_name = []
  51.     movies_url = []

  52.     start = 10
  53.     #循环查找电影名称和链接
  54.     while True:
  55.         
  56.         #页面上电影名称开始特征'xst' 结束特征'<'
  57.         start = html.find('xst',start)
  58.         #当查找不到xst时退出循环
  59.         if start == -1:
  60.             break
  61.         end = html.find('<',start + 5)
  62.         print('\n已找到 : %s' % html[start + 5:end])
  63.         movies_name.append(html[start + 5:end])

  64.         #电影详情网址链接在'xst'之前第一个'href'之后 结束特征'"'
  65.         begin = html.find('href=',start - 100)
  66.         stop = html.find('"',begin + 6)
  67.         movies_url.append(html[begin + 6:stop])

  68.         #进入下一个查找段
  69.         start += 100
  70.    
  71.     #返回主页上的电影的网址列表
  72.     num = len(movies_name)
  73.     print('\n本页查找完毕!       共发现电影 %s 部\n' %num + '-' * 50)
  74.     return (movies_name,movies_url)

  75. #获取磁力链接
  76. def getmagnet(html):
  77.     magnet = []

  78.     #查找简介 特征'简介' 结束特征'<'
  79.     start = html.find('◎简  介')
  80.     end = html.find('<div',start + 10)
  81.     movies_summary = html[start + 12:end - 1]

  82.     #删除错误截取的html代码
  83.     div = movies_summary.find('div')
  84.     movies_summary = movies_summary[0:start - 2]

  85.     print('\n  简介:\n%s' % movies_summary)
  86.    
  87.     #循环查找磁链
  88.     end = 0
  89.     while True:

  90.         #磁链开始特征'magnet:?' 结束标志'<'
  91.         start = html.find('magnet:?',end)
  92.         #当查找不到'magnet:?'时退出循环
  93.         if start == -1:
  94.             if len(magnet) == 0:
  95.                 magnet.append('http://www.mp4ba.net/')   
  96.             break
  97.         end = html.find('>',start)
  98.         print('\n  磁力:%s' % html[start:end])
  99.         magnet.append(html[start:end])
  100.         #进入下一个查找段

  101.     #返回磁力链接列表
  102.     return (movies_summary,magnet)
  103.         
  104. if __name__ == '__main__':
  105.     print('\n爬虫开始工作...')
  106.     main()

复制代码


因为需要写入到html文件,所有单独写了一个功能为保存为html的单独代码
2、保存功能的代码:

  1. import time

  2. def savehtml(movies_name,movies_url,info):
  3.    
  4.     htmlinit = '''<!doctype html><html lang="zh-cn" ><head><meta charset="GBK"><title>MoviesList</title></head><body><h3 align="center" id="1">欢迎使用yangxq的电影爬虫</h3><h6 align="center"><stong>Yangxq</stong></h6><hr><hr>'''
  5.     localtime = time.localtime()
  6.    
  7.     htmlname = 'MoviesList'      + '_' + \
  8.                str(localtime[0]) + '_' + \
  9.                str(localtime[1]) + '_' + \
  10.                str(localtime[2]) +  '.html'
  11.    
  12.     with open(htmlname,'a+') as f:
  13.         #将文件指针指向第一个字符
  14.         f.seek(0,0)
  15.         html = f.read()

  16.         #第一次写入初始化
  17.         if '<!doctype' not in html:
  18.              f.seek(0,0)
  19.              f.write(htmlinit)
  20.         
  21.         #不是第一次写入则删除尾部结束代码
  22.         if '</p></body></html>' in html:
  23.             tel = html.find('</p></body></html>')
  24.             f.seek(tel,0)
  25.         
  26.         #按格式写入文件
  27.         num = len(movies_name)
  28.         for i in range(num):
  29.             if movies_name[i] in html:
  30.                 continue
  31.             
  32.             #第一行显示电影名称
  33.             lines1 = '''<p><a target="_blank" href="'''+ movies_url[i] + '''"><big><stong>''' + movies_name[i] + '</stong></big></a><br>' + '-' * 30 + '<br>'
  34.             #第二行显示电影简介
  35.             lines2 = '<i><small>' + info[i][0] + '</small></i><br>' + '-' * 30 + '<br>'
  36.             #第三行显示下载地址
  37.             magnetnum = len(info[i][1])
  38.             lines3 = ''
  39.             for j in range(magnetnum):
  40.                 lines3 = lines3 + '''<a href="'''+ info[i][1][j] + '''">下载地址''' + str(j + 1) + '''</a>     '''

  41.             lines = lines1 + lines2 + lines3 + '<hr>'
  42.             f.write(lines)
  43.         #结束代码
  44.         lines4 = '</p></body></html>'
  45.         f.write(lines4)
  46.         print('\n保存完毕!')

  47. if __name__ == '__main__':
  48.     movies_name=['电影一','电影二']
  49.     info = [['我是电影一的简介',['我是电影一的第一个磁力','我是电影一的第二个磁力']],['我是电影二的简介',['我是电影二的第一个磁力','我是电影二的第二个磁力']]]
  50.     savehtml(movies_name,info)
复制代码



为了提高通用性,把访问代码单独出来了。
3、提供访问功能的代码

  1. import random
  2. import urllib.request
  3. import time
  4. import os


  5. def gethtml(url,data = None):
  6.     #建立地址表和协议表,获取代理ip
  7.     ipadds = []
  8.     iptype = []

  9.     #加上协议
  10.     if 'http://' not in url:
  11.         url = 'http://' + url
  12.    
  13.     #从文件获取ip
  14.     timename = time.localtime()
  15.     ipname = 'iplist_' + str(timename[0]) + '_' +\
  16.                          str(timename[1]) + '_' +\
  17.                          str(timename[2]) + '.txt'

  18.     #不是当天最新的iplist则运行ipget更新
  19.     if ipname not in os.listdir():
  20.         try:
  21.             import ipget
  22.             ipget.main()
  23.             with open(ipname,'r') as ip:
  24.                 iplist = ip.read().split('\n')
  25.                 for each in iplist:
  26.                     iptype.append(each[0:5])
  27.                     ipadds.append(each[8:])
  28.         except ModuleNotFoundError:
  29.             ipadds = ['125.93.148.3:9000','123.7.38.31:9999','220.249.185.178:9999']
  30.             iptype = ['HTTP','HTTP','HTTP']
  31.     else:
  32.         with open(ipname,'r') as ip:
  33.             iplist = ip.read().split('\n')
  34.             for each in iplist:
  35.                 iptype.append(each[0:5])
  36.                 ipadds.append(each[8:])

  37.    
  38.     #代理和伪装
  39.     r = len(ipadds)
  40.     i = int(random.uniform(0,r))
  41.     if __name__ == '__main__':
  42.         print('\n本次访问使用 %s : %s 代理...' % (iptype[i],ipadds[i]))
  43.         
  44.     proxy_support = urllib.request.ProxyHandler({iptype[i]:ipadds[i]})
  45.     opener = urllib.request.build_opener(proxy_support)
  46.     urllib.request.install_opener(opener)

  47.     req = urllib.request.Request(url,data)
  48.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
  49.     #req.add_header('Host','www.mmjpg.com')
  50.     #req.add_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')
  51.     #req.add_header('Accept-Encoding','gzip, deflate, sdch')
  52.     #req.add_header('Accept-Language','zh-CN,zh;q=0.8')
  53.     #req.add_header('Cache-Control','max-age=0')
  54.     #req.add_header('Referer','http://www.mmjpg.com/' + str(i))

  55.     #访问
  56.     response = urllib.request.urlopen(req)
  57.     html = response.read()

  58.     #不要太过分,休息1~5秒
  59.     code = codetest(html)
  60.     time.sleep(int(random.uniform(1,6)))
  61.     return (code,html)

  62. #网页编码测试
  63. def codetest(html):
  64.     try:
  65.         html = html.decode('UTF-8')
  66.         return 'UTF-8'
  67.     except UnicodeDecodeError:
  68.         try:
  69.             html = html.decode('GBK')
  70.             return 'GBK'
  71.         except UnicodeDecodeError:
  72.             try:
  73.                 html = html.decode('GB18030')
  74.                 return 'GB18030'
  75.             except UnicodeDecodeError:
  76.                 return 'unknow'

  77.    
  78. if __name__ == '__main__':
  79.     print('请输入测试网址: ',end = '')
  80.     url = input()
  81.     code,html = gethtml(url)
  82.    
  83.     print('\n该网页编码是: %s' % code)
  84.     if code != 'unknow':
  85.         with open(url + '.html','w') as f:
  86.             html = html.decode(code)
  87.             f.write(html)
  88.             print('\n文件写入完毕!')
复制代码



防被封,每天第一次运行上面的gethtml时调用这个获取最新的ip
4、ip爬虫

  1. #爬虫名称:ipget
  2. #爬虫功能:从ip代理网站爬取代理ip并时间保存
  3. #爬虫作者:yangxq
  4. #时间:2017.09.09


  5. import urllib.request
  6. import random
  7. import time
  8. import re

  9. #主函数
  10. def main():
  11.     url = 'http://www.xicidaili.com/'
  12.     code,html = gethtml(url)
  13.     html = html.decode(code)
  14.     iplist = ipfind(html)
  15.     ipsave(iplist)

  16. #查找ip
  17. def ipfind(html):
  18.     iplist = {}
  19.     ip = []
  20.    
  21.     #正则匹配ip,端口和协议
  22.     ipadds = re.findall(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',html)
  23.    
  24.     ipport = re.findall(r'<td>\d{1,5}</td>',html)
  25.     ipport = re.findall(r'\d{1,5}',str(ipport))
  26.    
  27.     iptype = re.findall(r'<td>HTTPS</td>|<td>HTTP</td>',html)
  28.     iptype = re.findall(r'HTTPS|HTTP',str(iptype))

  29.     #以协议数量为标准得到可用ip数量,去除ss协议的ip
  30.     ipnum = len(iptype)
  31.    
  32.     #拼接ip和端口,并导入字典,ip为键,协议为值
  33.     for i in range(ipnum):
  34.         ipadd = ipadds[i] + ':' + ipport[i]
  35.         ip.append(ipadd)
  36.         iplist[ip[i]] = iptype[i]
  37.         
  38.     ipnum = len(iplist)
  39.     if __name__ == '__main__':
  40.         print('\n已去掉重复ip地址,最终获得ip地址 %d 个' % ipnum)
  41.    
  42.     return iplist

  43. def gethtml(url,data = None):
  44.    
  45.     ipadds = ['125.93.148.3:9000','123.7.38.31:9999','220.249.185.178:9999']
  46.     iptype = ['HTTP','HTTP','HTTP']

  47.     #代理和伪装
  48.     r = len(ipadds)
  49.     i = int(random.uniform(0,r))
  50.     if __name__ == '__main__':
  51.         print('\n本次访问使用 %s : %s 代理...' % (iptype[i],ipadds[i]))
  52.         
  53.     proxy_support = urllib.request.ProxyHandler({iptype[i]:ipadds[i]})
  54.     opener = urllib.request.build_opener(proxy_support)
  55.     urllib.request.install_opener(opener)

  56.     req = urllib.request.Request(url,data)
  57.     req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
  58.     #req.add_header('Host','www.mmjpg.com')
  59.     #req.add_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8')
  60.     #req.add_header('Accept-Encoding','gzip, deflate, sdch')
  61.     #req.add_header('Accept-Language','zh-CN,zh;q=0.8')
  62.     #req.add_header('Cache-Control','max-age=0')
  63.     #req.add_header('Referer','http://www.mmjpg.com/' + str(i))

  64.     #访问
  65.     response = urllib.request.urlopen(req)
  66.     html = response.read()

  67.     #不要太过分,休息1~5秒
  68.     code = codetest(html)
  69.     time.sleep(int(random.uniform(1,6)))
  70.     return (code,html)

  71. def codetest(html):
  72.     try:
  73.         html = html.decode('UTF-8')
  74.         return 'UTF-8'
  75.     except UnicodeDecodeError:
  76.         try:
  77.             html = html.decode('GBK')
  78.             return 'GBK'
  79.         except UnicodeDecodeError:
  80.             try:
  81.                 html = html.decode('GB18030')
  82.                 return 'GB18030'
  83.             except UnicodeDecodeError:
  84.                 return 'unknow'
  85.             
  86. #储存
  87. def ipsave(iplist):
  88.     timename = time.localtime()
  89.    
  90.     ipname = 'iplist_' + str(timename[0]) + '_' +\
  91.                          str(timename[1]) + '_' +\
  92.                          str(timename[2]) + '.txt'

  93.     #保存
  94.     with open(ipname,'w') as f:
  95.         for each in iplist:
  96.             f.writelines(iplist[each] + ' : ' + each)
  97.             f.write('\n')
  98.             
  99.     if __name__ == '__main__':
  100.         print('\n所有ip保存完毕!')


  101. if __name__ == '__main__':
  102.     main()
复制代码



1. 如果您的提问得到满意的答案,请务必选择【最佳答案】;2. 如果想鼓励一下楼主或帮助到您的朋友,可以给他们【评分】作为奖励;
3. 善用【论坛搜索】功能,那里可能有您想要的答案;4. 粘贴代码请点击编辑框上的 <> 按钮,否则您的代码可能会被“吃掉”!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

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

小黑屋手机版Archiver( 粤公网安备 44051102000370号 | 粤ICP备11014136号

© 2010-2017 FishC.com GMT+8, 2017-9-26 19:06 Powered by Discuz! X2.5 Theme by dreambred

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