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)

 

posted on 2018-02-02 16:41  paulversion  阅读(156)  评论(0编辑  收藏  举报