Python 多线程和多进程爬虫

前面的 《Python 的网络请求 Requests 模块使用》 我们已经对爬虫的基本过程有了了解,而且整个过程比较顺畅,容易理解,但是很多情况下我们的爬取工作并不是如此轻松的,我们可能会面临一些特殊情况,例如今天要说的速度问题,如果有大量的页面需要爬取,我们还使用单一线程就很慢了。

多线程爬虫

我们先不考虑特别大型的爬取,本文所有的思路都是基于满足个人需求的中型爬取需要。我们可以使用多线程来并行爬取,这样就可以成倍的提高爬取速度。

我们先来感受一下如何使用多线程:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import _thread
import time

def print_time(threadName, delay):
    count = 0
    while count < 3:
        time.sleep(delay)
        count += 1
        print(threadName, time.ctime())

_thread.start_new_thread(print_time, ("Thread-1", 1))
_thread.start_new_thread(print_time, ("Thread-2", 2))

阅读更多

Python 经典开源爬虫案例

下面是我整理的一些 GitHub 上面经典的开源爬虫项目,涵盖的比较全面,供大家学习使用。

WechatSogou

微信公众号爬虫

基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。

GitHub 地址:https://github.com/Chyroc/WechatSogou

DouBanSpider

豆瓣读书爬虫

可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到 Excel 中,可方便大家筛选搜罗,比如筛选评价人数 >1000 的高分书籍;可依据不同的主题存储到 Excel 不同的 Sheet ,采用User Agent 伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。

GitHub 地址:https://github.com/lanbing510/DouBanSpider

阅读更多

Python 文件存储和数据库

Python 中数据存储的方式和其他语言没什么区别,主要分为两个方面:文件存储和数据库存储。

文件存储

文件存储的方法也分为很多种,主要包括:

  • Python 内置方法
  • NumPy 模块方法
  • os 模块方法
  • csv 模块方法

Python 内置方法

在不需要借助任何外界库的前提下,python 内置方法其实也可以完成我们需要的文件存取任务:

open() 方法

file object = open(file_name [, access_mode][, buffering])

该方法意义在于按照指定模式打开文件,其中,各个参数的含义如下:

阅读更多

Python 的网络请求 Requests 模块使用

Request 是一个简答优雅的 python HTTP 库,相较于 python 标准库中的 urllib 和 urllib2 的库,Requests 更加的便于理解使用, 本篇文章将带你详细了解 Requests 的基本用法。

Requests 模块

安装

pip install requests

注意:在 python 3.8 中的安装包中默认安装了 pip 工具,只需要我们配置一下环境变量即可

PAHT = 'C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Scripts'

阅读更多

Android 优秀开源项目整理

下面这些是我整理的一些常用的开源框架,在你的项目中使用它们可以起到事半功倍的效果,有的项目已经不再维护,有的项目即将停止,我只能感叹技术的发展是如此之快,在你还没有完全搞懂一个新框架之前可能这个框架已经被淘汰,我相信这些框架中的大部分会在不久被淘汰,也可能会被全部淘汰。但是这并不影响我们去学习和使用它们,因为其中的设计思维是可以长久的被我们所利用的。

多媒体编程

图片加载库

Picasso

阅读更多

Android 使用 WIFI 无线调试

最近项目中的需要,安卓设备需要安装到设备中后可能需要调试,这个时候去插线调试就不是很方便了,这个时候我想到了 WIFI 无线调试,其实这个在很早之前我就用过,很久没用了,今天索性就记录一下,方便大家参考。

首先,你的 Android 设备需要是 Root 的,而且拥有无线 WIFI 模块。

长按 WIFI 网络图标,然后在弹出的连接对话框中选择 高级选项 然后点击 IP设置 并选择 静态(如下图所示)。

WIFI 连接设置对话框

注意上面的设置弹框界面要输入与你路由器相匹配的网关和网段IP地址,你路由器的网关你可以通过 PC 上面的 ipconfig 或者 ifconfig 命令来查看:

PC 连接同一个路由器

阅读更多

10 个最好的 Android 游戏模板

引言

如果您熟悉 Android SDK,您可能知道使用它从头创建一个新游戏是不容易的。选择合适的游戏引擎,支持多种屏幕尺寸和 DPIs,实现无错误的游戏玩法,管理玩家数据,这些都是需要花费几天甚至几周才能完成的任务。

值得庆幸的是,CodeCanyon 是一个在线市场,它提供了许多经过深思熟虑的游戏模板。通过使用一个或多个这样的模板,你可以跳过游戏开发中大多数繁琐的部分,而只关注游戏中独一无二的部分。

在这篇文章中,我将向你介绍一些在 CodeCanyon 上可用的功能最丰富和最棒的 Android 游戏模板。

阅读更多

Android 中的 MVP 和 MVVM 架构

基本架构

Android 默认模板鼓励创建大型 Activity 或 Fragment。这些组件通常同时包含业务和 UI 逻辑。这使得 Android 应用程序的测试和维护变得更加困难。为了提高可测试性,Android 社区流行几种模式。

最流行的架构选择是:

  • Model View Presenter (MVP)
  • Model View View Model (MVVM)

MVP 或 MVVM 中的视图与 Android 中的视图类不同。MVP 中的视图通常通过 Fragment、Activity 或 Dialog 来实现。

