基于python实现的抓取腾讯视频所有电影的爬虫


Posted in Python onApril 22, 2016

我搜集了国内10几个电影网站的数据,里面近几十W条记录,用文本没法存,mongodb学习成本非常低,安装、下载、运行起来不会花你5分钟时间。

# -*- coding: utf-8 -*-
# by awakenjoys. my site: www.dianying.at
import re
import urllib2
from bs4 import BeautifulSoup
import string, time
import pymongo
 
NUM  = 0   #全局变量,电影数量
m_type = u''  #全局变量,电影类型
m_site = u'qq' #全局变量,电影网站
 
#根据指定的URL获取网页内容
def gethtml(url):
 req = urllib2.Request(url) 
 response = urllib2.urlopen(req) 
 html = response.read()
 return html
 
#从电影分类列表页面获取电影分类
def gettags(html):
 global m_type
 soup = BeautifulSoup(html)  #过滤出分类内容
 #print soup
 #<ul class="clearfix _group" gname="mi_type" gtype="1">
 tags_all = soup.find_all('ul', {'class' : 'clearfix _group' , 'gname' : 'mi_type'})
 #print len(tags_all), tags_all
 #print str(tags_all[1]).replace('\n', '')
 
 #<a _hot="tag.sub" class="_gtag _hotkey" href="http://v.qq.com/list/1_0_-1_-1_1_0_0_20_0_-1_0.html" title="动作" tvalue="0">动作</a>
 re_tags = r'<a _hot=\"tag\.sub\" class=\"_gtag _hotkey\" href=\"(.+?)\" title=\"(.+?)\" tvalue=\"(.+?)\">.+?</a>'
 p = re.compile(re_tags, re.DOTALL)
 
 tags = p.findall(str(tags_all[0]))
 if tags:
  tags_url = {}
  #print tags
  for tag in tags:
   tag_url = tag[0].decode('utf-8')
   #print tag_url
   m_type = tag[1].decode('utf-8')
   tags_url[m_type] = tag_url 
    
 else:
   print "Not Find"
 return tags_url
 
#获取每个分类的页数
def get_pages(tag_url):
 tag_html = gethtml(tag_url)
 #div class="paginator
 soup = BeautifulSoup(tag_html)  #过滤出标记页面的html
 #print soup
 #<div class="mod_pagenav" id="pager">
 div_page = soup.find_all('div', {'class' : 'mod_pagenav', 'id' : 'pager'})
 #print div_page #len(div_page), div_page[0]
 
 #<a class="c_txt6" href="http://v.qq.com/list/1_2_-1_-1_1_0_24_20_0_-1_0.html" title="25"><span>25</span></a>
 re_pages = r'<a class=.+?><span>(.+?)</span></a>'
 p = re.compile(re_pages, re.DOTALL)
 pages = p.findall(str(div_page[0]))
 #print pages
 if len(pages) > 1:
  return pages[-2]
 else:
  return 1
  
 
def getmovielist(html):
 soup = BeautifulSoup(html)
 
 #<ul class="mod_list_pic_130">
 divs = soup.find_all('ul', {'class' : 'mod_list_pic_130'})
 #print divs
 for div_html in divs:
  div_html = str(div_html).replace('\n', '')
  #print div_html
  getmovie(div_html)
 
 
def getmovie(html):
 global NUM
 global m_type
 global m_site
 
 #<h6 class="caption"> <a href="http://www.tudou.com/albumcover/Z7eF_40EL4I.html" target="_blank" title="徒步旅行队">徒步旅行队</a> </h6> <ul class="info"> <li class="desc">法国卖座喜剧片</li> <li class="cast"> </li> </ul> </div> <div class="ext ext_last"> <div class="ext_txt"> <h3 class="ext_title">徒步旅行队</h3> <div class="ext_info"> <span class="ext_area">地区: 法国</span> <span class="ext_cast">导演: </span> <span class="ext_date">年代: 2009</span> <span class="ext_type">类型: 喜剧</span> </div> <p class="ext_intro">理查德·达奇拥有一家小的旅游公司,主要经营法国游客到非洲大草原的旅游服务。六个法国游客决定参加理查德·达奇组织的到非洲的一...</p>
 
 re_movie = r'<li><a class=\"mod_poster_130\" href=\"(.+?)\" target=\"_blank\" title=\"(.+?)\"><img.+?</li>'
 p = re.compile(re_movie, re.DOTALL)
 movies = p.findall(html)
 if movies:
  conn = pymongo.Connection('localhost', 27017)
  movie_db = conn.dianying
  playlinks = movie_db.playlinks
  #print movies
  for movie in movies:
   #print movie
   NUM += 1
   print "%s : %d" % ("=" * 70, NUM)
   values = dict(
    movie_title = movie[1],
    movie_url = movie[0],
    movie_site  = m_site,
    movie_type  = m_type
    )
   print values
   playlinks.insert(values)
   print "_" * 70
   NUM += 1
   print "%s : %d" % ("=" * 70, NUM)
 
 #else:
 # print "Not Find"
 
