Scrapy 的 Spider 的编写

来源:互联网 发布:自动化控制软件 编辑:程序博客网 时间:2024/05/21 20:26

当然,我们也可以自己写 .py 文件,不过,下面我们要介绍使用 Scrapy 的模板来生成爬虫文件的方法。

在 iTerm2 中输入:

scrapy genspider iqianyue http://iqianyue.com/

这里写图片描述

从上图中,我们可以看到,默认,使用模板 “basic” 创建了 spider “iqianyue”,程序在 spiders 文件夹下就生成了模板文件:

# -*- coding: utf-8 -*-import scrapyclass IqianyueSpider(scrapy.Spider):    name = "iqianyue"    allowed_domains = ["http://iqianyue.com/"]    start_urls = ['http://http://iqianyue.com//']    def parse(self, response):        pass

下面,我们对爬虫的文件修改如下:

# -*- coding: utf-8 -*-import scrapyfrom douban.items import MyFirstItemclass IqianyueSpider(scrapy.Spider):    name = "iqianyue"    allowed_domains = ["http://iqianyue.com/"]    start_urls = ['http://www.iqianyue.com/articles/423525e6',                  'http://www.iqianyue.com/articles/43c364c8',                  'http://www.iqianyue.com/articles/3601e6c2']    def parse(self, response):        item = MyFirstItem()        item["urlname"] = response.xpath("/html/head/title/text()")        print(item["urlname"])

同时,对 items.py 文件添加:

class MyFirstItem(scrapy.Item):    urlname = scrapy.Field()    urlkey = scrapy.Field()    urlcr = scrapy.Field()    urladdr = scrapy.Field()

然后执行命令:

scrapy crawl iqianyue --nolog

说明:crawl 就是开始爬取的意思,“iqianyue” 是 IqianyueSpider 中 name 属性的值。

这里写图片描述


下面,我们回答一个问题:为什么定义了 start_urls 属性,就默认定义了起始的网址呢?
我们看一看 scrapy.Spider 这个类的源代码就知道了。

这里写图片描述

下面我们就知道如何重写这个方法了,示例代码如下:

# -*- coding: utf-8 -*-import scrapyfrom douban.items import MyFirstItemclass IqianyueSpider(scrapy.Spider):    name = "iqianyue"    allowed_domains = ["http://iqianyue.com/"]    start_urls = ['http://www.iqianyue.com/articles/423525e6',                  'http://www.iqianyue.com/articles/43c364c8',                  'http://www.iqianyue.com/articles/3601e6c2']    # 第 1 步:定义了新的属性    custom_urls = ("https://www.jd.com/",                  "http://www.sina.com.cn/",                  "http://www.163.com/")    # 第 2 步:重写了 start_requests() 方法    def start_requests(self):        # 在该方法中将起始网址设置从新属性 url2 中读取        for url in self.custom_urls:            # 第 3 步:调用了默认的 make_requests_from_url()            # 方法生成了具体请求,并通过 yield 返回            yield self.make_requests_from_url(url)    def parse(self, response):        item = MyFirstItem()        item["urlname"] = response.xpath("/html/head/title/text()")        print(item["urlname"])

再执行一遍,就可以看到,我们的爬虫,从我们自定义的 “custom_urls” 这些链接的集合开始爬取数据。

这里写图片描述