MVP 架构

Model View Presenter(MVP)体系结构模式改进了应用程序体系结构以提高可测试性。 MVP 模式通过演示者(Presenter)从视图中分离数据模型。

阅读更多

蓄力2.0 我为公司提建议共谋发展

迪尔西的小伙伴好, 我来到迪尔西已经半年了,从最初的不熟悉不了解到现在已经能看明白很多事情了,所以借着蓄力2.0的启动想表达一下我个人的一些想法和建议,希望对公司的2.0时代能尽一些我的微薄之力。

先谈感受

首先说说我们的大Boss黄总吧,面试的第一天我就对黄总建立了一些初步印象。因为我工作经历的关系,我更注重一位老板或者说一位领袖对公司和个人发展过程中产生的影响,我认为这可以是一个公司长期存在发展长远的一个根本因素。当时第一印象我感觉这个人比较豁达不像那种奸诈小人(正直),第二点就是能感受到真诚,这是一个创业者所散发的宝贵品质,第三点就是和蔼,这是疏通员工和老板直接沟通桥梁的关键。人的第一次见面基本上都是建立在自己的假设上面,然后通过日后的进一步接触验证和发现新的认知,庆幸的是Boss的这三点印象从来没从我对他的印象中抹去,这也是我至今留下并且想继续和迪尔西小伙伴一起奋力向前的基础。

再来说说公司的同事们,我自认为自己是一个性格比较直的人,而且作为技术人我也喜欢这种人,因为我认为性格直坦诚是一种宝贵品质,是一个人是否正直的直接体现,而且可以减少不必要的拐弯抹角,这是公司文化里面不可或缺的一部分。当然,任何事情都应该辩证的看待,这个也不例外,我更欣赏它好的一面。其次我喜欢和思维缜密、逻辑性强的人一起共事,然而对我的印象是公司很缺少这样的人才,而且根据我的观察发现公司对招聘人才这块没有得到足够的重视,如果将一个科技公司做个比喻的话,我认为这些基本物质财产(上层建筑)是一个公司的硬件,而软件就是这个科技公司的人才。无疑一个公司要有大的发展,不是表面上的一些东西就能提高的(例如做了多少个项目),有很多例子一再给我们证明,一些特别人物的加入会给公司带来一些核心的变化,这种变化才是真正的发展。其实招聘人才是一个很重要的任务,这也是为什么很多公司有专人在常年筛选优秀人才。面试是招聘人才的一个重要环境,首先我认为作为一个面试者至少要具备几个认知和一个能力:

阅读更多

Android 日志记录轻量级框架 Timber

前言

Log 日志在 Android 项目开发中的作用非常重要,但项目越做越大,开发者会面临很多问题,比如管理各种不同的 Log,不同版本控制是否输入 Log 等。Timber 是一个轻量级的第三方库,能够帮助开发者更好的使用 Android Log。

面临问题

  1. 项目使用 Log 规范不统一,例如:关于 okhttp 的实现使用了 Logging Interceptor 输出 log,关于 rxjava 的实现使用了 onError,其他使用了 Android Log 机制。
  2. 项目开发时,为了方便调试,需要输出 Log,但发布后,Log 中包含很多项目相关的信息,如果全部暴露会有安全隐患,但完全删除也不利于发生问题后的查看调试,因此需要一个开关,关闭开关则不能输出 log,打开开关则可以输出 log。

Timber 介绍

Timeber 的使用主要通过添加 Tree 实例,添加 Tree 实例可以通过方法 Timber.plant 完成。实例化 Tree 需要尽量早,推荐在项目 ApplicationonCreate() 方法中完成。其中,DebugTree 自动实例化,是 Timber 中已经实现了 tree 的类,可直接拿来用,并在使用他的类中以类名为其 TAG,但是其他的 Tree 不会自动实例化,需要进行手动实现扩展 Timber.Tree 实现。

阅读更多

一款让你爱不释手的 Fragment 管理框架

前言

最近在项目中用到了一个 Fragment 管理框架,简直是一个牛逼,这个介绍给大家,这款框架让你爱上使用 Fragment,可以让你的 Fragment 像使用 Activity 一样方便管理。使用它绝对可以让你的开发效率大幅度提升,如果再结合 ConstraintLayout 来开发界面的过程简直让你爽的不要不要的。

项目地址:https://github.com/YoKeyword/Fragmentation

演示APK下载:https://www.pgyer.com/fragmentation

特性

  1. 悬浮球/摇一摇实时查看 Fragment 的栈视图,降低开发难度。
  2. 内部队列机制 解决 Fragment 多点触控、事务高频次提交异常等问题。
  3. 增加启动模式、startForResult 等类 Activity 方法。
  4. 类 Android 事件分发机制的 Fragment BACK 键机制:onBackPressedSupport().
  5. 提供 onSupportVisible()、懒加载 onLazyInitView() 等生命周期方法,简化嵌套 Fragment 的开发过程。
  6. 提供 Fragment 转场动画 系列解决方案,动态改变动画。
  7. 提供 Activity 作用域的 EventBus 辅助类,Fragment 通信更简单、独立(需要使用 EventBusActivityScope 库)。
  8. 支持 SwipeBack 滑动边缘退出(需要使用 Fragmentation_SwipeBack 库)。

阅读更多