Python实现的爬取豆瓣电影信息功能案例


Posted in Python onSeptember 15, 2019

本文实例讲述了Python实现的爬取豆瓣电影信息功能。分享给大家供大家参考,具体如下:

本案例的任务为,爬取豆瓣电影top250的电影信息(包括序号、电影名称、导演和主演、评分以及经典台词),并将信息作为字典形式保存进txt文件。这里只用到requests库,没有用到beautifulsoup库

step1:首先获取每一页的源代码,用requests.get函数获取,为了防止请求错误,使用try...except..

def getpage(url):
  try:
    res=requests.get(url)
    if res.status_code==200:
      return res.text
    return None
  except RequestException:
    return None

step2:做每一页的网址解析,打开原网址https://movie.douban.com/top250?,查看网页源代码,可以看到每一个电影的源代码都是从<li>开始,在</li>处结束,写好正则表达式以后爬到的列表的每一条item都有五个元素,因此将其写成字典的形式,这里用到yield函数(关于yield函数的用法,廖老师的有一篇文章比较好懂https://www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/)

Python实现的爬取豆瓣电影信息功能案例

对单个网页的进行解析的代码如下:

def parsepage(html):
  pat=re.compile('<li>.*?<em class="">(.*?)</em>.*?<img width="100" alt="(.*?)" src=.*?<p class="">'
          +'(.*?)</p>.*?property="v:average">(.*?)</span>.*?<span class="inq">(.*?)</span>.*?</li>',re.S)
  items=re.findall(pat,html)
  for item in items:
    yield{
      'index':item[0],
      'title':item[1],
      'stars':item[2].strip(),
      'score':item[3],
      'concept':item[4]
    }

下面的代码是将每一个item写入文件,这里encoding='utf-8' 和ensure_ascii=False都是使写入文件时中文能保持不变,json.dumps可以将(字典)对象转化成字符串(但前面要先import json),with open的第二个参数为a,表示每次写入时,是往后追加(续接),而不是后一次写入将之前内容覆盖,\n是指要每一次写入一个item之后要换行。

def write_tofile(content):
  with open('doubanfilms.txt','a',encoding='utf-8' ) as f:
    f.write(json.dumps(content,ensure_ascii=False)+'\n')
    f.close()

最后,需要用循环语句将每一页(共10页)内容都进行以上操作。这里,第二页的网址就是在第一页的url上加上一个start=25, 第三页是加上start=50,也就是每一页的start=为25*i。最后一段代码如下:

def main():
  url="https://movie.douban.com/top250?"
  for i in range(0,9):
    url_i=url+'start='+str(25*i)
    html_i=getpage(url_i)
    for item in parsepage(html_i):
      print(item)
      write_tofile(item)
if __name__ == '__main__':
  main()

当然,这一段代码还有一种写法:

def main(start):
  url="https://movie.douban.com/top250?start="+str(start)
  html=getpage(url)
  for item in parsepage(html):
    print(item)
    write_tofile(item)
if __name__ == '__main__':
  for i in range(10):
    main(i*10)

如果想让你的程序跑的更快,可以用多线程爬虫(当然这里其实没有必要):

#在最开始加载Pool包
from multiprocessing import Pool
#最后的执行段改为:
if __name__ == '__main__':
  for i in range(10):
    main(i*10)
  pool=Pool() #在循环外写
  pool.map(main,[i*10 for i in range (10)])

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python在windows下实现备份程序实例
Jul 04 Python
Python实现一个转存纯真IP数据库的脚本分享
May 21 Python
Python使用struct处理二进制的实例详解
Sep 11 Python
python交互式图形编程实例(三)
Nov 17 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
Python猴子补丁知识点总结
Jan 05 Python
python中数据库like模糊查询方式
Mar 02 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
python使用隐式循环快速求和的实现示例
Sep 11 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
python中实现栈的三种方法
Dec 19 Python
Python数据库小程序源代码
Sep 15 #Python
python中树与树的表示知识点总结
Sep 14 #Python
python树的同构学习笔记
Sep 14 #Python
python图形绘制奥运五环实例讲解
Sep 14 #Python
python列表插入append(), extend(), insert()用法详解
Sep 14 #Python
postman传递当前时间戳实例详解
Sep 14 #Python
Python 经典算法100及解析(小结)
Sep 13 #Python
You might like
实现PHP+Mysql无限分类的方法汇总
2015/03/02 PHP
Laravel搭建后台登录系统步骤详解
2016/07/26 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
由php中字符offset特征造成的绕过漏洞详解
2017/07/07 PHP
用YUI做了个标签浏览效果
2007/02/20 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
jQuery的.live()和.die() 使用介绍
2011/09/10 Javascript
解析JavaScript中的不可见数据类型
2013/12/02 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
[js高手之路]HTML标签解释成DOM节点的实现方法
2017/08/31 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
Vue组件间通信 Vuex的用法解析
2019/08/05 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
OpenLayer3自定义测量控件MeasureTool
2020/09/28 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
python 合并文件的具体实例
2013/08/08 Python
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
用matplotlib画等高线图详解
2017/12/14 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
python中怎么表示空值
2020/06/19 Python
Python是怎样处理json模块的
2020/07/16 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
四好少年事迹材料
2014/01/12 职场文书
社区服务活动小结
2014/07/08 职场文书
委托书格式范文
2015/01/28 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
2015年副班长工作总结
2015/05/15 职场文书
入党申请书格式
2019/06/20 职场文书
nginx优化的六点方法
2021/03/31 Servers