Scrapy安装
在Windows cmd中输入命令:
pip install scrapy
就会自动下载安装Scrapy。等待安装完成就能使用。也可以在cmd中输入以下命令,来查看是否安装成功:
scrapy -h
这个命令将会列出可用的若干命令,主要包括:
startproject:创建一个新项目
genspider:根据模版生成一个新爬虫
crawl:执行爬虫
shell:启动交互式抓取控制台
方法
创建项目
必须创建一个新的Scrapy项目。具体方法:
进入打算存储代码的目录中,运行以下命令:
scrapy startproject project_name
其中,project_name可以替换成任何其他名字,作为项目的名称。这里,我们使用garnet作为项目的名字,则上面的命令则会创建garnet目录(文件夹),结构如下:
garnet/
scrapy.cfg
garnet/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
各文件的作用如下:
scrapy.cfg
项目的配置文件
garnet/
项目的python模块,之后将在此加入新的代码
garnet/items.py
项目中的item文件,该文件定义了待抓取域的模型
garnet/pipelines.py
项目中的pipelines文件,处理要抓取的域
garnet/settings.py
项目的设置文件,如用户代理,爬取延时等
garnet/spiders/
放置spider代码的目录
定义模型(Item)
Item是保存爬取到的数据的容器。通过创建一个scrapy.Item
,并使用scrapy.Field
的类属性,来定义一个Item。例如,我们需要从网站获取标题和URL:
import scrapy
class GarnetItem(scrapy.Item):
url = scrapy.Field()
创建爬虫
创建一个爬虫,需要继承scrapy.Spider
类
import scrapy
class GarnetSpider(scrapy.Spider):
name = 'pc426'
start_urls = ['http://www.pc426.com/']# 可以拥有多个起始URL,是一个list
allowed_domains = ['pc426.com']
def parse_item(self,response):
pass
其中:
name
定义爬虫的名字,该名字必须是唯一的;
start_url
定义爬虫起始的URL列表;
allowed_domains
定义了可爬取的域名列表,如果没有定义该属性,则表示可以爬取任何域名
parse_item()
是spider的一个方法,被调用时每个初始URL下载完后生成的response作为参数传递给该函数。该方法负责解析返回的数据。
或者使用genspider命令:
scrapy genspider pc426 www.pc426.com --template=crawl
其中,pc426为模版名。运行该命令后,与上面类似的代码就会生成在garnet/spiders/pc426.py
中自动生成。
测试爬虫
scrapy crawl pc426
则会启动名为pc426
的爬虫。
过程:
1.Scrapy为Spider的
start_urls
属性中的每个URL创建了scrapy.Request
对象,并将parse_item
方法作为回调函数(callback)赋值给了Request。
2.Request对象经过调度,执行生成scrapy.http.Response
对象并送回给spiderparse_item()
方法。
提取Item
Selectors选择器
Scrapy使用了一种基于 XPath 和 CSS 表达式机制: Scrapy Selectors。
Selector有四个基本的方法:
xpath()
: 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。
css()
: 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.
extract()
: 序列化该节点为unicode字符串并返回list。
re()
: 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。
在Shell中使用Selector选择器
进入项目的根目录,执行下列命令来启动shell,将会进入IPython:
scrapy shell "http://www.pc426.com/"
shell输出如下:
载入shell后,将会得到一个response
变量。输入:
response.body
得到response的内容;
response.header
得到response的头信息;
response.selector
得到一个可用于查询返回数据的selector(选择器)。
该选择器包含的主要方法有:
response.xpath()
和response.css()
,等价于response.selector.xpath()
与response.selector.css()
。
使用item
Item对象是自定义的python字典。可以使用标准的字典语法来获取到其每个字段的值(字段即是我们之前在items.py
用Field赋值的属性)。
item = MyItem()
item['url'] = 'example string'
综合
一般来说,Spider将会将爬取到的数据以 Item 对象返回。所以为了将爬取的数据返回,我们最终的代码将是(garnet/spiders/pc426.py
中的内容):
import scrapy
from garnet.items import GarnetItem
class Pc426Spider(scrapy.Spider):
name = 'pc426'
start_urls = ['http://www.pc426.com/']# 可以拥有多个起始URL,是一个list
allowed_domains = ['pc426.com']
def parse_item(self,response):
for sel in response.xpath('//ul/li/a/@href').extract():
item() = GarnetItem()
item['url'] = sel
保存爬取到的数据
scrapy crawl dmoz -o items.json
该命令将采用 JSON 格式对爬取的数据进行序列化,生成items.json
文件。