基于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 从远程服务器下载日志文件的程序
Feb 10 Python
python算法学习之桶排序算法实例(分块排序)
Dec 18 Python
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
Python爬取国外天气预报网站的方法
Jul 10 Python
python实现SOM算法
Feb 23 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
Flask核心机制之上下文源码剖析
Dec 25 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
python调用百度AI接口实现人流量统计
Feb 03 Python
Python之qq自动发消息的示例代码
Feb 18 Python
python批量更改目录名/文件名的方法
Apr 18 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
JQuery中使用on方法绑定hover事件实例
2014/12/09 Javascript
JS判断是否360安全浏览器极速内核的方法
2015/01/29 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
使用jquery实现的循环连续可停顿滚动实例
2016/11/23 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
Vue实现附件上传功能
2020/05/28 Javascript
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
Python实现读取目录所有文件的文件名并保存到txt文件代码
2014/11/22 Python
python抓取最新博客内容并生成Rss
2015/05/17 Python
Sanic框架配置操作分析
2018/07/17 Python
在python里协程使用同步锁Lock的实例
2019/02/19 Python
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
Python字典dict常用方法函数实例
2020/11/09 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
基于HTML5代码实现折叠菜单附源码下载
2015/11/27 HTML / CSS
Sneaker Studio法国:购买运动鞋
2018/06/08 全球购物
VC++笔试题
2014/10/13 面试题
拉丁舞学习者的自我评价
2013/10/27 职场文书
职业教育毕业生求职信
2013/11/09 职场文书
班级文化标语
2014/06/23 职场文书
2014年团总支工作总结
2014/11/21 职场文书
2016八一建军节慰问信
2015/11/30 职场文书
关于做家务的心得体会
2016/01/23 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
Redis Cluster 集群搭建你会吗
2021/08/04 Redis
详细聊聊vue中组件的props属性
2021/11/02 Vue.js