简要流程:
•startproject:创建一个新项目:
•genspider:根据模板生成一个新爬虫:
•crawl:执行爬虫:
•shell:启动交互式抓取控制台。
一.启动项目:
生成文件结构后
• items .py: 该文件定义了待抓取域的模型。
• settings . py: 该文件定义了一些设置, 如用户代理、爬取延时等。
• spiders/: 该目录存储实际的爬虫代码。
二.定义模型(定义抓取数据域):
# -*- coding: utf-8 -*-
import scrapy
class ExampleItem(scrapy.Item):
name = scrapy.Field()
population = scrapy.Field()
三.创建爬虫:
CMD输入以下命令:
$ scrapy genspider country example.webscraping.com --template=crawl
自动在spider文件夹下生成爬虫模板
# -*- coding: utf-8 -*-
import scrapy
from scrapy.contrib.linkextractors import LinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from example.items import ExampleItem
class CountrySpider(CrawlSpider):
name = 'country'
allowed_domains = ['example.webscraping.com']
start_urls = ['http://example.webscraping.com/']
rules = (
Rule(LinkExtractor(allow='/index/', deny='/user/'), follow=True),
Rule(LinkExtractor(allow='/view/', deny='/user/'), callback='parse_item')
)
def parse_item(self, response):
item = ExampleItem()
item['name'] = response.css('tr#places_country__row td.w2p_fw::text').extract()
item['population'] = response.css('tr#places_population__row td.w2p_fw::text').extract()
return item
• name : 该属性为定义爬虫名称的字符串。
• s t a r t u r l s : 该属性定义了爬虫起始URL 列表。不过, s t a r t u r l s的默认值与我们想要的不一样, 在example.webscraping .com域名之前多了WWW 前缀。
• allowed domains : 该属性定义了可以爬取的域名列表。如果没有定义该属性, 则表示可以爬取任何域名。
• ru l e s : 该属性为一个正则表达式集合, 用于告知爬虫需要跟踪哪些链接。
优化设置
在example/settings.py中修改参数代码
CONCURRENT_REQUESTS_PER_DOMAIN=1 #设置并发数,同时只能对1个网址进行发送请求
DOWNLOAD_DELAY=5 #设置延迟5秒
测试爬虫:
$scrapy crawl country -s LOG_LEVEL=ERROR
使用shell命令抓取数据域
使用shell命令行测试css抓取器的结果
$scrapy shell http://example.webscraping.com/view/United-Kingdom-239
进入shell模式:
in[1]:response.url
in[2]:response.status
in[3]:response.css('tr#place_country_row td.w2p_fw::text')
in[4]:name_css='tr#place_country_row td.w2p_fw::text'
in[5]:response.css(namecss).extract()
测试完成后,修改country.py中的parse_item方法
def parse_item(self, response):
item = ExampleItem()
item['name'] = response.css('tr#places_country__row td.w2p_fw::text').extract()
item['population'] = response.css('tr#places_population__row td.w2p_fw::text').extract()
return item
四.输出结果:
$scrapy crawl country --output=countries.csv -s LOG_LEVEL=INFO
五.暂停和终止爬虫:
$scrapy crawl country -s LOG_LEVEL=DEBUG -s JOBDIR=crawls/country
运行命令后,按ctrl+c等待爬虫停止。
下次重启后,同样运行该条命令,继续爬取。*JOBDIR参数设置保存爬虫状态的文件夹,不同爬虫的状态要保存在不同文件夹内。
注意点和坑:
会碰到import item类会报错,找不到类
方法是