2018-08-08-Scrapy爬虫Demo_抓取网页中的图片

Scrapy介绍

Scrapy is an application framework for crawling web sites and extracting structured data which can be used for a wide range of useful applications, like data mining, information processing or historical archival.

Scrapy安装

https://doc.scrapy.org/en/latest/intro/overview.html

创建并修改爬虫

下载Scrapy官方的Demo

1
2
$ git clone https://github.com/scrapy/quotesbot
$ cd quotesbot

修改 quotesbot/spiders/toscrape-css.py 文件内空,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# -*- coding: utf-8 -*-
# Usage 使用方法: scrapy crawl toscrape-css -o xxx.csv
# //img//@data-src' 图片类似于这样的 <img data-src='http://xxxx/images/2018.jpg'> in start_urls
# //input//@data-src' 图片类似于这样的 <input data-src='http://xxxx/images/2018.jpg' type='image'> in start_urls
# 因为考虑反爬虫的问题,建议URL地址已抓出来后,直接将所有地址放到迅雷里打包下载
import scrapy
import os
import urllib

class ToScrapeCSSSpider(scrapy.Spider):
name = "toscrape-css"
start_urls = [
'https://xxx/htm_data/x/2018/xxxxxx.html',
]

def parse(self, response):
for quote in response.xpath('//input//@data-src').extract():
print quote

# 加 -o 参数时导出到文件时,会用到
# yield {
# 'url' : quote
# }

# (直接下载图片到当前目录中,反爬严格的,可能会无法下载下来)
# 因为考虑反爬虫的问题,建议URL地址已抓出来后,直接将所有地址放到迅雷里打包下载
# if quote:
# filename = os.path.basename(quote)
# print filename
# filepath=os.path.join("/Users/xxx/Desktop",filename)
# urllib.urlretrieve(quote,filepath)

# 这个注释掉,需要时再用
# yield scrapy.Request(quote)

使用

Usage 使用方法: scrapy crawl toscrape-css -o xxx.csv

一些注意事项

1, 因为考虑反爬虫的问题,建议URL地址已抓出来后,直接将所有地址放到迅雷里打包下载
2, Scrapy爬虫出现Forbidden by robots.txt
关闭scrapy自带的ROBOTSTXT_OBEY功能,在setting找到这个变量,设置为False即可解决
ROBOTSTXT_OBEY = False

2018-07-20-Python第三方库Django学习

介绍

Django 是 Python Web 框架

