【Scrapy-01】安装、创建项目、创建爬虫、简单爬取百度title的例子以及工作流程简介

下载python的时候,如果下载的是比较新的版本,一般都自带了pip,这是pip官网说的,我们一般只需要更新一下pip即可,有时候也不需要更新,因为下载的最新版本一般都是自带最新的pip。pip官网:https://pip.pypa.io/en/stable/installing/

1、首先就是安装我们的Scrapy,我们一般使用pip命令,但是首先需要先更新pip的版本。pip的操作文档见官网https://pip.pypa.io/en/stable/installing/。升级的命令,我们在Windows平台就用:
这里写图片描述

2、然后用以下命令安装scrapy,国内网速比较慢,容易出现timeout错误。
这里写图片描述

——当然不是一帆风顺的,一般新电脑上,会提示这个错误。
这里写图片描述

没办法,去这个提示的网址http://landinghub.visualstudio.com/visual-cpp-build-tools下载安装吧。

这里面需要注意的是,我之前安装了vs2013,所以按照上面的步骤补充安装一个build tools是没问题的,但是我后来安装了vs2015之后,提示出错后我按照上面补充安装build tools时出现冲突,提示让我卸载vs2015后再安装,当时直接懵了,这不是微软一家的东西嘛。按道理vs2015是包含build tools的,但是微软硬生生把两者拆分了,这也就算了,这两者竞争单独安装的时候会冲突,也是醉了。解决办法当然不是卸载vs2015,而是更改vs2015,也就是再更改的时候补充安装一个visual c++下面的一个通用build tools的模块,具体名字忘记了。提示大概有3G的样子,其实安装的时候还是比较快的。

——安装好之后,用帮助命令测试一下看看能不能用:

>scrapy -h

——目前我们的开发环境主要是:

Python 3.6.1
pip 9.0.1
Scrapy 1.4.0

3、貌似已经安装好了,我们用一下如下命令,执行一下试试:

>scrapy fetch http://www.baidu.com

发现报错了,貌似是缺少一个win32api模块:
这里写图片描述

我们安装一下这个模块,好家伙,这个模块有9M+的大小,总之自己多试几次吧:

>pip install pypiwin32

安装好之后再运行“:

>scrapy fetch http://www.baidu.com

这回没有报错了,不仅返回了内容,而且还输出了整个执行过程:
这里写图片描述

如果我们只想看到内容,不想输出执行的过程(也叫日志),加个--nolog参数即可:

>scrapy fetch http://www.baidu.com --nolog

4、创建一个项目很简单,cd到自己选的文件夹,用下面的命令就可以创建了:

>scrapy startproject test1

——我们cd到项目里面执行下面这个命令,可以测试理论上的爬虫最大速度:

>cd test1

>scrapy bench

我们进入到项目后,就可以创建具体的爬虫了。可以查看有几种爬虫模板。

>scrapy genspider -l
Available templates:
  basic
  crawl
  csvfeed
  xmlfeed

创建一个爬虫的完全指定如下,可以指定模板,需要指定名字,需要指定爬取的域名。

>scrapy genspider -t basic baidu_spider baidu.com
Created spider 'baidu_spider' using template 'basic' in module:
  test1.spiders.baidu_spider

这里写图片描述

5、检查一个爬虫是否正常运行,用check命令,如下。看到有个OK,嗯,就可以提早下班了。

>scrapy check baidu_spider

----------------------------------------------------------------------
Ran 0 contracts in 0.000s

OK

6、另一个比较重要的命令就是执行我们创建的爬虫:

scrapy crawl baidu_spider --nolog

——查看项目下有哪些爬虫,用list命令。

>scrapy list
baidu_spider

7、IDE的话,随便用。可以用Sublime Text,也可以用Pycharm。

8、我们随便写了一个爬去百度首页title的爬虫。内容如下:

——文件items.py

import scrapy

class Test1Item(scrapy.Item):
    title = scrapy.Field()

——爬虫文件baidu_spider.py

# -*- coding: utf-8 -*-
import scrapy
from test1.items import Test1Item


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

    def parse(self, response):
        item = Test1Item()
        item['title'] = response.xpath('//title/text()').extract()
        print(item['title'])

——我们执行一下,发现没有打印出任何东西:

>scrapy crawl baidu_spider --nolog

——那我们把日志信息打印出来看看:

>scrapy crawl baidu_spider

发现有这么一行日志信息,说明百度这么网站不允许爬虫爬取,那我们的爬虫默认是遵守爬虫协议的:

2017-08-18 15:03:20 [scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET http://baidu.com/>

——如果非要爬取,那就是不遵守协议了,不遵守的话,在settings.py里面修改:

# Obey robots.txt rules
ROBOTSTXT_OBEY = False

——现在执行一下,就发现有数据输出了:

>scrapy crawl baidu_spider --nolog
['百度一下,你就知道']

9、如果我们在爬虫文件中不是print出来,而是把这个抓取到并存在对象里面的数据扔给pipelines.py处理的话,那么可以用yield xxx实现。yield就是把什么东西输送给pipelines.py的,如下。

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

——比如,我们现在把item传给pipelines.py处理了,我们看一下这个文件的默认类,这个类有三个参数,其中第二个参数item就是从爬虫文件yield过来的对象,我们的数据都在里面,当然,我们可以用如下的方式把它里面的内容打印出来。

# -*- coding: utf-8 -*-

class Test1Pipeline(object):
    def process_item(self, item, spider):
        print(item['title'])
        return item

——执行了一下,发现没有任何输出,那是因为Scrapy项目默认是不开启pipelines.py的处理的,我们仍然需要在settings.py里面开启,直接把注释去掉即可,当然需要注意一下,要处理的类是不是我们代码写在里面的那个类,后面的数字代表顺序,这个后面再说:

ITEM_PIPELINES = {
   'test1.pipelines.Test1Pipeline': 300,
}

10、这里面需要注意一下命名规则。主要是对爬虫的命名最好不要添加Spider后缀,因为如下,那么爬虫类会自动加这个后缀。
这里写图片描述

11、如果用到MySQL数据库的话,还需要安装python和MySQL连接的包。这里面如果直接安装mysql-python或者MySQLdb的话,都会报错。换成PyMySQL包即可,用谁不是用呢。

12、远程连接MySQL的时候可能会出现not allowed to connect to this server之类的提示。修改访问权限即可。别忘记重启MySQL服务,不然不生效,还是连接不上。
这里写图片描述

13、现在分析提取图片等,需要用到另一个库requests,所以如果需要的话,还需要安装pip install requests

14、图片处理的PIL库,用pip安装的时候,名字不是PIL而是Pillow,所以需要:

pip install Pillow

然后就可以使用from PIL import Image了。

15、如果我们是部署在服务器上,并且想定时执行的话,window server里面可以通过任务计划来实现,但最好借助一个bat脚本来。同样的在Linux服务器上是通过crontab来实现,也可以借助.sh脚本,但如果你觉得太麻烦的话,你可以直接把所有的脚本直接写在crontab里面,比如:

0 */3 * * * cd /home/scrapyproject && /usr/local/bin/scrapy crawl xxx

猜你喜欢

转载自blog.csdn.net/wsb200514/article/details/77366336