基于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抓取豆瓣图片并自动保存示例学习
Jan 10 Python
Python 'takes exactly 1 argument (2 given)' Python error
Dec 13 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
对python:print打印时加u的含义详解
Dec 15 Python
python flask框架实现传数据到js的方法分析
Jun 11 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
python 统计文件中的字符串数目示例
Dec 24 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
python梯度下降算法的实现
Feb 24 Python
python Socket网络编程实现C/S模式和P2P
Jun 22 Python
在 Python 中使用 MQTT的方法
Aug 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
PHP网页安全认证的实例详解
2017/09/28 PHP
php框架CodeIgniter使用redis的方法分析
2018/04/13 PHP
使用tp框架和SQL语句查询数据表中的某字段包含某值
2019/10/18 PHP
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
从盛大通行证上摘下来的身份证验证js代码
2011/01/11 Javascript
javascript实现页面内关键词高亮显示代码
2014/04/03 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
jquery广告无缝轮播实例
2017/01/05 Javascript
微信小程序 跳转传参数与传对象详解及实例代码
2017/03/14 Javascript
JavaScript实现反转字符串的方法详解
2017/04/27 Javascript
Angular中$broadcast和$emit的使用方法详解
2017/05/22 Javascript
Thinkjs3新手入门之添加一个新的页面
2017/12/06 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
javascrit中undefined和null的区别详解
2019/04/07 Javascript
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
js实现3D旋转相册
2020/08/02 Javascript
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
跟老齐学Python之用while来循环
2014/10/02 Python
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
Python两台电脑实现TCP通信的方法示例
2019/05/06 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
如何手工释放资源
2013/12/15 面试题
中专生自我鉴定范文
2014/02/02 职场文书
机工车间主任岗位职责
2014/03/05 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
车间班组长竞聘书
2015/09/15 职场文书