当前位置: 首页 > news >正文

gevent爬取豆瓣电影top250

采用协程来实现快速抓取页面信息
出处:https://github.com/jingsupo/python-spider/blob/master/day07/douban/04douban_gevent.py

# -*- coding:utf-8 -*-

import requests, time, gevent
from lxml import etree
from gevent import monkey
monkey.patch_all()

class DoubanMovie(object):
    def __init__(self):
        self.base_url = "https://movie.douban.com/top250"
        self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}
        # 电影总数量
        self.count = 0

    def send_request(self, url):
        time.sleep(2)
        try:
            response = requests.get(url, headers=self.headers)
            data = response.content
            self.parse_data(data)
        except Exception as e:
            print e

    def parse_data(self, data):
        html_data = etree.HTML(data)

        # 电影名字
        name_list = html_data.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')

        for name in name_list:
            print name
            # 每获取一部电影名字电影数量增加1
            self.count += 1

    def run(self):
        start_time = time.time()

        gevent_list = []

        for page in range(0, 225 + 1, 25):
            url = self.base_url + '?start=' + str(page)

            # 创建协程
            gevents = gevent.spawn(self.send_request, url)
            gevent_list.append(gevents)

        # 主线程等待
        gevent.joinall(gevent_list)

        end_time = time.time()

        total_time = end_time - start_time

        print '全部电影%d部' % self.count
        print '总时间%ss' % total_time


if __name__ == '__main__':
    spider = DoubanMovie()
    spider.run()

相关文章:

  • 如何使用js判断浏览器内核然后引用不同的css外联样式
  • c++ DLL和c#之间传递字符串
  • HTML总结2
  • 进行移动电子邮件营销转化率的三个秘诀
  • background-position
  • ROS中测试机器人里程计信息
  • 基于phpExcel写的excel类,供平时方便使用
  • IaaS PaaS SaaS Daas
  • Java8 Arrays.sort VS Arrays.parallelSort应用实例源码教程
  • Facebook iOS 新版开发手记:两倍速度的背后(转)(参考)
  • Azure ARM创建和部署自定义操作系统映像
  • 维基百科新增电子书导出功能,方便离线阅读
  • CentOS6.9安装LAMP(Centos6.9+Apache2.2.15+mysql5.1.73+php5.3.3)
  • MFC禁止改变窗口大小和移动窗口
  • 人月神话6
  • 【技术性】Search知识
  • 【译】理解JavaScript:new 关键字
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • canvas 高仿 Apple Watch 表盘
  • Centos6.8 使用rpm安装mysql5.7
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • iOS 颜色设置看我就够了
  • Java 最常见的 200+ 面试题:面试必备
  • java小心机(3)| 浅析finalize()
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Next.js之基础概念(二)
  • rabbitmq延迟消息示例
  • Redash本地开发环境搭建
  • TCP拥塞控制
  • 关于for循环的简单归纳
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 聊聊redis的数据结构的应用
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 漂亮刷新控件-iOS
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 收藏好这篇,别再只说“数据劫持”了
  • 提醒我喝水chrome插件开发指南
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #if和#ifdef区别
  • (数据结构)顺序表的定义
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 未来三学期想要修的课 (日記)
  • (转)linux 命令大全
  • ./configure,make,make install的作用(转)
  • .Net Memory Profiler的使用举例
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net访问oracle数据库性能问题
  • .NET企业级应用架构设计系列之开场白
  • .NET中使用Redis (二)
  • @Autowired @Resource @Qualifier的区别
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116