sunwen
sunwen
以前也有写过爬虫,抓过网易云歌单和豆瓣读书的数据,当时有两个问题解决的不够好, 自动化和登录。最近花时间用scrapy去写,自认为更好的解决了上述问题。这篇文章当作一个记录,也可当作学习教程(需要BeautifulSoup, selenium基本知识)。 ## 目标 用scrapy去抓取[自从有了知乎,再也不用找福利了……](https://www.zhihu.com/collection/146079773)收藏夹下每一个答案下的全部图片。 ### 简易步骤 1. 账号登录知乎,抓取全部答案的链接(去除重复文章,大概39个答案)。 ``` {'url': '/question/36007260', 'title': '女生坚持健身是种什么样的体验?', 'dec': ['健身']} {'url': '/question/22132862', 'title': '女生如何选购适合自己的泳装?', 'dec': ['泳装']} {'url': '/question/22918070', 'title': '女生如何健身锻造好身材?', 'dec': ['健身']} {'url':...
前面的文章介绍了怎么用scrapy去完成一个爬虫,涉及动态抓取和登录等操作。这篇文章简单介绍怎么让爬虫运行在服务器的docker里。 ## 步骤 1. 利用sshfs将服务器磁盘挂载到本地,实现本地开发,省去同步代码等步骤。 2. docker通过pull或者Dockerfile拉取镜像。 3. 通过docker-compose配置镜像,在启动的镜像里启动爬虫。 ### 详细步骤: 首先安装sshfs工具,可以参考网上教程。 接着切换到个人目录,新建 `aliyun`文件夹。 ``` localhost:~ swensun$ cd ~ localhost:~ swensun$ mkdir aliyun localhost:~ swensun$ sshfs 120.78.202.210:/ aliyun/ ``` 之后输入密码,打开aliyun目录,即可看到的服务器上的目录挂载到了本地,可以本地编辑,保存。...
说明:本文章在上篇的基础上,代码在Android的环境中运行,当然可以单独写。 后面的文章就不跟Android代码联系,最后再回到Android, 写一个柯里化和函数式编程的例子。 ## 纯函数 上篇文章提到一下纯函数, 类似两个数的加法这样: ``` fun add1(a: Int, b: Int): Int { return a + b } ``` `纯函数可以理解为一种 相同的输入必定有相同的输出的函数,没有任何可以观察到副作用` 纯函数的输出只取决于输入,输入定责输出定。在笔者写Android的过程中,尽量使用纯函数,较少副作用。 关于上面的函数,可以写成如下的形式: `fun add2(a: Int, b: Int)...
#### 记录本身,即已是反抗 首先下载`mongo`镜像,简单命令不做过多叙述,前面文章有介绍怎么基本使用docker。 之后编写`docker-compose.yml`文件,运行 `docker-compose up -d`生成容器并后台启动。 ## root创建 ``` // docker-compose.yml // command:启动是的命令行参数,添加认证auth version: '2' services: mongodb: image: mongo ports: - 27017:27017 volumes: - "./data/configdb:/data/configdb" - "./data/db:/data/db" command: mongod...
# 关于android 悬浮窗和自启动的设置, 以及获取系统的信息 标签(空格分隔):Android --- ## 悬浮窗 对于是否有开悬浮窗,程序是可以检测到的。 权限声明: `` ### 权限检查: 对于android6.0 以上的机型来说,google将悬浮窗权限和其他危险权限单独列出,因此可以检测, 方法: ``` fun checkFloatWindowPermission(): Boolean { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { val result = Settings.canDrawOverlays(BaseContext.application)...
上篇回顾:kotlin和android architecture Component,Room的完成与测试。 接上篇,如果看到模拟的数据插入,那么可以继续往下看 ### lifecycle 该架构提供了一种管理activity和fragmeng生命周期的方法,并且让接下来介绍的livedata可以在有效生命周期内收到观察,更新UI。首先来看: 因为还是测试版的原因,目前可以继承lifecycleActivity和lifecyclefragment来实现。 ``` class StoryListFragment : LifecycleFragment() {} ``` 说一下类的继承结构: lifecycleActivity(LifecycleFragment)实现LifecycleRegistryOwner接口。只有一个方法: ``` //源码 public interface LifecycleRegistryOwner extends LifecycleOwner { @Override LifecycleRegistry getLifecycle(); } ```...
# 从谷歌官方例子看constraintlayout 标签(空格分隔): googlesamples 知乎 --- 研究官方文档,是通往业界大拿的途径-----不知道是谁。 这是一个新的系列,打算看一些 github 上谷歌官方的小例子,好处不必多说。 最近的项目中,所有的布局已经换成了 `constraintlayout`,这是谷歌推荐的布局。 因此打算从 `constraintlayoutexamples` 入手。 一点小技巧:视图编辑器用来辅助,布局还是得手写代码。其中 `tools` 开头的属性是负责在视图编辑器辅助展示我们的布局,手写布局可以忽略。 基本知识不做过多介绍,说一些我的收获。 1. 关于 view 的居中: 用的最多的是约定上下左右即可,通过 margin 设置偏移量。 若是要求图中的 `button2` 相对 `button1`...
# react-native + mobx 入门到放弃 标签(空格分隔): react mobx Android --- 作为一个刚开始看react-native的小白,找到的源码我都看不太懂,还有涉及redux的知识。后面同事介绍mobx,因此记录一下学习过程。 ## redux 和 mobx 过多的内容这里不做叙述,请看下面链接(可以知道是什么和为什么,很短) [如何理解 Facebook 的 flux 应用架构?](https://www.zhihu.com/question/33864532/answer/57667838) [理解 React,但不理解 Redux,该如何通俗易懂的理解 Redux?](https://www.zhihu.com/question/41312576/answer/90782136) [MobX vs Redux: Comparing the...
### 有关权限管理 Anroid6.0以下, 权限申明后即可获取(国产定制系统除外) 在manifest文件里声明权限: ``` //电话相关权限 ``` 6.0以上不仅要声明,还需运行时获取。 步骤大概如下:  已打电话权限为例说明(一般情况): ``` private void checkAndRquestCallPermission() { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { Log.d(TAG, "checkCallPermission: " + "没有打电话权限"); ActivityCompat.requestPermissions(this, new...
### as控制台输出中文乱码问题 在当前模块的buide.gradle文件加入: ``` tasks.withType(org.gradle.api.tasks.compile.JavaCompile) { options.encoding = "UTF-8" } ``` ### context的区别 ``` Application mApp = (Application) getApplication(); Log.e(TAG, "getApp: "+mApp); Context mContext = getApplicationContext(); Log.e(TAG, "onAppContext: "+mContext); Context...