1.安装scrapy
# 首先更新pip组件
pip install --upgrade pip
# 安装scrapy包
pip install scrapy
2.创建scrapy项目
创建项目
scrapy startproject [项目名]
此命令会根据scrapy的模板创建一个爬虫项目
创建爬虫模块
scrapy genspider [模块名] [目标网站]
执行次命令需要先进入刚刚创建的爬虫项目中
3.编写并配置爬虫
目标网站内容分析
爬取 http://quotes.toscrape.com/ 网站的quote内容
1.分析HTML标签结构
分析的目的是找到如何才能唯一的找到目标内容的XPath
2.使用chrome插件-XPath Helper进行分析
安装插件后需要重新启动浏览器才能生效!
爬虫模块
在执行 scrapy genspider [模块名] [目标网站] 命令后生成的爬虫模块文件中编写相关的内容
生成爬虫模块示例
scrapy genspider quote quotes.toscrape.com
编写quote.py模块
class QuoteSpider(scrapy.Spider):
# 爬虫名称
name = 'quote'
# 允许访问的域,除了该域的其他域将会被自动忽略
allowed_domains = ['quotes.toscrape.com']
# 目标url列表
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
# 使用xpath指定要爬取的dom节点内容
node_list = response.xpath("//div[@class='quote']")
# 遍历dom节点内容来取出目标数据
for node in node_list:
# 首先建立相应Item对象,在items中配置
quote_item = QuoteItem()
# 在node节点中进一步获取属性内容
content = node.xpath("/span[@class='text']/text()").extract()
auth = node.xpath("/span/small/text()").extract()
# 向对象中添加属性
quote_item['content'] = content[0]
quote_item['auth'] = auth[0]
yield quote_item
items.py
items文件对应要获取数据的实体类,类似于java中的数据库映射对象
可以通过scrapy.Field()方法实现属性的自动映射,前提是对应的爬虫返回的属性字段要相同
示例
class Quote(scrapy.Item):
content = scrapy.Field()
auth = scrapy.Field()
pipelines模块配置
通过爬虫模块获取的数据会自动发送到pipelines中相应的Pipeline中
自定义一个Pipeline
# 由于要写入json数据,先导入json模块
import json
class QuotePipeline(object):
# 初始化方法
def __init__(self):
self.f = open("quote_pipline.json", "w") # 初始化创建一个json文件
# 处理Item的方法
def process_item(self, item, spider):
# item的字典数据转换成json数据并写入文件中
content = json.dumps(dict(item), ensure_ascii= False) + ", \n"
self.f.write(content)
return item
# 处理完成后的方法
def close_spider(self, spider):
self.f.close
在settings.py配置文件中注册自定义的Pipeline
ITEM_PIPELINES = {
'Test.pipelines.QuotePipeline': 300,
}
Test是当前的项目名
300表示优先级,可以定义多个pipeline根据优先级进行顺序处理(类似责任链),数值越小的进行优先处理
4.启动爬虫
启动爬虫需要进入到项目目录下,执行命令
查看当前的爬虫模块
此命令会列出当前可执行的爬虫
scrapy list
执行启动命令
crawl后面是爬虫的名称,-o表示输出的文件名
scrapy crawl quote -o quote.json
查看当前目录下的quote.json文件
获取成功!