您的位置:首页 > 其它

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

2017-08-18 15:32 891 查看
下载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[/code] 
发现报错了,貌似是缺少一个
win32api
模块:



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

>pip install pypiwin32


安装好之后再运行“:

>scrapy fetch http://www.baidu.com[/code] 
这回没有报错了,不仅返回了内容,而且还输出了整个执行过程:



如果我们只想看到内容,不想输出执行的过程(也叫日志),加个
--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/>[/code] 
——如果非要爬取,那就是不遵守协议了,不遵守的话,在
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Scrapy 爬虫