Scrapy

scrapy_Spider

2019-07-29  本文已影响0人  叶扬风起

话不多说,撸它

1. 创建项目

scrapy startproject project

2. 创建Spider

cd projiect
scrapy genspider books book.toscrape.com

3. 运行爬虫

scrapy crawl books 

4. spider文件

# -*- coding: utf-8 -*-
import scrapy


class QuotesSpider(scrapy.Spider):
    #name:它是每个项目唯一的名字,用来区分不同的Spider
    name = 'books'
    #它是允许爬取的域名,如果初始或后序的请求链接不是这个域名下的,请求链接会被过滤掉
    allowed_domains = ['book.toscrape.com']
    #它包含了Spider在启动时爬取的url列表,初始请求是由它来定义的
    start_urls = ['http://book.toscrape.com/']
    '''Spider的一个方法,默认情况下,被调用时 start_urls 里面的链接构成的请求完
    成下载执行后,返回的响应就会作为唯一的参数传递给这个函数 。 该方法负责解析返回的响
    应、提取数据或者进一步生成要处理的请求。'''
    def parse(self, response):
        # 提取数据
        # 每一本书的信息是在<article class="product_pod">中,我们使用
        # css()方法找到所有这样的article 元素,并依次迭代
        for book in response.css('article.product_pod'):
            name = book.xpath('./h3/a/@title').extract_first()
            price = book.css('p.price_color::text').extract_first()
            yield {
            'name': name,
            'price': price,
            }
        next_url = response.css('ul.pager li.next a::attr(href)').extract_first()
        if next_url:
            # 如果找到下一页的url,得到绝对路径,构造新的Request 对象
            next_url = response.urljoin(next_url)
            yield scrapy.Request(next_url, callback=self.parse)
1). 覆盖基类Spider的start_requests方法

在某些场景下使用这种方式更加灵活,例如有时想为Request添加特定的HTTP请求头部,或想为Request指定特定的页面解析函数。

import scrapy


class BooksSpider(scrapy.Spider):
    name = 'books'
    allowed_domains = ['book.toscrape.com']

    # 实现start_requests 方法, 替代start_urls类属性
    def start_requests(self):
        yield scrapy.Request('http://books.toscrape.com/',
                                  callback=self.parse_book,
                                  headers={'User-Agent': 'Mozilla/5.0'},
                                  dont_filter=True)
    
    # 改用parse_book 作为回调函数
    def parse_book(self, response):
        pass

2). 实现页面解析函数

上一篇 下一篇

猜你喜欢

热点阅读