创建项目
scrapy startproject 项目名称
模板创建
scrapy genspider -t crawl 模板名称 域名
CrawlSpider继承于Spider类,除了继承过来的属性外(name、allow_domains),还提供了新的属性和方法:
LinkExtractors
class scrapy.linkextractors.LinkExtractor
每个LinkExtractor有唯一的公共方法是 extract_links(),它接收一个 Response 对象,并返回一个 scrapy.link.Link 对象。
Link Extractors要实例化一次,并且 extract_links 方法会根据不同的 response 调用多次提取链接。
主要参数:
allow:满足括号中“正则表达式”的值会被提取,如果为空,则全部匹配。
deny:与这个正则表达式(或正则表达式列表)不匹配的URL一定不提取。
allow_domains:会被提取的链接的domains。
deny_domains:一定不会被提取链接的domains。
restrict_xpaths:使用xpath表达式,和allow共同作用链接
rules
rules包含了一个或多个连接对象,每个rule对爬取网站的规则做了特定的操作
rles中的主要参数link_extractor:是一个Link Extractor对象,用于定义需要提取的链接。
callback: 从link_extractor中每获取到链接时,参数所指定的值作为回调函数,该回调函数接受一个response作为其第一个参数。
注意:当编写爬虫规则时,避免使用parse作为回调函数。由于CrawlSpider使用
parse方法来实现其逻辑,如果覆盖了 parse方法,crawl spider将会运行失败。
follow:是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否
需要跟进。 如果callback为None,follow 默认设置为True ,否则默认为False。
案例
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
class DemoSpider(CrawlSpider):
name = 'demo'
allowed_domains = ['foods1.com']
#初始url
start_urls = ['http://www.foods1.com/sort?sort=AAA&st=product&page=1']
rules = (
获取下一页链接
Rule(LinkExtractor(restrict_xpaths=u"//a[text()='»']"), callback='parse_item', follow=True),
获取详情页链接
Rule(LinkExtractor(restrict_xpaths="//div[@class='bt_zi']/a"), callback='parse_info', follow=True),
)
def parse_item(self, response):
title=response.xpath("//div[@class='bt_zi']/a/text()").extract().extract()#提取目标数据
for x in title:
print "--------------",x(Python2中输入括号会变成uncode编码)
def parse_info(self,response):
name=response.xpath("//div[@class='name_bt']/text()").extract()[0]
print name