def getmovieinfo(url):
 html = gethtml(url)
 soup = BeautifulSoup(html)
 
 #pack pack_album album_cover
 divs = soup.find_all('div', {'class' : 'pack pack_album album_cover'})
 #print divs[0]
 
 #<a href="http://www.tudou.com/albumplay/9NyofXc_lHI/32JqhiKJykI.html" target="new" title="《血滴子》独家纪录片" wl="1"> </a> 
 re_info = r'<a href=\"(.+?)\" target=\"new\" title=\"(.+?)\" wl=\".+?\"> </a>'
 p_info = re.compile(re_info, re.DOTALL)
 m_info = p_info.findall(str(divs[0]))
 if m_info:
  return m_info
 else:
  print "Not find movie info"
 
 return m_info
 
 
def insertdb(movieinfo):
 global conn
 movie_db = conn.dianying_at
 movies = movie_db.movies
 movies.insert(movieinfo)
 
if __name__ == "__main__":
 global conn
 
 tags_url = "http://v.qq.com/list/1_-1_-1_-1_1_0_0_20_0_-1_0.html"
 #print tags_url
 tags_html = gethtml(tags_url)
 #print tags_html
 tag_urls = gettags(tags_html)
 #print tag_urls
 
 
 for url in tag_urls.items():
  print str(url[1]).encode('utf-8') #,url[0]
  maxpage = int(get_pages(str(url[1]).encode('utf-8')))
  print maxpage
 
  for x in range(0, maxpage):
   #http://v.qq.com/list/1_0_-1_-1_1_0_0_20_0_-1_0.html
   m_url = str(url[1]).replace('0_20_0_-1_0.html', '')
   movie_url = "%s%d_20_0_-1_0.html" % (m_url, x)
   print movie_url
   movie_html = gethtml(movie_url.encode('utf-8'))
   #print movie_html
   getmovielist(movie_html)
   time.sleep(0.1)
Python 相关文章推荐
详解Python中的__init__和__new__
Mar 12 Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 Python
Python实现的远程登录windows系统功能示例
Jun 21 Python
python实现决策树分类
Aug 30 Python
对python3 sort sorted 函数的应用详解
Jun 27 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
Apr 08 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
python 等差数列末项计算方式
May 03 Python
python+pyhyper实现识别图片中的车牌号思路详解
Dec 24 Python
Python开发之快速搭建自动回复微信公众号功能
Apr 22 #Python
Django小白教程之Django用户注册与登录
Apr 22 #Python
python中PIL安装简单教程
Apr 21 #Python
Python for Informatics 第11章之正则表达式(四)
Apr 21 #Python
Python for Informatics 第11章之正则表达式(二)
Apr 21 #Python
Python for Informatics 第11章 正则表达式(一)
Apr 21 #Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
Apr 20 #Python
You might like
php 获取本地IP代码
2013/06/23 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
phpStudy中升级MySQL版本到5.7.17的方法步骤
2017/08/03 PHP
通过百度地图获取公交线路的站点坐标的js代码
2012/05/11 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
javascript 小数取整简单实现方式
2014/05/30 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
2015/04/21 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
快速掌握Node.js中setTimeout和setInterval的使用方法
2016/03/21 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
总结JavaScript设计模式编程中的享元模式使用
2016/05/21 Javascript
jQuery实现Select左右复制移动内容
2016/08/05 Javascript
JS简单实现仿百度控制台输出信息效果
2016/09/04 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
详解网站中图片日常使用以及优化手法
2017/01/09 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
Angular.js中angular-ui-router的简单实践
2017/07/18 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
详解vue-video-player使用心得(兼容m3u8)
2019/08/23 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
Python中计算三角函数之cos()方法的使用简介
2015/05/15 Python
python读取中文txt文本的方法
2018/04/12 Python
pandas 数据归一化以及行删除例程的方法
2018/11/10 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
python使用thrift教程的方法示例
2019/03/21 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
城管执法人员个人对照检查材料思想汇报
2014/09/29 职场文书
严以用权学习心得体会
2016/01/12 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
Python入门之基础语法详解
2021/05/11 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python