AoboSir 博客

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

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
---------

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

Comments