AoboSir 博客

与15年前的我比,我现在是大人;与15年后的我比,我现在还是个婴儿

Octopress 搭建静态博客站点 — 让中文的分类列表(Categories)的超链接正常使用


前言

之前,我是按照我写的这篇博客Octopress站点侧边栏添加分类列表(Categories)。


出现的问题

基于Octopress的博客系统自带了一个很好用分类目录插件。但遗憾的是它不支持中文链接URL,所以导致了:如果你分类列表有中文,那么点击的时候会链接到404页面。


解决思路

中文取拼音。


解决方法

参考网站:解决Octopress分类目录支持中文的问题

/plugins/category_sidebar.rb (若没有,自行创建)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
require 'stringex'

module Jekyll
  class CategoryListTag < Liquid::Tag
    def render(context)
      html = ""
      categories = context.registers[:site].categories.keys
      categories.sort.each do |category|
        posts_in_category = context.registers[:site].categories[category].size
        html << "<li class='category'><a href='/blog/categories/#{category.to_url.downcase}/'>#{category} (#{posts_in_category})</a></li>\n"
      end
      html
    end
  end
end

Liquid::Template.register_tag('category_sidebar', Jekyll::CategoryListTag)

搞定

现在你可以重新执行rake generaterake previewrake deploy,分类列表中有中文字符的分类,就可以正常打开了,而实际的链接就是对应的拼音。


Octopress 搭建静态博客站点 --- 添加访客统计


参考网站:Octopress博客的个性化配置:添加访客统计


Step 1 . 本博客的访客统计系统使用的是Flag Counter,所以要先去Flag Counter获取代码。

Step 2 . 拿到代码后添加.\source\_includes\custom\asides\flag_counter.html文件:

1
2
3
4
5
<section>
  <h1>访客统计</h1>
  <br/>
  <a href="http://s07.flagcounter.com/more/2SH"><img src="http://s07.flagcounter.com/count/2SH/bg_FFFFFF/txt_000000/border_CCCCCC/columns_2/maxflags_12/viewers_0/labels_0/pageviews_1/flags_0/" alt="Flag Counter" border="0"></a>
</section>

Step 3 . 将页面添加到侧边栏,在./_config.yml配置文件中添加下面一行配置:

1
default_asides: [……, custom/asides/flag_counter.html]

Step 4 . 最后添加控制开关,在./_config.yml配置文件中添加下面一行配置:

1
2
# Flag Counter
flag_counter: true

搞定


现在执行 rake generate 来生成博客站点。

如果你在执行这一步的时候不到了下面这个问题:

  Liquid Exception: invalid byte sequence in UTF-8 in _layouts/page.html
jekyll 2.5.3 | Error:  invalid byte sequence in UTF-8

Alt text

解决办法:

.\source\_includes\custom\asides\flag_counter.html 文件使用 Notepad++ 软件 转换为UTF-8无BOM编码格式,即可解决问题。

Alt text

在 JetBrains PyCharm 软件上使用 Git(Github) --- 如何使用GitHub for Windows软件的GUI界面给一个代码库添加一个`.gitignore`文件 --- 创建一个GitHub远程代码库的完整步骤


  • 我的电脑:Windows 10 64位
  • PyCharm 软件的版本:PyCharm 2016.1.4
  • Git For Windows版本:Git-2.10.0-64-bit
  • GitHub For Windows软件版:GitHub For Windows 3.0.5.2

参考网站:How to Use PyCharm with Github

Alt text


在 JetBrains PyCharm 软件上使用 Git(Github),开发项目时,推送代码修改到远程库会变得更加便捷。


准备工作

你的电脑里面需要有的软件:

  • Git For Windows
  • GitHub For Windows
  • JetBrains PyCharm

你可以到这里查看如何下载和安装这些软件的图文教程:


在 JetBrains PyCharm 软件上使用 Git(Github)

对于已有项目文件夹,

Step 1 . 在文件夹里面打开命令行,执行 git init 命令,将这个项目文件夹做成本地库。

Step 2 . 使用GitHub For Windows 软件克隆本地库,忽略一些文件,并上传到GitHub远程。

具体详细的步骤如下:

克隆本地库:

Alt text

Alt text

添加ignorefile 文件

Alt text

点击 + Add a default .gitignore file. 按钮

Alt text

我们这个项目使用的开发软件是 JetBrains PyCharm 软件,所以我们需要写一个符合 JetBrains PyCharm 软件 的 .gitignore 文件。

其实我们不需要自己写 .gitignore 文件,GitHub 官方已经为我们写好很多的 .gitignore 文件。

点击 example

Alt text

弹出一个网页,将里面的gitignore/Global/JetBrains.gitignore 的内容复制粘贴:

