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