python scrapy
scrapy的安装 pip install Scrapy
scrapy 常用命令
scrapy提供了两种类型的命令。一种必须在Scrapy项目中运行,是针对项目的命令;另外一种则不需要,属于全局命令
全局命令:
startproject 用法 scrapy startproject <project_name>。用于在project_name文件夹下创建一个名为project_name的Scrapy项目 实例scrapy startproject myproject
settings 用法 scrapy settings [options] 在项目中运行时,该命令将会输出项目的设定值,否则输出Scrapy默认设定,示例如下 scrapy settings --get BOT_NAME,scrapy setting --get DOWLOAD_DELAY
runspider scrapy runspider <spider_file.py> 在未创建项目的情况下,运行一个编写好的spider模块。示例如下 scrapy runspider cnblogs_spider.py
shell scrapy shell [url] 用来启动Scrapy shell,url为可选 示例如 scrapy shell http://www.cnblogs.com/paulversion/
fetch scrapy fetch <url> 使用Scrapy下载器(downloader)下载给定的URL,并将获取到的内容送到标准输出。该命令以spider下载页面的方式获取页面,如果在项目中运行,fetch将会使用项目中spider的属性访问。如果在非项目中运行,则会使用默认Scrapy dowmloader设定
示例如下:
scrapy fetch --nolog "http://www.cnblogs.com/paulversion/"
scrapy fetch --nolog --headers "http://www.cnblogs.com/paulversion/"
view scrapy view<url> 在浏览器中打开给定的URL,并以scrapy spider 获取到的形式展现。scrapy view "http://www.cnblogs.com/paulversion/"
version scrapy version [-] 输出scrapy 版本
bench scrapy bench 用于benchmark 测试,测试scrapy在硬件上的效率。
项目命令:
crawl scrapy crawl <spider> 用来使用spider进行爬取 示例如下 scrapy crawl cnblogs
check scrapy check [-l] <spider> 运行contract检查,示例如下:scrapy check -l
list scrapy list 列出当前项目中所有可用的spider,每行输出一个spider
edit scrapy edit <spider> 使用设定的编辑器编辑给定的spider。该命令仅仅是提供一个快捷方式,开发者可以自由选择其他工具或者IDE来编写调试spider scrapy edit cnblogs
parse scrapy parse <url> [options] 获取给定的URL并使用相应的spider分析处理。如果提供--callback选项
genspider scrapy genspider[-t template]<name><domain>。可以在当前项目中创建spider。
deploy scrapy deploy [<target:projet>|-l<target>|-L] 将项目部署到Scrapyd服务
定义Item
将爬取的数据以结构化的方式保存。scrapy提供Item类来满足这样的需求。在使用scrapy新建的项目中,有一个item.py文件,用来定义存储数据的Item类。这个类需要继承scrapy.Item
代码如下
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
#定义item
class CnblogspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
url = scrapy.Field()
time = scrapy.Field()
title = scrapy.Field()
#content = scrapy.Field()
创建 CnblogspiderItem对象
item = CnblogspiderItem(title="Python爬虫",content='爬虫开发')
获取字段的值
print item['title']
print item['conetent']
设置字段的值
item['title'] = 'paulversion'
获取所有的key或值
item.keys() 获取所有的键 item.items()获取所有的值
item 复制
item2 = CnblogspiderItem(item)
item3 = item.copy()
dict与item的转化
dict_item = dict(item)
item = CnblogspiderItem({'title':'爬虫','content':'开发'})
翻页
翻页的功能的实现,本质上是构造Request并提交给Scrapy引擎的过程
# coding:utf-8
import scrapy
from cnblogSpider.items import CnblogspiderItem
from scrapy import Selector
class CnblogsSpider(scrapy.Spider):
name = 'cnblogs' # 爬虫的名称
allowed_domains = ["cnblogs.com"] # 允许的域名
start_urls = [
'http://www.cnblogs.com/qiyeboy/default.html?page=1'
]
# 网页解析地址
def parse(self, response):
# 实现网页的解析
# 首先抽取所有的文章
papers = response.xpath(".//*[@class='day']")
# 从每篇文章中抽取数据
for paper in papers:
url = paper.xpath(".//*[@class='postTitle']/a/@href").extract()[0]
title = paper.xpath(".//*[@class='postTitle']/a/text()").extract()[0]
time = paper.xpath(".//*[@class='dayTitle']/a/text()").extract()[0]
content = paper.xpath(".//*[@class='postCon']/div/text()").extract()[0]
item = CnblogspiderItem(url=url, title=title, time=time)
yield item
next_page = Selector(response).re(u'<a href = "(\S*)">下一页</a>')
if next_page:
yield scrapy.Request(url=next_page[0], callback=self.parse)#实现翻页的功能
构建Item Pipeline
当Item在Spider中被收集之后,它将会被传递到Item Pipeline
Item Pipeline 主要有以下典型应用:
1:清理HTML数据
2:验证爬取的数据的合法性,检查Item是否包含某些字段
3:查重并丢弃
4:将爬取结果保存到文件或者数据库中
每次创建一个项目在项目的pipelines.py文件 代码如下
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import json
from scrapy.exceptions import DropItem
class CnblogspiderPipeline(object):
def __init__(self):
self.file = open('paper.json', 'wb')
def process_item(self, item, spider):
if item['title']:
line = json.dumps(dict(item)) + "\n"
self.file.write(line)
return item
else:
raise DropItem("Missing title in %s" %item)