(我们再在里面添加一行:.idea/*

Alt text

现在,直接点击 OK 就可以了。

现在,你可以发现,只有3个改变的文件了:(这是因为一些文件被忽略,不需要上传到远程。)

Alt text

输入 SummaryDescription ,点击 Commit to master 按钮将修改提交到指定分支上(当前指定分支是:master)。

最后点击 Publish 按钮,推送到远程库。

Alt text

第一次推送,需要填写下面的信息。注意:Name 默认不变;Description 里面输入好描述信息(中英文都可以)。

同时选中好要推送到的GitHub账号。

填好之后点击 Pubish xxx 按钮。(可能会失败,白天可能是因为GitHub官网服务器的原因,晚上会好一点。解决办法就是:多试几次。)

Alt text

Step 3 . 使用 PyCharm 软件打开看看那个python项目。

Alt text

你会看到:

Alt text

Step 4 . 当你对项目进行增减代码后,你想要将修改推送到远程库时。

方法1 : 就点击上图中红圈里面的图标。然后进行推送。

Alt text

方法2 : 你也可以使用 GitHub For Windows 软件进行推送。

(推送方法:输入 SummaryDescription ,点击 Commit to master 按钮将修改提交到指定分支上(当前指定分支是:master)。最后点击 Sync 按钮,推送到远程库。)

Alt text

两个方法互不干扰,你使用了其中任意一种方法推送了修改,那么另外一种方法里面也好显示推送完成,没有修改的文件了。

PyCharm 软件(professional版 专业版)在Windows系统上的下载、安装、破解图文教程


下载 PyCharm 软件(professional版 专业版)

官网下载:https://www.jetbrains.com/pycharm/download/#section=windows

Alt text

安装

傻瓜式安装,无需多言。

破解

破解就是注册的意思。这个软件是付费试用的,如果你不输入注册码,这个软件你只能用30天。

破解方法在这里: http://blog.csdn.net/tianzhaixing2013/article/details/44997881 (这里有PyCharm软件 2014、2015、2016 版本的注册方法,都可行。)

PyCharm 2016 (professional版)的激活码:

1
43B4A73YYJ-eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYXNzaWduZWVOYW1lIjoiIiwiYXNzaWduZWVFbWFpbCI6IiIsImxpY2Vuc2VSZXN0cmljdGlvbiI6IkZvciBlZHVjYXRpb25hbCB1c2Ugb25seSIsImNoZWNrQ29uY3VycmVudFVzZSI6ZmFsc2UsInByb2R1Y3RzIjpbeyJjb2RlIjoiSUkiLCJwYWlkVXBUbyI6IjIwMTctMDItMjUifSx7ImNvZGUiOiJBQyIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IkRQTiIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IlBTIiwicGFpZFVwVG8iOiIyMDE3LTAyLTI1In0seyJjb2RlIjoiRE0iLCJwYWlkVXBUbyI6IjIwMTctMDItMjUifSx7ImNvZGUiOiJDTCIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IlJTMCIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IlJDIiwicGFpZFVwVG8iOiIyMDE3LTAyLTI1In0seyJjb2RlIjoiUEMiLCJwYWlkVXBUbyI6IjIwMTctMDItMjUifSx7ImNvZGUiOiJSTSIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9LHsiY29kZSI6IldTIiwicGFpZFVwVG8iOiIyMDE3LTAyLTI1In0seyJjb2RlIjoiREIiLCJwYWlkVXBUbyI6IjIwMTctMDItMjUifSx7ImNvZGUiOiJEQyIsInBhaWRVcFRvIjoiMjAxNy0wMi0yNSJ9XSwiaGFzaCI6IjMzOTgyOTkvMCIsImdyYWNlUGVyaW9kRGF5cyI6MCwiYXV0b1Byb2xvbmdhdGVkIjpmYWxzZSwiaXNBdXRvUHJvbG9uZ2F0ZWQiOmZhbHNlfQ==-keaxIkRgXPKE4BR/ZTs7s7UkP92LBxRe57HvWamu1EHVXTcV1B4f/KNQIrpOpN6dgpjig5eMVMPmo7yMPl+bmwQ8pTZaCGFuLqCHD1ngo6ywHKIQy0nR249sAUVaCl2wGJwaO4JeOh1opUx8chzSBVRZBMz0/MGyygi7duYAff9JQqfH3p/BhDTNM8eKl6z5tnneZ8ZG5bG1XvqFTqWk4FhGsEWdK7B+He44hPjBxKQl2gmZAodb6g9YxfTHhVRKQY5hQ7KPXNvh3ikerHkoaL5apgsVBZJOTDE2KdYTnGLmqxghFx6L0ofqKI6hMr48ergMyflDk6wLNGWJvYHLWw==-MIIEPjCCAiagAwIBAgIBBTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTEwMjA4MjE0OFoXDTE4MTEwMTA4MjE0OFowETEPMA0GA1UEAwwGcHJvZDN5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxcQkq+zdxlR2mmRYBPzGbUNdMN6OaXiXzxIWtMEkrJMO/5oUfQJbLLuMSMK0QHFmaI37WShyxZcfRCidwXjot4zmNBKnlyHodDij/78TmVqFl8nOeD5+07B8VEaIu7c3E1N+e1doC6wht4I4+IEmtsPAdoaj5WCQVQbrI8KeT8M9VcBIWX7fD0fhexfg3ZRt0xqwMcXGNp3DdJHiO0rCdU+Itv7EmtnSVq9jBG1usMSFvMowR25mju2JcPFp1+I4ZI+FqgR8gyG8oiNDyNEoAbsR3lOpI7grUYSvkB/xVy/VoklPCK2h0f0GJxFjnye8NT1PAywoyl7RmiAVRE/EKwIDAQABo4GZMIGWMAkGA1UdEwQCMAAwHQYDVR0OBBYEFGEpG9oZGcfLMGNBkY7SgHiMGgTcMEgGA1UdIwRBMD+AFKOetkhnQhI2Qb1t4Lm0oFKLl/GzoRykGjAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBggkA0myxg7KDeeEwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCwYDVR0PBAQDAgWgMA0GCSqGSIb3DQEBCwUAA4ICAQC9WZuYgQedSuOc5TOUSrRigMw4/+wuC5EtZBfvdl4HT/8vzMW/oUlIP4YCvA0XKyBaCJ2iX+ZCDKoPfiYXiaSiH+HxAPV6J79vvouxKrWg2XV6ShFtPLP+0gPdGq3x9R3+kJbmAm8w+FOdlWqAfJrLvpzMGNeDU14YGXiZ9bVzmIQbwrBA+c/F4tlK/DV07dsNExihqFoibnqDiVNTGombaU2dDup2gwKdL81ua8EIcGNExHe82kjF4zwfadHk3bQVvbfdAwxcDy4xBjs3L4raPLU3yenSzr/OEur1+jfOxnQSmEcMXKXgrAQ9U55gwjcOFKrgOxEdek/Sk1VfOjvS+nuM4eyEruFMfaZHzoQiuw4IqgGc45ohFH0UUyjYcuFxxDSU9lMCv8qdHKm+wnPRb0l9l5vXsCBDuhAGYD6ss+Ga+aDY6f/qXZuUCEUOH3QUNbbCUlviSz6+GiRnt1kA9N2Qachl+2yBfaqUqr8h7Z2gsx5LcIf5kYNsqJ0GavXTVyWh7PYiKX4bs354ZQLUwwa/cG++2+wNWP+HtBhVxMRNTdVhSm38AknZlD+PTAsWGu9GyLmhti2EnVwGybSD2Dxmhxk3IPCkhKAK+pl0eWYGZWG3tJ9mZ7SowcXLWDFAk0lRJnKGFMTggrWjV8GYpw5bq23VmIqqDLgkNzuoog==  

搞定

Git(Github) 001 介绍和下载安装图文教程 for Windows


我的电脑:Windows 10 系统 64位


介绍

Git for Windows 软件就是 Git;GitHub For Windows 软件是GitHub公司做的一个超级低门槛的使用软件,非常好。


安装

在Windows上

下载:https://desktop.github.com/

安装时,不管是以普通用户的身份,还是以管理员的身份运行 GitHubSetup.exe 软件。都会出现下面的结果:

(这是在线下载,国内防火墙的原因,导致下载速度巨慢,最后连资源都找不到了。) Alt text

是没有办法成功安装的。

Alt text

点击 详细信息(D)…

Alt text

如果你看到的内容大致和我的一样的话,那么下面的解决方法很适合你。


Step 1 不使用Github 官方的这个在线下载软件,而是去我的百度云盘里下载离线版的Github For Windows软件

Github For Windows软件:你可以使用GUI可视化界面来使用GitHub,而不需要使用一些繁琐的Git命令,只需点点鼠标即可。

我在我的百度云盘里面有离线版的Github For Windows 文件,你可以去那下载。但是版本不是最新的,是2015/09/08 时候的版本。

链接:http://pan.baidu.com/s/1o8CSgI2 密码:cbos

下载后,解压,直接双击里面的 GitHub.application 文件,进行安装。

安装后,自动出现下面的窗口。 Alt text

现在你输入你的Github 用户名和密码,并点击 Log in

Alt text

点击 Continue 按钮。

Alt text


现在你就可以使用它了。 Alt text


Step 2 下载安装 Git For Windows

Git For Windows 软件:你可以在任何文件夹里面空白的位置,点击鼠标右键,里面会有两项:Git Bash 和 Git GUI 。其中 最常用的就是 Git Bash ,它就是 一个命令行终端,你需要使用繁琐的Git命令来将你的工程代码放到Github网站里面管理。

Alt text

我们下载 Git For Windows 。现在路径:https://git-for-windows.github.io/

下载完,直接双击安装,一路 下一步,所有选项全部默认即可。


启动:

Alt text



总结:

上面两个软件,我都需要你使用,我们即安装 GitHub For Windows 的软件,也安装 Git For Windows 的软件。

因为,虽然,在命令行终端中输入 Git 命令 相比 GUI界面里面点按钮 来说要繁琐得多,但是我们必须要学会这个 Git 命令。这个命令行工具指令实在是太有用了,它就像是一个木工的工具箱里面的锯条。这是程序员必须要具备的能力。

Python3 大型网络爬虫实战 002 --- Scrapy 爬虫项目的创建及爬虫的创建 --- 实例:爬取百度标题和CSDN博客


开发环境

  • Python第三方库:lxml、Twisted、pywin32、scrapy
  • Python 版本:python-3.5.0-amd64
  • PyCharm软件版本:pycharm-professional-2016.1.4
  • 电脑系统:Windows 10 64位

如果你还没有搭建好开发环境,请到这篇博客


1 知识点:scrapy 爬虫项目的创建及爬虫的创建

1.1 scrapy 爬虫项目的创建

接下来我们为大家创建一个Scrapy爬虫项目,并在爬虫项目下创建一个Scrapy爬虫文件。

1
scrapy startproject <projectname> 

1.2 scrapy 爬虫文件的创建

1
2
cd demo
scrapy genspider -t basic <filename> <domain>

更多 Scrapy 命令的介绍请到这篇博客查看。


2 实例:爬取百度标题和CSDN博客

我们创建一个爬虫项目,在里面创建一个爬虫文件来爬取百度,并再创建一个爬虫文件爬取CSDN博客文章。


先创建一个Scrapy爬虫项目:

1
scrapy startproject firstDemo

输出:

1
2
3
4
5
6
7
8
9
D:\WorkSpace\python_ws\python-large-web-crawler>scrapy startproject firstdemo
New Scrapy project 'firstdemo', using template directory 'c:\\users\\aobo\\appdata\\local\\programs\\python\\python35\\lib\\site-packages\\scrapy\\templates\\project', created in:
    D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo

You can start your first spider with:
    cd firstdemo
    scrapy genspider example example.com

D:\WorkSpace\python_ws\python-large-web-crawler>

2-1.1 使用Scrapy爬虫 爬取百度标题

创建一个爬虫文件来爬取百度

1
2
cd firstDemo
scrapy genspider -t basic baidu baidu.com

输出:

1
2
3
4
5
6
7
D:\WorkSpace\python_ws\python-large-web-crawler>cd firstdemo

D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo>scrapy genspider -t basic baidu baidu.com
Created spider 'baidu' using template 'basic' in module:
  firstdemo.spiders.baidu

D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo>

Alt text

打开 PyCharm 软件,用 PyCharm 软件打开刚刚创建的 firstdemo 爬虫项目。

Alt text

Alt text

打开这 baidu.py 爬虫文件,你会看到自动生成的代码:

Alt text

2-1.2 观察 https://www.baidu.com/ 网页源代码

(源代码太多,列出重点的。)

1
2
3
4
5
<html xmlns="http://www.w3.org/1999/xhtml" class="cye-enabled cye-nm sui-componentWrap">
    <head>
        <title>百度一下,你就知道 </title>
    </head>
</html>

源代码中的标题通过标签逐步定位: /html/head/title

2-1.3 写代码

我们现在要提取出 https://www.baidu.com/ 网页 的标题:百度一下,你就知道

提取信息,一般使用 xpath 或者 正则表达式 来提取。

这里我们使用 xpath 来提取,xpath 的知识点,请到这篇博客中查看。


下面的编写代码的步骤:

Step 1 . 设置我们的爬虫不遵循 robots.txt 规定。(什么是robots.txt规定,请到这个博客查看。)

打开 settings.py 文件,将里面的ROBOTSTXT_OBEY 设为:False

Alt text

Step 2 . 打开 items.py 文件,在里面FirstdemoItem()函数里添加一项:

1
title = scrapy.Field()

Alt text

Step 3 . baidu.py 文件里面,使用xpath 表达式 提取百度网页的标题。

先从核心目录(firstdemo)定位到items.py 文件里面的FirstdemoItem函数。

然后使用xpath 表达式 提取百度网页的标题。

最后,返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
# -*- coding: utf-8 -*-
import scrapy
from firstdemo.items import FirstdemoItem

class BaiduSpider(scrapy.Spider):
    name = "baidu"
    allowed_domains = ["baidu.com"]
    start_urls = ['http://baidu.com/']

    def parse(self, response):
        item = FirstdemoItem()
        item['title'] = response.xpath('/html/head/title/text()').extract()
        yield item

Alt text

Step 4 . pipelines.py 文件里面的FirstdemoPipeline()函数,添加打印信息的代码:

1
    print(item['title'])

Alt text

但是,现在运行程序,是不能输出任何信息的,还需要做Step 5

Step 5 . 开启piplines(默认piplines是关闭的。) 在 settings.py 文件,将里面的ITEM_PIPELINES 项的注释去掉。并从核心目录开始定位,定位到pipelines.py 文件里面的FirstdemoPipeline()函数 ,就应该是:firstdemo.pipelines.FirstdemoPipeline

Alt text

2-1.4 运行

DOS窗口 中,先将路劲切换到当前爬虫项目firstdemo路径下,然后在执行爬虫文件 baidy

1
2
3
D:
cd D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo
scrapy crawl baidu --nolog

Alt text


2-2.1 使用Scrapy爬虫CSDN的博客文章

创建一个爬虫文件爬取CSDN博客文章。

1
scrapy genspider -t basic csdn blog.csdn.net

输出:

Alt text

2-2.2 观察 http://blog.csdn.net/ 网页源代码

(网页源代码太多,这里就不贴出了。)

提取信息,一般使用 xpath 或者 正则表达式 来提取。

2-2.3 写代码

Step 1 . items.py 文件中的FirstdemoItem()函数中添加新的项。其他的文件会使用这几个对象:

1
2
detail = scrapy.Field()
link = scrapy.Field()

Alt text

Step 2 . csdn.py 文件里面,使用xpath 表达式 提取csdn博客网页的博文标题、介绍、链接地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding: utf-8 -*-
import scrapy
from firstdemo.items import FirstdemoItem


class CsdnSpider(scrapy.Spider):
    name = "csdn"
    allowed_domains = ["blog.csdn.net"]
    start_urls = ['http://blog.csdn.net/']

    def parse(self, response):
        item = FirstdemoItem()
        item['title'] = response.xpath("//h3[@class='tracking-ad']/a/text()").extract()
        item['detail'] = response.xpath("//div[@class='blog_list_c']/text()").extract()
        item['link'] = response.xpath("//h3[@class='tracking-ad']/a/@href").extract()
        yield item

Alt text

Step 3 . piplines.py 文件中,添加下面的代码,输出显示爬取到的信息。

1
2
3
4
5
6
    for i in range(0, len(item['title'])):
        print('第' + str(i+1) + '篇文章:')
        print(item['title'][i])
        print(item['detail'][i])
        print(item['link'][i])
        print('---------')

Alt text

2-1.4 运行

1
scrapy crawl csdn --nolog

执行输出的信息太少,说明程序有问题。

scrapy crawl csdn

如果你在执行的时候,找到错误提示信息:

UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 10: illegal multibyte sequence

这个问题经常会遇到,是一个常见的问题,解决办法在这里可以找到。

         print(item['detail'][i].replace(u'\xa0 ', u' '))

输出:

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
1篇文章:
微信小程序:小程序,新场景
前言:我们频繁进入的地方,是场景。手机,是场景;浏览器,是场景;其实,微信,也是场景……微信要做的是占据更多用户时间、占
据更多应用场景、占据更多服务入口,这是商业本质想去垄断要做的事情。对于大家来讲,...
http://blog.csdn.net/liujia216/article/details/53350247
---------
2篇文章:
Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播
BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播
  本篇文章包括以下内容:


  前言
  BroadcastReceiver的简介
 ...
http://blog.csdn.net/qq_30379689/article/details/53341313
---------
3篇文章:
Gif格式简要介绍
Gif格式的介绍

为什么有的Gif图不能够循环播放及处理办法
http://blog.csdn.net/shiroh_ms08/article/details/53347873
---------
4篇文章:
win10 uwp 打包第三方字体到应用
有时候我们会把一些特殊字体打包到软件,因为如果找不到我们的字体会变为默认,现在很多字体图标我们用得好,有时候我们的应用会
用很漂亮的字体,需要我们自己打包,因为用户一般是没有字体。UWP使用第三方字体首...
http://blog.csdn.net/lindexi_gd/article/details/52716655
---------
5篇文章:
话说智能指针发展之路
动态创建内存的管理太麻烦,于是乎,这个世界变成11派人:
一派人勤勤恳恳按照教科书的说法做,时刻小心翼翼,苦逼连连;
一派人忘记教科书的教导,随便乱来,搞得代码处处bug,后期维护骂声连连;
...
http://blog.csdn.net/jacketinsysu/article/details/53343534
---------
6篇文章:
安卓自定义控件(二)BitmapShaderShapeDrawableShape
第一篇博客中,我已经对常用的一些方法做了汇总,这篇文章主要介绍BitmapShader位图渲染、ComposeShader组合渲染,然后看看Xferm
ode如何实际应用。不过本文还是只重写onDraw...
http://blog.csdn.net/chen413203144/article/details/53343209
---------
7篇文章:
JSTL 标签大全详解
1、什么是JSTL    JSTLapacheEL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与JSP
动作标签一样,只不过它不是JSP...
http://blog.csdn.net/qq_25827845/article/details/53311722
---------
8篇文章:
Android调试大法 自定义IDE默认签名文件
你是否为调试第三方SDKdebug签名和release签名发生冲突而烦恼?你是否在debug时第三方功能测试通过,而release时无法使用?你
是否在为对接微信、支付宝、地图因签名导致的问题而烦恼?...
http://blog.csdn.net/yanzhenjie1003/article/details/53334071
---------
9篇文章:
Android图表库MPAndroidChart(十二)——来点不一样的,正负堆叠条形图
Android图表库MPAndroidChart(十二)——来点不一样的,正负堆叠条形图
  接上篇,今天要说的,和上篇的类似,只是方向是有相反的两面,我们先看下效果  实际上这样就导致了我们的代码是...
http://blog.csdn.net/qq_26787115/article/details/53333270
---------
10篇文章:
一步步手动实现热修复()-类的加载机制简要介绍
一个类在被加载到内存之前要经过加载、验证、准备等过程。经过这些过程之后,虚拟机才会从方法区将代表类的运行时数据结构转换为
内存中的Class

我们这节内容的重点在于一个类是如何被加载的,所以我们从类...
http://blog.csdn.net/sahadev_/article/details/53334911
---------
11篇文章:
仿射变换详解 warpAffine
今天遇到一个问题是关于仿射变换的,但是由于没有将仿射变换的具体原理型明白,看别人的代码看的很费解,最后终于在师兄的帮助下
将原理弄明白了,我觉得最重要的是理解仿射变换可以看成是几种简单变换的复合实现,
...
http://blog.csdn.net/q123456789098/article/details/53330484
---------
12篇文章:
React Native嵌入Android原生应用中
开发环境准备首先你要搭建好React Native for Android开发环境, 没有搭建好的可以参考:React Native for Android Windows环境
搭建  Android...
http://blog.csdn.net/u011965040/article/details/53331859
---------
13篇文章:
TCP三次握手四次挥手详解
TCP三次握手四次挥手详解
http://blog.csdn.net/u010913001/article/details/53331863
---------
14篇文章:
腾讯Android面经
秋招收官最后一战。
腾讯一面(电话):
自我介绍
项目,平时怎么学习?
设计模式
1)知道哪些设计模式?设计模式在AndroidJava中是怎么应用的,每个都说一下?
2InputStre...
http://blog.csdn.net/kesarchen/article/details/53332157
---------
15篇文章:
轻松实现部分背景半透明的呈现效果
实现一个简单的呈现/解散动画效果,当呈现时,呈现的主要内容和背景要明显区分,背景呈现一个半透明遮罩效果,透过背景可以看到
下层 View Controller 的内容
http://blog.csdn.net/kmyhy/article/details/53322669
---------
16篇文章:
APP自动化框架LazyAndroid使用手册(4--测试模板工程详解
概述前面的3篇博文分别对lazyAndroid的框架简介、元素抓取和核心API进行了说明,本文将基于框架给出的测试模板工程,详细阐述下
使用该框架进行安卓UI自动化测试的步骤。
http://blog.csdn.net/kaka1121/article/details/53325265
---------
17篇文章:
Android使用getIdentifier()方法根据资源名来获取资源id
有时候我们想动态的根据一个资源名获得到对应的资源id,就可以使用getResources().getIdentifier()方法来获取该id。然后再使用该
id进行相关的操作。
1Demo示例
  ...
http://blog.csdn.net/ouyang_peng/article/details/53328000
---------
18篇文章:
Android基于RecyclerView实现高亮搜索列表
这篇应该是RecycleView的第四篇了,RecycleView真是新生代的宠儿能做这么多的事情。转载请注明作者AndroidMsky及原文链接
http://blog.csdn.net/and...
http://blog.csdn.net/androidmsky/article/details/53306657
---------
19篇文章:
使用Git Hooks实现开发部署任务自动化
提供:ZStack云计算 前言版本控制,这是现代软件开发的核心需求之一。有了它,软件项目可以安全的跟踪代码变更并执行回溯、完整
性检查、协同开发等多种操作。在各种版本控制软件中,git是近年来最流行的软...
http://blog.csdn.net/zstack_org/article/details/53331077
---------
20篇文章:
Andromeda OS 来了,Android 再见?
相信有部分同学已经有耳闻了,前几天炒的很火一个消息,就是 Google 要推出一种全新的操作系统,取名 Andromeda,这款新型的操作
系统融合了 Android  Chrome OS,据称已经有...
http://blog.csdn.net/googdev/article/details/53331364
---------

我用英语跟小贩交谈,突然画面一下就全暗,我回台上,终于轮我上场。

Python --- Xpath 表达式 --- Ongoing


什么是 XPath

参考网站:http://www.w3school.com.cn/xpath/xpath_intro.asp

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。

xpath 表达式 语法讲解

参考网站:http://www.w3school.com.cn/xpath/xpath_syntax.asp

例如,现在有这些信息:

1
2
3
4
5
6
7
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>CSDN.NET - 全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台</title>
<link href="http://c.csdnimg.cn/www/css/csdn_common.css" rel="stylesheet" type="text/css">
<link href="css/content.css" rel="stylesheet" type="text/css">
<link href="http://c.csdnimg.cn/public/favicon.ico" rel="SHORTCUT ICON">
</head>
表达式 意思
/ 寻找指定标签
// 寻找所有标签
@ 提取某个标签的属性的内容

例子:

不管怎么样,记住一点:只有唯一的东西才能定位

1
/title.text()

表示:

1
CSDN.NET - 全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台

参考网站:http://scrapy-chs.readthedocs.io/zh_CN/0.24/topics/selectors.html


Python3 解决编码问题: `UnicodeEncodeError: 'Gbk' Codec Can't Encode Character '\xa0' in Position 10: Illegal Multibyte Sequence` --- 当执行爬虫将爬取信息打印到终端时出现的编码错误

  • Python 版本:python-3.5.0-amd64

目标网站:http://blog.csdn.net/

1
2
3
4
5
6
7
8
9
def process_item(self, item, spider):
    # print(item['title'])
    for i in range(0, len(item['title'])):
        print('第' + str(i+1) + '篇文章:')
        print(item['title'][i])
        print(item['detail'][i])
        print(item['link'][i])
        print('---------')
    return item

出现的错误

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo>scrapy crawl csdn
2016-11-26 00:37:58 [scrapy] INFO: Scrapy 1.2.1 started (bot: firstdemo)
2016-11-26 00:37:58 [scrapy] INFO: Overridden settings: {'SPIDER_MODULES': ['firstdemo.spiders'], 'BOT_NAME': 'firstdemo', 'NEWSPIDER_MODULE': 'firstdemo.spiders'}
2016-11-26 00:37:58 [scrapy] INFO: Enabled extensions:
['scrapy.extensions.logstats.LogStats',
 'scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole']
2016-11-26 00:37:59 [scrapy] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2016-11-26 00:37:59 [scrapy] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2016-11-26 00:37:59 [scrapy] INFO: Enabled item pipelines:
['firstdemo.pipelines.FirstdemoPipeline']
2016-11-26 00:37:59 [scrapy] INFO: Spider opened
2016-11-26 00:37:59 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-11-26 00:37:59 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-11-26 00:37:59 [scrapy] DEBUG: Crawled (200) <GET http://blog.csdn.net/> (referer: None)
1篇文章:
JSTL 标签大全详解
2016-11-26 00:37:59 [scrapy] ERROR: Error processing {'detail': ['1、什么是JSTL?\xa0 \xa0 \xa0 \xa0 '
            'JSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是JSP内...',
            '你是否为调试第三方SDK时debug签名和release签名发生冲突而烦恼?你是否在debug时第三方功能测试通过,而release时无法使用?你是否在为对接微信、支付宝、地图因签名导致的问题而烦恼?...',
            'Android图表库MPAndroidChart(十二)——来点不一样的,正负堆叠条形图\n'
            '  接上篇,今天要说的,和上篇的类似,只是方向是有相反的两面,我们先看下效果  实际上这样就导致了我们的代码是...',
            '一个类在被加载到内存之前要经过加载、验证、准备等过程。经过这些过程之后,虚拟机才会从方法区将代表类的运行时数据结构转换为内存中的Class。\n'
            '\n'
            '我们这节内容的重点在于一个类是如何被加载的,所以我们从类...',
            '今天遇到一个问题是关于仿射变换的,但是由于没有将仿射变换的具体原理型明白,看别人的代码看的很费解,最后终于在师兄的帮助下将原理弄明白了,我觉得最重要的是理解 仿射变换可以看成是几种简单变换的复合实现,\n'
            '...',
            '开发环境准备首先你要搭建好React Native for Android开发环境, 没有搭建好的可以参考:React '
            'Native for Android Windows环境搭建  用Android...',
            'TCP三次握手四次挥手详解',
            '秋招收官最后一战。\n'
            '腾讯一面(电话):\n'
            '自我介绍\n'
            '项目,平时怎么学习?\n'
            '设计模式 \n'
            '(1)知道哪些设计模式?设计模式在Android、Java中是怎么应用的,每个都说一下? \n'
            '(2)InputStre...',
            '实现一个简单的呈现/解散动画效果,当呈现时,呈现的主要内容和背景要明显区分,背景呈现一个半透明遮罩效果,透过背景可以看到下层 '
            'View Controller 的内容',
            '概述前面的3篇博文分别对lazyAndroid的框架简介、元素抓取和核心API进行了说明,本文将基于框架给出的测试模板工程,详细阐述下使用该框架进行安卓UI自动化测试的步骤。',
            '有时候我们想动态的根据一个资源名获得到对应的资源id,就可以使用getResources().getIdentifier()方法来获取该id。然后再使用该id进行相关的操作。\n'
            '1、Demo示例\n'
            '  下...',
            '这篇应该是RecycleView的第四篇了,RecycleView真是新生代的宠儿能做这么多的事情。转载请注明作者AndroidMsky及原文链接  \n'
            'http://blog.csdn.net/and...',
            '提供:ZStack云计算 '
            '前言版本控制,这是现代软件开发的核心需求之一。有了它,软件项目可以安全的跟踪代码变更并执行回溯、完整性检查、协同开发等多种操作。在各种版本控制软件中,git是近年来最流行的软...',
            '相信有部分同学已经有耳闻了,前几天炒的很火一个消息,就是 Google 要推出一种全新的操作系统,取名 '
            'Andromeda,这款新型的操作系统融合了 Android 和 Chrome OS,据称已经有...',
            'Android7.0 Vold 进程工作机制分析之整体流程\n'
            '\n'
            '\n'
            '\n'
            '一、Vold简介\n'
            '\n'
            'Vold是Volume Daemon的缩写,负责管理和控制Android平台外部存储设备,包括SD插拨、挂载、卸载...',
            '尊重原创,转载请标明出处\xa0\xa0\xa0\xa0http://blog.csdn.net/abcdef314159\n'
            'Matrix是一个3*3的矩阵,通过矩阵执行对图像的平移,旋转,缩放,斜切等操作。先看一段代码   ...',
            'Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务\n'
            '  本篇文章包括以下内容:\n'
            '  \n'
            '  \n'
            '  前言\n'
            '  Service的简介\n'
            '  后台服务 \n'
            '  不可交互...',
            '借着今天“感恩节”,CSDN在此感谢每一位无私分享的博客作者。 \n'
            '  他们笔耕不辍,在这里分享技术经验、自己走过的坑……  \n'
            '  社区习惯了他们的存在,首页也需要他们的分享,他们无形中帮助了许多的开发...',
            'Android图表库MPAndroidChart(十一)——多层级的堆叠条形图\n'
            '  事实上这个也是条形图的一种扩展,我们看下效果就知道了  是吧,他一般满足的需求就是同类数据比较了,不过目前我还真没看...',
            '相信大家应该都在使用 Android Studio 来开发 Android 了,如果你还没有的话,那么建议尽快迁移到 '
            'Android Studio 上来,而且 Google 前段时间刚刚宣布,已经彻底...'],
 'link': ['http://blog.csdn.net/qq_25827845/article/details/53311722',
          'http://blog.csdn.net/yanzhenjie1003/article/details/53334071',
          'http://blog.csdn.net/qq_26787115/article/details/53333270',
          'http://blog.csdn.net/sahadev_/article/details/53334911',
          'http://blog.csdn.net/q123456789098/article/details/53330484',
          'http://blog.csdn.net/u011965040/article/details/53331859',
          'http://blog.csdn.net/u010913001/article/details/53331863',
          'http://blog.csdn.net/kesarchen/article/details/53332157',
          'http://blog.csdn.net/kmyhy/article/details/53322669',
          'http://blog.csdn.net/kaka1121/article/details/53325265',
          'http://blog.csdn.net/ouyang_peng/article/details/53328000',
          'http://blog.csdn.net/androidmsky/article/details/53306657',
          'http://blog.csdn.net/zstack_org/article/details/53331077',
          'http://blog.csdn.net/googdev/article/details/53331364',
          'http://blog.csdn.net/qq_31530015/article/details/53324819',
          'http://blog.csdn.net/abcdef314159/article/details/52813313',
          'http://blog.csdn.net/qq_30379689/article/details/53318861',
          'http://blog.csdn.net/blogdevteam/article/details/53322501',
          'http://blog.csdn.net/qq_26787115/article/details/53323046',
          'http://blog.csdn.net/googdev/article/details/53288564'],
 'title': ['JSTL 标签大全详解',
           'Android调试大法 自定义IDE默认签名文件',
           'Android图表库MPAndroidChart(十二)——来点不一样的,正负堆叠条形图',
           '一步步手动实现热修复(二)-类的加载机制简要介绍',
           '仿射变换详解 warpAffine',
           'React Native嵌入Android原生应用中',
           'TCP三次握手四次挥手详解',
           '腾讯Android面经',
           '轻松实现部分背景半透明的呈现效果',
           'APP自动化框架LazyAndroid使用手册(4)--测试模板工程详解',
           'Android使用getIdentifier()方法根据资源名来获取资源id',
           'Android基于RecyclerView实现高亮搜索列表',
           '使用Git Hooks实现开发部署任务自动化',
           'Andromeda OS 来了,Android 再见?',
           'Android7.0 Vold 进程工作机制分析之整体流程',
           'Android Matrix源码详解',
           'Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务',
           '聚焦CSDN 2016博客之星,年终盛典!',
           'Android图表库MPAndroidChart(十一)——多层级的堆叠条形图',
           'Android 高效调试神器 JRebel']}
Traceback (most recent call last):
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\twisted\internet\defer.py", line 649, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo\firstdemo\pipelines.py", line 15, in process_item
    print(item['detail'][i])
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 10: illegal multibyte sequence
2016-11-26 00:38:00 [scrapy] INFO: Closing spider (finished)
2016-11-26 00:38:00 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 211,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 13294,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2016, 11, 25, 16, 38, 0, 268302),
 'log_count/DEBUG': 2,
 'log_count/ERROR': 1,
 'log_count/INFO': 7,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2016, 11, 25, 16, 37, 59, 190533)}
2016-11-26 00:38:00 [scrapy] INFO: Spider closed (finished)

D:\WorkSpace\python_ws\python-large-web-crawler\firstdemo>

解析 为什么会出现这个问题?

解析:

当我们获取这个网页的源代码的时候,是将这个网页用utf-8的解码方式将其转换成对应的Unicode字符,当我们使用print()函数将其打印到Windows系统的DOS窗口上的时候(DOS窗口的编码方式是GBK),自动将Unicode字符通过GBK编码转换为GBK编码方式的str

整个过程是: [用python爬取] UTF-8(str) -> [缓存中存放] Unicode(byte) -> [DOS中显示] GBK(str)


出现这个问题(错误的\xa0)的原因:

网页源代码中的&nbsp;utf-8 编码是:\xc2 \xa0,通过后,转换为Unicode字符为:\xa0,当显示到DOS窗口上的时候,转换为GBK编码的字符串,但是\xa0这个Unicode字符没有对应的 GBK 编码的字符串,所以出现错误。

Alt text

http://www.codetable.net/hex/a0

Alt text

Unicode字符:

1
2
3
4
5
6
7
7篇文章:
JSTL 标签大全详解
b'1\\u3001\\u4ec0\\u4e48\\u662fJSTL\\uff1f\\xa0 \\xa0 \\xa0 \\xa0 JSTL\\u662fapache\\u5bf9EL\\u8868\\u8fbe\\u5f0f\\u7684
\\u6269\\u5c55\\uff08\\u4e5f\\u5c31\\u662f\\u8bf4JSTL\\u4f9d\\u8d56EL\\uff09\\uff0cJSTL\\u662f\\u6807\\u7b7e\\u8bed\\u8a
00\\uff01JSTL\\u6807\\u7b7e\\u4f7f\\u7528\\u4ee5\\u6765\\u975e\\u5e38\\u65b9\\u4fbf\\uff0c\\u5b83\\u4e0eJSP\\u52a8\\u4f5
c\\u6807\\u7b7e\\u4e00\\u6837\\uff0c\\u53ea\\u4e0d\\u8fc7\\u5b83\\u4e0d\\u662fJSP\\u5185...'
http://blog.csdn.net/qq_25827845/article/details/53311722

通过GBK编码后得到的错误的log信息。

1
'1、什么是JSTL?\xa0 \xa0 \xa0 \xa0 '

解决办法

http://stackoverflow.com/questions/10993612/python-removing-xa0-from-string

用 ‘’ 来替换 ‘\xa0’ (&nbsp;):

1
        print(item['detail'][i].replace(u'\xa0 ', u' '))

搞定


参考网站:

https://www.zhihu.com/question/20899988

http://blog.csdn.net/jim7424994/article/details/22675759

解决问题: Pywin32 安装后出现 Import Win32api ImportError DLL Load Failed


执行 scrapy bench 命令时 出现错误。(之前安装了pywin32库)

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
Traceback (most recent call last):
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\twisted\internet\defer.py", line 1260, in _inlineCallbacks
    result = g.send(result)
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\crawler.py", line 72, in crawl
    self.engine = self._create_engine()
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\crawler.py", line 97, in _create_engine
    return ExecutionEngine(self, lambda _: self.stop())
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\core\engine.py", line 68, in __init__
    self.downloader = downloader_cls(crawler)
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\core\downloader\__init__.py", line 88, in __init__
    self.middleware = DownloaderMiddlewareManager.from_crawler(crawler)
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\middleware.py", line 58, in from_crawler
    return cls.from_settings(crawler.settings, crawler)
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\middleware.py", line 34, in from_settings
    mwcls = load_object(clspath)
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\utils\misc.py", line 44, in load_object
    mod = import_module(module)
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\importlib\__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 986, in _gcd_import
  File "<frozen importlib._bootstrap>", line 969, in _find_and_load
  File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 662, in exec_module
  File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\downloadermiddlewares\retry.py", line 23, in <module>
    from scrapy.xlib.tx import ResponseFailed
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\scrapy\xlib\tx\__init__.py", line 3, in <module>
    from twisted.web import client
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\twisted\web\client.py", line 42, in <module>
    from twisted.internet.endpoints import TCP4ClientEndpoint, SSL4ClientEndpoint
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\twisted\internet\endpoints.py", line 36, in <module>
    from twisted.internet.stdio import StandardIO, PipeAddress
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\twisted\internet\stdio.py", line 30, in <module>
    from twisted.internet import _win32stdio
  File "c:\users\aobo\appdata\local\programs\python\python35\lib\site-packages\twisted\internet\_win32stdio.py", line 9, in <module>
    import win32api
ImportError: DLL load failed: 找不到指定的模块。

解决办法:

参考网站:

http://blog.csdn.net/mtt_sky/article/details/50445938 http://blog.sina.com.cn/s/blog_5a81b7990101l225.html

C:\Users\AOBO\AppData\Local\Programs\Python\Python35\Lib\site-packages\pywin32_system32

里面的所有的文件复制到:C:\Windows\System32

现在,问题解决。无需重新打开DOS窗口,直接执行:scrapy bench

输出正常:

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
D:\BaiduYunDownload\first>scrapy bench
2016-11-23 13:56:45 [scrapy] INFO: Scrapy 1.2.1 started (bot: first)
2016-11-23 13:56:45 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'first.spiders', 'CLOSESPIDER_TIMEOUT': 10, 'LOGSTATS_INTERVAL': 1, 'LOG_LEVEL': 'INFO', 'BOT_NAME': 'first', 'SPIDER_MODULES': ['first.spiders']}
2016-11-23 13:56:47 [scrapy] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.closespider.CloseSpider',
 'scrapy.extensions.logstats.LogStats']
2016-11-23 13:56:48 [scrapy] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.chunked.ChunkedTransferMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2016-11-23 13:56:48 [scrapy] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2016-11-23 13:56:48 [scrapy] INFO: Enabled item pipelines:
['first.pipelines.FirstPipeline']
2016-11-23 13:56:48 [scrapy] INFO: Spider opened
2016-11-23 13:56:48 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:49 [scrapy] INFO: Crawled 69 pages (at 4140 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:50 [scrapy] INFO: Crawled 141 pages (at 4320 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:51 [scrapy] INFO: Crawled 205 pages (at 3840 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:52 [scrapy] INFO: Crawled 269 pages (at 3840 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:53 [scrapy] INFO: Crawled 325 pages (at 3360 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:54 [scrapy] INFO: Crawled 373 pages (at 2880 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:55 [scrapy] INFO: Crawled 429 pages (at 3360 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:56 [scrapy] INFO: Crawled 477 pages (at 2880 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:57 [scrapy] INFO: Crawled 533 pages (at 3360 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:58 [scrapy] INFO: Crawled 581 pages (at 2880 pages/min), scraped 0 items (at 0 items/min)
2016-11-23 13:56:58 [scrapy] INFO: Closing spider (closespider_timeout)
2016-11-23 13:56:59 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 265444,
 'downloader/request_count': 597,
 'downloader/request_method_count/GET': 597,
 'downloader/response_bytes': 1833261,
 'downloader/response_count': 597,
 'downloader/response_status_count/200': 597,
 'finish_reason': 'closespider_timeout',
 'finish_time': datetime.datetime(2016, 11, 23, 5, 56, 59, 266168),
 'log_count/INFO': 17,
 'request_depth_max': 20,
 'response_received_count': 597,
 'scheduler/dequeued': 597,
 'scheduler/dequeued/memory': 597,
 'scheduler/enqueued': 11938,
 'scheduler/enqueued/memory': 11938,
 'start_time': datetime.datetime(2016, 11, 23, 5, 56, 48, 450531)}
2016-11-23 13:56:59 [scrapy] INFO: Spider closed (closespider_timeout)

D:\BaiduYunDownload\first>

Python --- Scrapy 命令


Scrapy 命令 分为两种:全局命令项目命令

全局命令:在哪里都能使用。

项目命令:必须在爬虫项目里面才能使用。

全局命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
C:\Users\AOBO>scrapy -h
Scrapy 1.2.1 - no active project

Usage:
  scrapy <command> [options] [args]

Available commands:
  bench         Run quick benchmark test
  commands
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

  [ more ]      More commands available when run from project directory

Use "scrapy <command> -h" to see more info about a command
  • startproject:创建一个爬虫项目:scrapy startproject demodemo 创建的爬虫项目的名字)
  • runspider 运用单独一个爬虫文件:scrapy runspider abc.py
  • veiw 下载一个网页的源代码,并在默认的文本编辑器中打开这个源代码:scrapy view http://www.aobossir.com/
  • shell 进入交互终端,用于爬虫的调试(如果你不调试,那么就不常用):scrapy shell http://www.baidu.com --nolog--nolog 不显示日志信息)
  • version 查看版本:(scrapy version
  • bench 测试本地硬件性能(工作原理:):scrapy bench (如果遇到问题:解决问题: import win32api ImportError: DLL load failed,到这里查看解决办法。)

项目命令

(进入项目路径,才能看到项目命令)

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
D:\BaiduYunDownload\first>scrapy -h
Scrapy 1.2.1 - project: first

Usage:
  scrapy <command> [options] [args]

Available commands:
  bench         Run quick benchmark test
  check         Check spider contracts
  commands
  crawl         Run a spider
  edit          Edit spider
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  list          List available spiders
  parse         Parse URL (using its spider) and print the results
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

Use "scrapy <command> -h" to see more info about a command

D:\BaiduYunDownload\first>
  • genspider 创建一个爬虫文件,我们在爬虫项目里面才能创建爬虫文件(这个命令用的非常多)(startproject:创建一个爬虫项目)。创建爬虫文件是按照以下模板来创建的,使用scrapy genspider -l 命令查看有哪些模板。
1
2
3
4
5
6
7
8
D:\BaiduYunDownload\first>scrapy genspider -l
Available templates:
  basic
  crawl
  csvfeed
  xmlfeed

D:\BaiduYunDownload\first>

basic 基础 crawl自动爬虫 csvfeed用来处理csv文件 xmlfeed用来处理xml文件

按照basic模板创建一个名为f1的爬虫文件:scrapy genspider -t basic f1 ,创建了一个f1.py文件。

  • check 测试爬虫文件、或者说:检测一个爬虫,如果结果是:OK,那么说明结果没有问题。:scrapy check f1

  • crawl 运行一个爬虫文件。:scrapy crawl f1 或者 scrapy crawl f1 --nolog

  • list 列出当前爬虫项目下所有的爬虫文件: scrapy list

  • edit 使用编辑器打开爬虫文件 (Windows上似乎有问题,Linux上没有问题):scrapy edit f1