当然,我们也可以自己写 .py 文件,不过,下面我们要介绍使用 Scrapy 的模板来生成爬虫文件的方法。
在 iTerm2 中输入:
scrapy genspider iqianyue http://iqianyue.com/
从上图中,我们可以看到,默认,使用模板 “basic” 创建了 spider “iqianyue”,程序在 spiders 文件夹下就生成了模板文件:
# -*- coding: utf-8 -*-
import scrapy
class 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 scrapy
from douban.items import MyFirstItem
class 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 scrapy
from douban.items import MyFirstItem
class 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” 这些链接的集合开始爬取数据。