1
2
3
4
5
6
7
8
9
10
11
Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。  
Django 项目是一个Python定制框架,它源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:
用于创建模型的对象关系映射
为最终用户设计的完美管理界面
一流的 URL 设计
设计者友好的模板语言
缓存系统。
Django(发音:[`dʒæŋɡəʊ]) 是用python语言写的开源web开发框架(open source web framework),它鼓励快速开发,并遵循MVC设计。
2005年7月, 并于2008年9月发布了第一个正式版本1.0 。
Django 根据比利时的爵士音乐家Django Reinhardt命名,他是一个吉普赛人,主要以演奏吉它为主,还演奏过小提琴等。
由于Django在近年来的迅速发展,应用越来越广泛,被著名IT开发杂志SD Times评选为2013 SD Times 100,位列“API、库和框架”分类第6位,被认为是该领域的佼佼者 [1] 。

安装

官网:https://docs.djangoproject.com/en/2.0/topics/install/#installing-official-release
同时也可以参考第三方的安装教程:http://www.runoob.com/django/django-install.html
(以下为我在Mac系统上的安装过程)

1
2
pip install msgpack #安装依赖库
pip install Django #安装

使用Demo

1
2
3
4
5
6
$ django-admin.py startproject testdj
$ cd testdj #切换到我们创建的项目
$ python manage.py runserver
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
项目已启动,访问地址为http://127.0.0.1:8000/

开发

参考N多网上文章教程,
教程:http://www.runoob.com/django/django-tutorial.html
很好的一个教程:https://www.cnblogs.com/feixuelove1009/p/5823135.html
其它:搜索

2018-07-19-Hexo添加评论,版权等插件

评论插件

(查看网页源代码,疑似会暴露 GitHub Application 的 clientID 和 clientSecret , 我就暂时没有添加此插件,以下评论插件仅供参考)
参考博主的意见:
gitment ( https://github.com/imsun/gitment )
gitalk ( https://github.com/gitalk/gitalk )
https://oliverqueen.cn/2018/02/11/%E5%85%B3%E4%BA%8E%E5%8D%9A%E5%AE%A2%E8%AF%84%E8%AE%BA%E6%8F%92%E4%BB%B6%E7%9A%84%E9%97%AE%E9%A2%98/
畅言
等等,可自已看看效果比较

版权插件

参考博主的意见:
https://blog.csdn.net/peihaozhu/article/details/51051149
以及
https://oliverqueen.cn/2018/02/11/%E5%85%B3%E4%BA%8E%E5%8D%9A%E5%AE%A2%E8%AF%84%E8%AE%BA%E6%8F%92%E4%BB%B6%E7%9A%84%E9%97%AE%E9%A2%98/
以及
https://www.jianshu.com/p/bb5eaee1f4dd

2018-07-18-c++设计模式-observer(观察者模式)

c++设计模式-observer(观察者模式)

copy from https://blog.csdn.net/chenxun_2010/article/details/48772559

图:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
适用性:
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的
clip_image020我们来举一个博客的例子,博主写好了一篇博文,发布之后有两个读者在阅读博文,当博主发现一些博文需要修改,修改之后重新发布,那么正在阅读的两个读者应该都能都到通知多好!下面就按照上面uml图来实现这样的一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <iostream>
#include <string>
#include <vector>
#include <list>
using namespace std;

class Observer
{
public:
Observer(){}
virtual ~Observer(){}
virtual void Update(){};
};

class Blog
{
public:
Blog(){}
virtual ~Blog(){}

void Attach(Observer* observer)
{
vec_observer.push_back(observer);
}

void Romve(Observer* observer)
{
vector<Observer*>::iterator iter;
for (iter = vec_observer.begin(); iter != vec_observer.end(); ++iter)
{
if ((*iter) == observer)
vec_observer.erase(iter);
}
}

void Notify()
{
vector<Observer*>::iterator iter;
for (iter = vec_observer.begin(); iter != vec_observer.end(); ++iter)
{
(*iter)->Update();
}
}

virtual void SetStatus(string sts){}
virtual string GetStatus() { return m_status; };

private:
vector<Observer*> vec_observer;
protected:
string m_status;
};

class ConcreteBlog :public Blog
{
public:
ConcreteBlog(string name):m_blog_name(name){}
~ConcreteBlog(){}

void SetStatus(string sts)
{
m_status = "csdn通知: " + m_blog_name + sts;
}

string GetStatus()
{
return m_status;
}

private:
string m_blog_name;
};

class ConcreteObserver :public Observer
{
private:
string m_observer_name;
Blog *m_blog;
public:
ConcreteObserver(string name, Blog* blog) :m_observer_name(name), m_blog(blog){}
~ConcreteObserver(){}

void Update()
{
string status = m_blog->GetStatus();
cout << m_observer_name << "-----------" << status << endl;
}
};

int main()
{
Blog *blog = new ConcreteBlog("chenxun");
Observer *ob1 = new ConcreteObserver("xiaowang", blog);
Observer *ob2 = new ConcreteObserver("xiaozhang", blog);
blog->Attach(ob1);
blog->Attach(ob2);
blog->SetStatus("发表了新博客");
blog->Notify();

delete blog;
delete ob1;
delete ob2;

return 0;

}

2018-07-18-多版本Python的使用和切换,anaconda和pyenv的使用

多版本Python的使用和切换,anaconda和pyenv的使用

建议使用Anaconda,因为有UI界面,点点鼠标就切换完成了。
pyenv,使用的是命令行切换不同的Python版本。
另外:Anaconda开源,同时也是专注于数据分析的Python发行版本,包含了conda、Python等190多个科学包及其依赖项。适用于企业级大数据分析的Python工具。其包含了720多个数据科学相关的开源包,在数据可视化、机器学习、深度学习等多方面都有涉及。不仅可以做数据分析,甚至可以用在大数据和人工智能领域。参考这个 https://www.jianshu.com/p/169403f7e40c
以下为Mac系统下我的使用,其它系统我无法确认,你也可以做参考
两个貌似有点冲突,注意使用

安装并使用 Anaconda

下载地址,去下载,然后安装 https://www.anaconda.com/download/#macos
下载pkg或dmg文件,安装完成
一方法有UI的App,安装完后在Mac系统中已安装软件,点击启动运行,然后再点点鼠标就切换完成,(另,如遇到问题,记得右键使用sudo管理员权限运行即可)
另一方法,使用命令行来完成切换,命令如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
python --version  
conda create -n python2 python=2 anaconda
ls -la /anaconda3/bin/activate
sudo chmod +x /anaconda3/bin/*
# To activate this environment, use:
# > source activate python2
#
# To deactivate an active environment, use:
# > source deactivate
(以上方法不行,用下边这方法)
activate python2 #换成2.7版本
python --version
deactivate python2 #换成默认的3.6版本
python --version

安装pyenv

Mac下先安装Homebrew
/usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
然后安装pyenv

1
2
3
4
5
6
brew install pyenv  
brew -v
pyenv install --list #会列出可安装的Python版本号
#安装对应的Python版本,可以安装多个版本,比如:
pyenv install 2.7.10
pyenv install 3.6.5

安装可能会有卡顿,等一等再试
安装后查看版本pyenv versions及当前用的版本pyenv version
设置全局版本pyenv global 3.6.5 不建议如此操作,可能会导致部分系统程序无法正常工作
可以试试,指定目录切换指定版本的Python,如:pyenv local 3.5.1
pyenv rehash # 更新本地数据库
另外pyenv的global,shell,local的使用 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
~ pyenv versions
system (set by /home/wang/.pyenv/version)
3.3.1
~ python --version
Python 2.7.6
~ pyenv global 3.3.1 # 更改本机版本,重启不会造成再次更改
~ python --version
Python 3.3.1
~ pyenv local system # 更改本地的版本,只是临时生效,重启什么的会恢复系统版本
~ python --version
Python 2.7.6
~ python shell 3.3.1 # 更改本shell的版本,临时生效,优先级高于global,local的也高于global,都是临时生效
python: can't open file 'shell': [Errno 2] No such file or directory
~ pyenv shell 3.3.1
~ pyenv versions
system
3.3.1 (set by PYENV_VERSION environment variable)
~ python
Python 3.3.1 (default, May 8 2016, 21:27:17)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.

个人推荐使用Anaconda